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 Все
  • ProSEOBlogger

    Вопрос. Мне нужно разместить статьи для перелинковки в сайдбаре, а не после статьи. Т.е. вызов функции будет вне цикла вывода основного контента статьи. Я спрашиваю потому, что пользуюсь сейчас вариантом, который зависит от цикла контента (как оказалось). По-другому, он просто не может извлечь ID категории и вывести статьи (вариант от Dimox).

    Ты написал, что можно разместить вызов "в любом месте шаблона". Это в прямом смысле "в любом" (хоть в футере или хедере)?

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

      Ну да в прямом смысле - в любом месте шаблона. Главное, чтобы переменная $post не нарушалась. Т.е. в сайдбаре она должна относиться к текущему посту. Такой глюк встречается частенько в темах.

      Ответить7.7 лет назад #
  • comoc

    Подскажите, пожалуйста, есть ли возможность (плагин/функция) перелинковки статей с одинаковой иллюстрацией в двух категориях. Т.е. желательно вывести в категории1 под статьей с одним изображением и описанием к нему список статей из категории2, в которых вставлено тоже самое изображение (как единственная или одна из нескольких иллюстраций)

    Ответить7.6 лет назад #
  • Bo

    Прив.
    Вопрос, как внедрить в этот код не только вывод заголовка, но и анонс небольшой:

    (типа <?php the_content_rss('', TRUE, '', 20); ?>)

    , да и с превьюшкой (тумбой) из поста?

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

      Подкорректировать код в части // Формировка вывода. Для тумбов из поста можете попробовать мой плагин.

      Расписывать все по полочкам, сорри, не буду!

      Ответить7.5 лет назад #
  • Светлана cайт: svoronina.ru

    Доброго времени! У вас в сайдбаре есть "рекомендую посетить". Как оно туда попало? smile blush Я хочу вывести таким же образом список статей, которые могут быть наиболее полезными посетителю. Подскажите, как это сделать? Не список последних, популярных, или самых обсуждаемых, а именно тех, которые я хотела бы рекомендовать. новичок я, html не знаю... blush

    Ответить7.5 лет назад #
  • @ Евгений cайт: mes-blog.com.ua

    Огромное спасибо, помогло! smile

    Ответить7.2 лет назад #
  • mozg cайт: www.webscs.ru

    Очень полезная фишка, но могу вам дать еще пищи для модернизации и развития даной процедуры.

    Для СЕО проектов бывает очень полезно делать
    а) рандомный вывод ссылок
    б) рандомный анкор (т.е. для одной оптимизированный статьи по НЧ запросы, может соответствовать несколько низкочастотников, было бы очень полезно задавать 1 - 3 анкора, и выводить их рандомно вашей функцией)

    Ответить7.2 лет назад #
  • Виталий

    Здравствуйте
    У меня на сайте перелинковка выполнена рандомным выбором постов из текущей категории
    Это плохой способ?
    Если да то чем именно?
    Спасибо

    Ответить7 лет назад #
  • Юрий cайт: partnerkiwse.ru

    А может Перелинковку делать сразу без каких либо плагинов

    Ответить7 лет назад #
  • Umed

    Кама, может пропишите как вывести анонсы с помощью content_rss ?
    Честно говоря замучился методом тыка искать решение.
    Большое спасибо.

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

      Что именно вас интересует? Что-то я не совсем понял.

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