WordPress как на ладони
wordpress jino

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

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

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

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

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

/**
 * Предыдущие записи из рубрики (относительно текущей записи) +
 * кольцевая перелинковка (можно указывать таксономию и тип записи)
 *
 * Вызываем функцию так:
 * <?php echo kama_previous_posts_from_tax( array( 'post_num'=>5, 'format'=>'{date:j.M.Y} - {a}{title}{/a}' ); ?>
 * 
 * ver 1.0
 */
function kama_previous_posts_from_tax( $args = array() ){
	global $post, $wpdb;

	// Параметры передаваемые функции
	$args = (object) wp_parse_args( $args, array(
		'post_num'  => 5,          // количество ссылок
		'format'    => '',         // {thumb} {date:j.M.Y} - {a}{title}{/a} ({comments})
		'cache'     => true,       // включить или нет объектное кэширование
		'list_tag'  => 'li',       // тег-обертка каждой ссылки
		'tax'       => 'category', // таксономия. пр. category
		'post_type' => 'post',     // тип записи. пр. post
	) );

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

	$tax_id = $wpdb->prepare( "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 = %d AND tx.taxonomy = %s LIMIT 1", $post->ID, $args->tax );

	$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 = '". esc_sql($args->tax) ."' AND p.post_status = 'publish' AND p.post_type = '". esc_sql($args->post_type) ."' ORDER BY p.post_date DESC";

	$sql = "$same_join WHERE p.post_date < '". esc_sql($post->post_date) ."' $same_and LIMIT ". intval( $args->post_num );

	$res = $wpdb->get_results( $sql );

	$count_res = count( $res );

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

		$res2 = $wpdb->get_results($sql);

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

	if( ! $res )
		return false;

	// Формировка вывода
	if ( $args->format )
		preg_match( '!{date:(.*?)}!', $args->format, $date_m );
	if ( false !== strpos($args->format, '{thumb}') )
		$add_thumb = 1;

	$out = '';
	foreach( $res as $pst ){
		$x = ($x == 'li1') ?  'li2' : 'li1';

		$a = '<a href="'. get_permalink($pst->ID) .'" title="'. esc_attr($pst->post_title) .'">'; //get_permalink($pst->ID) меняем на $pst->guid если настроено поле guid

		if( $args->format ){
			$formated = strtr( $args->format, array(
				'{title}'    => esc_html($pst->post_title),
				'{a}'        => $a,
				'{/a}'       => '</a>',
				'{comments}' => ($pst->comment_count==0) ? '' : $pst->comment_count,
			) );

			// есть дата
			if( $date_m ){
				$formated = str_replace( $date_m[0], apply_filters('the_time', mysql2date($date_m[1], $pst->post_date)), $formated );
			}
			// есть миниатюра
			if( isset($add_thumb) ){
				$formated = str_replace('{thumb}', get_the_post_thumbnail( $pst->ID, 'thumbnail' ), $formated );
			}
		}
		else {
			$formated = $a . esc_html($pst->post_title) .'</a>';
		}

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

	if( $args->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. Выведем 10 предыдущих ссылок из категории, для обычных записей WordPress:

<?php echo kama_previous_posts_from_tax('post_num=10'); ?>

#2. Пример передачи параметров и указания формата

Выведем 6 предыдущих ссылок, для записей из таксономии movies, тип записи которых равен movie. Так же в формате вывода добавим дату публикации записи и миниатюру:

<?php 
echo kama_previous_posts_from_tax( array(
	'post_num'  => 6, 
	'format'    => '{thumb} {a}{title}{/a} - {date:j.M.Y}',
	'tax'       => 'movies',
	'post_type' => 'movie',
);
?>

Весь список параметров и шорткоды для параметра format смотрите в коде функции (в самом начале).

Изменения

Версия 1.0.

  • Добавил шорткод {thumb} в параметр format
  • Теперь все аргументы передаются в первом параметре функции, в виде массива или строки.
Перелинковка статей в WordPress (предыдущие записи из категории). Функция 2 52 комментария
  • Umed

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

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

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

    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.6 года назад #
    • Kama4464
      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.6 года назад #
      • Андрей

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

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

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

    Ответить3.4 года назад #
    • Kama4464

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

      // выводим произвольное поле thumb
      $pole = get_post_meta($post->ID, 'thumb', 1);
      echo $pole
      Ответить3.4 года назад #
      • campusboy1847 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.4 года назад #
  • Toperwm cайт: led-obzor.ru

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

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

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

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

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

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

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

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

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

        Fatal error: Call to undefined function get_around_post()

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

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

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

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

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

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

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

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

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

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

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

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