Взаимное связывание записей в WordPress (предыдущие записи из категории)
В этой статье я расскажу о функции WordPress, которая выводит предыдущие записи из той же категории, к которой принадлежит текущая статья. Эта функция помогает создать взаимное связывание записей.
Что делает эта функция
Одной из особенностей этой функции яв��яется то, что она показывает предыдущие записи из категории текущей записи.
Альтернативную версию этой функции можно найти в интернете, где можно задать таксономию и тип записи, для которого необходимо создать взаимосвязь.
Я также опубликовал аналогичную функцию в комментариях на сайте Dimox.name. Почему "аналогичная"? Потому что эта функция имеет несколько преимуществ:
- Настраиваемый формат вывода — это упрощает интеграцию в любой шаблон.
- Автоопределение категории — не требуется заранее указывать текущую категорию, это упрощает код и делает его доступным для новичков.
- Легкость работы — функция не использует тяжелую функцию WordPress
get_posts()
. - Стиль списка — каждая метка ссылки получает классы
li1
иli2
, что упрощает стилизацию в "зебровом" стиле. - Кэширование — можно включить кэширование. Подробнее об этом ниже.
- Сортировка по дате — записи сортированы по дате, поэтому запись, опубликованная позже, будет отображаться первым.
Как использовать функцию
Вот код, который нужно вставить в файл вашего шаблона functions.php
.
<?php
/**
- Предыдущие записи из категории (относительно текущей записи) + взаимное связывание
- Параметры, передаваемые в функцию. По умолчанию указаны значения в скобках.
- @param int $post_num (5) Количество ссылок.
- @param string $format ('') Формат вывода:
{thumb} {date:j.M.Y} - {a}{title}{/a} ({comments})
. - @param string $cache ('') Включить кэш (по умолчанию отключен). Напишите 1 для включения.
- @param string $list_tag (li) Метка списка.
- @param string $post_type (post) Тип поста, с которым мы работаем.
- @param bool $echo (true) Вывод на экран или возврат для обработки (false).
-
@version 1.1
*/
function kama_previous_posts_from_cat( $args ){
global $post, $wpdb;$args = (object) wp_parse_args( $args, [
'post_num' => 5,
'format' => '',
'cache' => true,
'list_tag' => 'li',
'post_type' => 'post',
'echo' => true,
] );$cache_key = md5( FUNCTION . $post->ID );
$cache_flag = FUNCTION;if( $args->cache && $cache_out = wp_cache_get( $cache_key, $cache_flag ) ){
if( $args->echo ){
return print( $cache_out );
}
return $cache_out;
}$cat = get_the_category( $post->ID );
$cat_id = (int) $cat[0]->term_id;$sql_SELECT = "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 = $wpdb->prepare(
"AND tax.term_id = %s AND tax.taxonomy = 'category' AND p.post_status = 'publish' AND p.post_type = %s",
$cat_id, $args->post_type
);// попытка получить предыдущие посты
$sql = "$sql_SELECT WHERE p.ID < $post->ID $same_AND ORDER BY p.post_date DESC LIMIT " . (int) $args->post_num;$res = $wpdb->get_results( $sql );
$count_res = count( $res );
// если записи меньше, чем нужно, сделать второй запрос
if( ! $res || $count_res < $args->post_num ){
$exclude = array_merge( [ $post->ID ], wp_list_pluck( $res, 'ID' ) );
$exclude = implode( ',', array_map( 'intval', $exclude ) );$post_num = (int) $args->post_num - $count_res; $sql = "$sql_SELECT WHERE p.ID NOT IN ($exclude) AND p.ID != {$post->ID} $same_AND ORDER BY p.post_date DESC LIMIT " . (int) $post_num; $res2 = $wpdb->get_results( $sql ); $res = array_merge( $res, $res2 );
}
if( ! $res ){
return false;
}// вывод
if( $args->format ){
preg_match( '!{date:(.*?)}!', $args->format, $date_m );
}$add_thumb = ( false !== strpos( $args->format, '{thumb}' ) );
$out = $x = '';
foreach( $res as $pst ){
$x = ( $x === 'li1' ) ? 'li2' : 'li1';
$a1 = '';
$a2 = "";if( $args->format ){ $date = apply_filters( 'the_time', mysql2date( $date_m[1], $pst->post_date ) ); $com_count = $pst->comment_count ?: ''; $formatted = strtr( $args->format, [ $date_m[0] => $date, '{title}' => esc_html( $pst->post_title ), '{a}' => $a1, '{/a}' => $a2, '{comments}' => $com_count, ]); // если миниатюра существует if( isset( $add_thumb ) ){ $thumb = get_the_post_thumbnail( $pst->ID, 'thumbnail' ); $formatted = str_replace( '{thumb}', $thumb, $formatted ); } } else{ $formatted = $a1 . esc_html( $pst->post_title ) . $a2; } $out .= apply_filters( 'kama_previous_posts_from_cat__append_out', "n<$args->list_tag class="$x">$formatted$args->list_tag>", $args, $formatted, $x, $pst );
}
if( $args->cache ){
wp_cache_add( $cache_key, $out, $cache_flag );
}if( $args->echo ){
return print $out;
}return $out;
}
После успешного копирования кода в файл шаблона functions.php
, где вы хотите отображать предыдущие записи из текущей категории, вызовите функцию следующим образом:
Теперь вы знаете, как просто использовать эту функцию.
Важно! Этот вызов будет работать правильно только в файле темы, который отвечает за отображение записей, обычно это single.php
.
Расширенное использование
Настройка формата вывода
Вы можете использовать следующие коды в параметре format
:
{thumb}
— миниатюра записи (она должна быть установлена для записи);{comments}
— покажет количество комментариев для статьи;{title}
— заголовок статьи;{date:j.M.Y}
— дата в формате "дд.Месяц.Гг" (например, "11.Апр.2010");{a}
и{/a}
— теги ссылки, открывающий и закрывающий.
Вызов будет выглядеть так:
-
5,
'format' => '{a}{title}{/a} - {date:j.M.Y} // {comments}',
) );
?>
Это выведет список в формате:
Использование кэша
Кэширование включено по умолчанию, и вы получите от него пользу, если функция вызывается несколько раз или если включен плагин кэширования объектов.
Метка списка
Вы можете изменить метку списка с li
на любую другую, например, <div>
:
<?php kama_previous_posts_from_cat('post_num=5&list_tag=div'); ?>
Это выведет 5 ссылок в формате: <div class='li1'><a href='http://link' title='Название статьи'>Название статьи</a></div>
.
Изменения
Версия 1.0:
- Добавлен шорткод
{thumb}
в параметрformat
. - Теперь все аргументы передаются в первый параметр функции в виде массива или строки.