WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Перелинковка статей в 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
  • Теперь все аргументы передаются в первом параметре функции, в виде массива или строки.
55 комментов
Вопросы 2 Все
  • Виталий cайт: fichora.com

    Подскажите, а если мне нужна кольцевая перелинковка сайта, чтоб каждая статья ссылалась на 5 статей. Как сделать чтоб выводились предыдущие записи не из категории, а со всего блога? И еще. Если будет реализован первый вопрос, тот как сделать, чтобы последние 5 статей, которые не могут вывести 5 предыдущих, потому как их нет, ссылались на предыдущие записи (сколько будет) и на новые публикации (Чтоб в итоге получилось 5 ссылок). То есть, 5-я с заду статья будет ссылаться на 4 предыдущих записи и на одну свежую, а 1-я с заду - на 5 свежих публикаций.
    Объясните, пожалуйста на пальцах, как такое реализовать.

    Ответить8.1 лет назад #
  • Виталий cайт: fichora.com

    Я в шоке! )) Прошелся по блогу и оказывается у вас уже такое есть! Продолжайте в том же духе! ))

    Ответить8.1 лет назад #
    • Kama7375

      Ага, все именно так и реализовано!

      Ответить8.1 лет назад #
      • Виталий cайт: fichora.com

        Видимо потребности у блогеров одинаковы)) А главное я около месяца думал как реализовать в полном смысле кольцевую перелинковку и только в комменте выше как-то само придумалось. А оказывается уже и придумали и реализовали mosking

        Ответить8.1 лет назад #
  • eavasi cайт: www.autotruk.ru

    Опять спасибо автору. Эта функция позволит избавиться от громоздкого плагина, работающего с метками (не помню как он называется). Я его, собственно, ради перелинковки и держал, а вот теперь можно отказаться.

    Ответить8.1 лет назад #
  • nike

    Спасибо за полезную функцию, благодаря ей у меня получилось то, что не смог сделать в предыдущей.
    Только снова есть один вопросик...
    Вставляю в нужное место

    <?php echo kama_previous_posts_from_tax(5, '{a}Скачать {title}{/a} - {date:j.M.Y}', 1); ?>

    Всё отлично, но хотелось бы убрать дату.
    Убираю - {date:j.M.Y}, и вообще ничего не выводится.
    Подскажите пожалуйста решение smile

    Ответить8.1 лет назад #
    • Kama7375

      Попробуйте 64-ю строчку удалить (запятую тоже удалите на следующей строчке):

      $date_m[0]   => apply_filters('the_time', mysql2date($date_m[1], $pst->post_date))  
      				 ,

      Отпишите что получилось.

      Ответить8.1 лет назад #
      • nike

        Сделал как посоветовали, теперь вместо даты выводится Скачать название файла - {date:j.M.Y}

        Ответить8.1 лет назад #
    • Kama7375

      Изменил код функции немного, теперь такой проблемы возникнуть не должно!

      Ответить8.1 лет назад #
  • nike

    Ступил блин........ Надо же было удалить и - {date:j.M.Y}
    Всё отлично сейчас.
    Спасибо за помощь.

    Ответить8.1 лет назад #
  • ibigcost cайт: bigcost.ru

    Пришел на этот блог с twitter, почитал 1 статью... и блог меня поглотил и понес по всем своим статьям...
    Хорошие, полезные и качественные статьи. Спасибо Kama!

    Ответить8.1 лет назад #
    • Kama7375

      И вам спасибо за такие поэтические, добрые отзывы! smile

      Ответить8.1 лет назад #
  • @ Frost cайт: frostmusic.ru
    1. использую ваш набор смайликов из квипа. плагин сразу заработал нормально, но вот проблема. настроить его по-другому я не могу.
      он не добавляет и не убирает смайлики как я хочу.
    2. объясните мне пожалуйста (тупому) зачем нужна кольцевая перелинковка?
    3. вот у вас в конце статьи такая красивая табличка. это результат работы этой функции?

    ткнул галочку (получать комментарии на почту). очень жду ответ. спасибо.

    Ответить8 лет назад #
    • Kama7375

      он не добавляет и не убирает смайлики как я хочу.

      А как вы хотите?

      Кольцевая перелинковка нужна для удобства (правда, не всегда это действительно удобно) и для того, чтобы на каждую страницу ссылались другие страницы (чтобы все это было равномерно между статьями).

      в конце статьи такая красивая табличка

      Про какую табличку вы говорите? Под постами у меня "предыдущие записи" - это результат этой функции.

      Ответить8 лет назад #
  • @ Frost cайт: frostmusic.ru

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

    и, пожалуйста, скажите, куда вставлять код вывода в редакторе? в какую страницу и в какое место.

    со смайликами разобрался. я тыкал в те, которые уже были выбраны. это моя ошибка.

    Ответить8 лет назад #
    • @ Frost cайт: frostmusic.ru

      табличка это всмысле "предыдущие по меткам" и "предыдущие записи".

      Ответить8 лет назад #
  • tiaurus

    А как сделать вывод похожих записей по тегам? Вставляю

    <?php echo kama_previous_posts_from_tax(3, '{a}{title}{/a}', 1, 'category', 'post'); ?>
    <?php echo kama_previous_posts_from_tax(3, '{a}{title}{/a}', 1, 'post_tag', 'post'); ?>

    , а функция выводит два раза три записи 4из категории.

    Ответить8 лет назад #
    • Kama7375

      Если ввести для этой функции таксономию post_tag, то функция выберет первый попавшийся тег (метку) и выведет предыдущие посты с такой же меткой. Т.е. если пост имеет несколько меток, то учитываться будет всего одна (последняя по ID).

      А как сделать вывод похожих записей по тегам?

      Что конкретно вы имеете ввиду?

      Не совсем понятно, что у вас получается и что в итоге нужно.

      Ответить8 лет назад #
  • Сергей cайт: strojka21veka.ru

    Спасибо, и за хлебные крошки тоже! Особенно спасибо, что нет скрытых ссылок, как у некоторых "доброжелателей"))

    Ответить7.7 лет назад #
Здравствуйте, !     Войти . Зарегистрироваться