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
  • Теперь все аргументы передаются в первом параметре функции, в виде массива или строки.
56 комментов
Вопросы 3 Все
  • @ moto irongamers.ru/post-group/texnika-bojcov-...

    Добрый день, как одновременно чтобы показывалась перелинковка и стандартных записей wordpress и записей групп плагина wp recall?

    у групп:

    'tax'       => 'groups', // таксономия. пр. category
    'post_type' => 'post-group',     // тип записи. пр. post

    Если в функции поменять на группы, выводится похожие записи на страницах групп, но не выводятся на стандартных страницах записей и на оборот.

    Сам вывод в шаблоне работает так:

    h3 Это может пригодиться h3
    <?php echo kama_previous_posts_from_tax('post_num=10'); ?>

    В группах выводит просто
    h3 Это может пригодиться h3, если в функции стоит вывод стандартных записей wordpress и наоборот, если стоит вывод записей для групп.

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