WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

Перелинковка статей в WordPress (предыдущие записи из категории). Функция 2

Хочу поделиться доработкой своей функции для кольцевой перелинковки статей в WordPress. Первый вариант функции в общем ни чем не уступает этому, разница лишь в том, что с помощью этого варианта функции, вы сможете указать с какой таксономией работать и какой тип записи вас интересует. Прошлая функция работает лишь со стандартными категориями WordPress и постами, т.е. с таксономией category и типом записей post.

Эта функция полностью заменяет прошлую. Толчком для её создания стала просьба одного из читателей этого блога, сделать функцию для кольцевой перелинковки, для кастомных (произвольных) страниц, которые были предусмотренны на сайте. Таксономия так же была созданна новая. Не долго думая я переделал прошлую функцию, изменив там принцип получения таксономии: если раньше категория(и), в которой находится запись, получалась стандартными функциями WordPress, то теперь таксономия к которой относится запись получается прям из Базы Данных, такой подход вроде более логичный и быстрый (не проверял).

Тот кто просил эту функцию даже отблагодарил меня 10-ю условными единицами на мой кошелек WebMoney, что конечно приятно, спс ему, надеюсь он не против, что я выкладываю эту функцию в паблик.

Устанавливается функция как обычно: копируем код в файл темы functions.php а затем в шаблоне, там где нужно вывести ссылки, вызываем функцию с указанием необходимых параметров.

/** Предыдущие записи из рубрики (относительно текущей записи) + кольцевая перелинковка
(можно указывать Таксономию и Тип записи)
----------------------------------------------------------------------------------------
Параметры передаваемые функции (в скобках указано дефолтное значение):
post_num (5) = количество ссылок
format ('') = {date:j.M.Y} - {a}{title}{/a} ({comments})
cache ('') = включить кэш (по умолчанию выключен). Пишем 1, чтобы включить
tax (category) = Таксономия Пример: photos
post_type (post) = Тип записи Пример: photo

Вызываем функцию примерно так (в зависимости от нужного результата):
<?php echo kama_previous_posts_from_tax(5, '{date:j.M.Y} - {a}{title}{/a}', 1); ?>
*/
function kama_previous_posts_from_tax($post_num=5, $format='', $cache='', $tax='category', $post_type='post'){
	global $post, $wpdb;

	$cache_key = (string) md5( __FUNCTION__ . $post->ID );
	$cache_flag = __FUNCTION__;
	if ( $cache && $cache_out = wp_cache_get($cache_key, $cache_flag) )
		return $cache_out;

	$tax_id = "SELECT term_id FROM $wpdb->term_relationships rl LEFT JOIN $wpdb->term_taxonomy tx ON (rl.term_taxonomy_id = tx.term_taxonomy_id) WHERE object_id = {$post->ID} AND tx.taxonomy = '$tax' LIMIT 1";
	$same_join = "SELECT ID, post_title, post_date, comment_count, guid
	FROM $wpdb->posts p
		LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id)
		LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";
	$same_and = "AND tax.term_id = ($tax_id)
		AND tax.taxonomy = '$tax'
		AND p.post_status = 'publish'
		AND p.post_type = '$post_type'
		ORDER BY p.post_date DESC";
	$sql = "$same_join
	WHERE p.post_date < '{$post->post_date}'
		$same_and
	LIMIT $post_num";
	$res = $wpdb->get_results($sql);

	$count_res = count($res);
	// если количество меньше нужного, делаем 2-й запрос (кольцевая перелинковка)
	if ( !$res || $count_res<$post_num ){
		foreach ($res as $id)
			$exclude .= ','.$id->ID;
		$sql = "$same_join
		WHERE p.ID NOT IN ({$post->ID}{$exclude})
			$same_and
		LIMIT ".($post_num-$count_res);
		$res2 = $wpdb->get_results($sql);

		$res = array_merge($res,$res2);
	}

	if(!$res)
		return false;

	// Формировка вывода
	if ($format)
		preg_match ('!\{date:(.*?)\}!', $format, $date_m);
	foreach ($res as $pst){
		$x = ($x == 'li1') ?  'li2' : 'li1';
		$Title = stripslashes($pst->post_title);
		$a = "<a href='". get_permalink($pst->ID) ."' title='{$Title}'>"; //get_permalink($pst->ID) меняем на $pst->guid если настроено поле guid

		if($format){
			$Sformat = strtr($format, array(
				'{title}'     => $Title
				,'{a}'        => $a
				,'{/a}'       => '</a>'
				,'{comments}' => ($pst->comment_count==0) ? '' : $pst->comment_count
			));
			if($date_m)
				$Sformat = str_replace($date_m[0], apply_filters('the_time', mysql2date($date_m[1], $pst->post_date)), $Sformat);
		}
		else
			$Sformat = "$a$Title</a>";

		$out .= "\t<li class='$x'>$Sformat</li>\n";
	}

	if($cache) wp_cache_add($cache_key, $out, $cache_flag);

	return '<ul>'. $out .'</ul>';
}

Параметры, передаваемые функции

  1. post_num - количество ссылок, которые будут выведены. По умолчанию 5.

  2. format - формат выводимых ссылок. По умолчанию "{a}{title}{/a}".

  3. cache - включить кэш. Результат запроса будет кэшироваться. Должен работать стандартный кэш WordPress (обычно кэш включается спец. плагинами), пишет true, чтобы включить. По умолчанию выключено.

  4. tax - таксономия к которой относится запись. По умолчанию category

  5. post_type - тип записей для который будет происходить перелинковка. По умолчанию post.

Несколько примеров использования

  1. Выведем 5 предыдущих ссылок из категории, для обычных записей WordPress:
<?php echo kama_previous_posts_from_tax(); ?>
  1. Выведем 6 предыдущих ссылок (1-й парам.), для записей из таксономии movies (4-й парам.), тип записи которых равен movie (5-й парам.). Так же в формате вывода добавим дату публикации записи (2-й парам.) и включим кэширование результатов (3-й парам.):
<?php echo kama_previous_posts_from_tax(6, '{a}{title}{/a} - {date:j.M.Y}', 1, 'movies', 'movie'); ?>

Спасибо за внимание!

Перелинковка статей в WordPress (предыдущие записи из категории). Функция 2 52 комментария
  • Umed

    Еще раз добрый день.
    Я имел ввиду чтоб под заголовком поста - выводился анонс текста (этого же поста), используя тег content_rss. Я денек помучился методом тыка, но ничего добиться не смог.

    Ответить5.2 лет назад #
  • Андрей

    Здравствуйте. Подскажите, пожалуйста, как встроить в функцию вывод первой картинки из поста в качестве превьюшки. Вот, например, есть такой код для вывода первой картинки поста

    function catch_that_image() {
     global $post, $posts;
     $first_img = '';
     ob_start();
     ob_end_clean();
     $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',$post->post_content, $matches);
     $first_img = $matches [1] [0];
     // no image found display default image instead
     if(empty($first_img)){
      $first_img = "/images/design/netfoto.gif";
     }
     return $first_img;
    }

    Может подскажете, как его встроить в функцию?

    Ответить3.5 года назад #
    • Kama4472
      1. Измените функцию так и разместите её сразу после моей функции:
      function catch_text_image( $text = '' ) {
      	if( ! $text ){
      		global $post;
      		$text = $post->post_content
      	}
      
      	$img_src = '';
      	$output = preg_match('/<img.+src=[\'"]([^\'"]+)[\'"][^>]*>/', $text, $match);
      	$img_src = $match[1];
      
      	if( ! $img_src )
      		$img_src = get_site_url() . "/wp-content/themes/theme_name/images/design/netfoto.gif";
      
      	return $img_src;
      }

      Дефолтную картинку не забудьте поменять

      1. Допишите к моей функции post_content в запрос:
      ... SELECT ID, post_title, post_date, comment_count, guid ...
      // измените на 
      ... SELECT ID, post_title, post_content, post_date, comment_count, guid ...
      1. допишите к моей функции в вывод:
      ... 
      		$src = catch_text_image( $pst->post_content );
      		$img = '<img src="'. $src .'" alt="" title="" />';
      		$out .= "\t<li class='$x'>$img$Sformat</li>\n";
      ...

      Тут $img ваша картинка...

      Ответить3.5 года назад #
      • Андрей

        Огромное спасибо, получилось супер smile В скором времени останется еще разобраться, как все превьюшки заменить на вашу функцию Kama Thumbnail и будет отличная перелинковка + похожие записи 2 в 1 smile

        Ответить3.5 года назад #
  • campusboy1734 cайт: wp-plus.ru

    Не получается прикрутить к выводу произвольные поля sad Кама, помоги, пожалуйста. Не получается найти инфу и знаний не хватает. Хотя бы один пример, как добавить 1 произвольное поле. А там уже по аналогии остальные прикручу. Очень надеюсь на помощь! Спасибо.

    Ответить3.2 года назад #
    • Kama4472

      К какому выводу? В цикле выводятся так с помощью http://wp-kama.ru/function/get_post_meta

      // выводим произвольное поле thumb
      $pole = get_post_meta($post->ID, 'thumb', 1);
      echo $pole
      Ответить3.2 года назад #
      • campusboy1734 cайт: wp-plus.ru

        Недождался я чуток ответа, методом тыка и логика вот такое создал, может пригодится кому. Размещается на странице с карточкой товара. Выводит 4 записи из данной категории с товаром рандомно. Выводятся к этим товаром произвольные поля (цена, размер, артикул).

        <div class="randpost-cat"><div class="randpost-cat-in">
        <b class="newpostindex">Товары из этой категории</b>
        <?php $this_cat = get_the_category($post->ID);
        $posts = get_posts('orderby=rand&numberposts=4&cat=$this_cat'); foreach($posts as $post) { ?>
        <div class="front_content_new"><div class="front-column-start">
        <div class="post_title_front"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php echo get_short_title(27); ?></a></div>
        <div class="front-column-image"><?php if (has_post_thumbnail()) { ?><a href="<?php the_permalink(); ?>">
        <?php the_post_thumbnail('post_thumbnail', array('class' => 'postimg')); ?></a>
        <?php } else { ?><a href="<?php the_permalink() ?>"></a><?php } ?></div>
        <div class="size-front"><?php $sizetovar = get_post_meta($post->ID, 'Размер', true); if ($sizetovar) { ?>
        <?php echo "Размеры (ВхДхШ): $sizetovar"; ?><?php } else { ?>Размер адаптивный<?php } ?></div>
        <div class="price-front"><?php $price = get_post_meta($post->ID, 'Цена', true); if ($price) { ?>
        <?php echo "Цена: $price"; ?><?php } else { ?>Уточнить цену у менеджера<?php } ?></div>
        <div class="front-column-end"><a class="button9" href="<?php the_permalink() ?>">Посмотреть</a></div>
        </div></div>
        <?php } ?>
        </div>
        </div>
        Ответить3.2 года назад #
  • Toperwm cайт: led-obzor.ru

    Подскажите пожалуйста. В статье написано, что "для кольцевой перелинковки, для кастомных (произвольных) страниц".
    Меня интересует кольцевая перелинковка именно страниц (page), а не записей (post).
    Разными способами вызывал показ. Н о работает только для записей, а для страниц (page) не работает.
    Подскажите как сделать правильно для кольцевой перелинковки всех страниц (page)?

    -1
    Ответить2.5 года назад #
  • Александр cайт: www.wayhome.tv
    @

    И вновь... Огромная благодарность за Блог, Тимур! smile
    Все установилось и работает.
    Жалко только, что если не набирается 5 ссылок из под категории, код не берет дополнительные ссылки из категории выше.

    Ответить2.4 года назад #
  • Виталий
    @

    Приветствую, спасибо за хороший код. Мне нужно реализовать просто 1 предыдущю и 1 следующую запись в этом в определенном post-type. И тут что-то не понятно выходит: ссылки на предыдущие записи выводятся правильно - порядку, а вот следующие записи перепрыгивают через одну.
    То есть находясь на странице ЗАПИСЬ-2 одна ссылка на ЗАПИСЬ-1, а вторая на ЗАПИСЬ-4 (а не ЗАПИСЬ-3). В чем может быть дело? Спасибо!

    Ответить2 года назад #
    • campusboy1734 cайт: wp-plus.ru

      Привет. Может такое решение подойдет?

      1
      Ответить2 года назад #
      • Виталий cайт: пр.Кирова135а,кв23
        @

        По идее - это то что мне нужно, но когда нахожусь на последней или первой записи ругается на

        Fatal error: Call to undefined function get_around_post()

        Ответить2 года назад #
        • campusboy1734 cайт: wp-plus.ru

          Даже представить не могу, почему так, так как на странице эта функция же есть. Во всяком случае я вставлял в single.php и ошибок не было, по кругу записи бегали только в путь smile

          Ответить2 года назад #
        • Виталий cайт: пр.Кирова135а,кв23
          @

          Думаю это из-за того что мне нужно выводить записи только с определенной таксономии ((

          Ответить2 года назад #
      • Вера cайт: leds-magazine.ru

        smile Ой, спасибочки, выручили) bravo

        Ответить1.9 года назад #
  • Добрый день, подскажи пожалуйста, как сделать вот такую комбинацию

    Нужно чтоб посты выводились по меткам, но при этом только из категории "фильмы"?

    Если просто задать post_tag тогда выводятся посты по меткам, но туда туда попадают все подряд категории.

    Ответить1.2 года назад #

Здравствуйте, !

Ваш комментарий