Связанные записи в WordPress — это отличный способ увеличить время пребывания посетителей на сайте и улучшить внутреннюю перелинковку. Многие используют готовые решения, например, плагин YARPP, но что делать, если хочется полный контроль, оптимизацию под свои задачи и минимальное влияние на производительность? В этой статье мы подробно разберем, как создать свой собственный плагин для автоматического отображения связанных записей на сайте WordPress.
Почему стоит создавать собственный плагин связанных записей
Готовые решения часто перегружены функционалом, который вы не используете, или используют тяжелые запросы к базе данных, что замедляет сайт. Собственный плагин позволит:
- Контролировать логику подбора похожих записей;
- Оптимизировать запросы под структуру вашего сайта и базы данных;
- Интегрироваться с вашим дизайном и стилями;
- Добавлять только нужные функции, без лишнего кода.
Кроме того, создавая свой плагин, вы получаете возможность быстро адаптироваться под новые задачи и изменять поведение без риска поломать другие части сайта.
Основные подходы к поиску связанных записей
Чтобы подобрать связанные записи, можно использовать несколько критериев:
- Общие таксономии (категории, теги);
- Совпадение ключевых слов в заголовках и контенте;
- Пользовательские поля и метаданные;
- Вычисление схожести по содержимому на основе TF-IDF (сложнее реализовать).
В нашем плагине мы сосредоточимся на простом и эффективном методе — подборке по общим категориям и тегам.
Структура плагина и регистрация
Для начала создадим папку yarpp-custom-related в директории wp-content/plugins и файл yarpp-custom-related.php. В этом файле опишем базовый заголовок плагина и подключим хук для вывода связанных записей после контента.
<?php
/*
Plugin Name: YARPP Custom Related Posts
Description: Автоматическое отображение связанных записей на основе категорий и тегов.
Version: 1.0
Author: Yarpp.ru
*/
add_filter('the_content', 'yarpp_custom_related_display');
function yarpp_custom_related_display($content) {
if (is_single() && is_main_query()) {
$related = yarpp_custom_get_related_posts(get_the_ID());
if ($related) {
$content .= '<div class="yarpp-custom-related"><h3>Похожие записи</h3><ul>';
foreach ($related as $post) {
$content .= '<li><a href="' . get_permalink($post->ID) . '">' . esc_html(get_the_title($post->ID)) . '</a></li>';
}
$content .= '</ul></div>';
}
}
return $content;
}
Здесь мы подключили функцию yarpp_custom_related_display, которая добавляет блок со связанными записями после основного контента на странице записи.
Получение связанных записей по категориям и тегам
Теперь реализуем функцию yarpp_custom_get_related_posts, которая будет искать записи, у которых совпадают категории или теги с текущей записью. Чтобы увеличить релевантность, мы будем учитывать оба типа таксономий и сортировать по количеству совпадений.
function yarpp_custom_get_related_posts($post_id, $limit = 5) {
$categories = wp_get_post_categories($post_id);
$tags = wp_get_post_tags($post_id, array('fields' => 'ids'));
if (empty($categories) && empty($tags)) {
return false;
}
$args = array(
'post_type' => get_post_type($post_id),
'post__not_in' => array($post_id),
'posts_per_page' => $limit,
'orderby' => 'relevance',
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $categories,
'include_children' => false,
'operator' => 'IN'
),
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => $tags,
'operator' => 'IN'
)
),
'meta_query' => array(),
);
// Поскольку WP_Query не поддерживает сортировку по количеству совпадающих таксономий,
// мы сначала получим все подходящие посты, а потом отсортируем в PHP.
$query = new WP_Query($args);
if (!$query->have_posts()) {
return false;
}
$posts = $query->posts;
// Подсчёт совпадений категорий и тегов для каждого поста
foreach ($posts as $key => $post) {
$post_cats = wp_get_post_categories($post->ID);
$post_tags = wp_get_post_tags($post->ID, array('fields' => 'ids'));
$cat_intersect = array_intersect($categories, $post_cats);
$tag_intersect = array_intersect($tags, $post_tags);
$posts[$key]->match_score = count($cat_intersect) + count($tag_intersect);
}
// Сортируем по убыванию совпадений
usort($posts, function($a, $b) {
return $b->match_score - $a->match_score;
});
return array_slice($posts, 0, $limit);
}
Таким образом, мы получаем список записей, максимально похожих по категориям и тегам, что обеспечивает релевантность рекомендаций.
Дополнительные настройки и оптимизация
Чтобы улучшить работу плагина, можно добавить кэширование результатов с помощью Transient API WordPress. Это сократит количество запросов к базе данных и повысит скорость загрузки страниц.
function yarpp_custom_get_related_posts($post_id, $limit = 5) {
$cache_key = 'yarpp_custom_related_' . $post_id;
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
// ... код из предыдущей функции ...
set_transient($cache_key, $posts, HOUR_IN_SECONDS);
return $posts;
}
Также стоит добавить стили для блока связанных записей, чтобы он гармонично вписывался в дизайн сайта. Например:
.yarpp-custom-related {
border-top: 1px solid #ddd;
margin-top: 30px;
padding-top: 20px;
}
.yarpp-custom-related h3 {
font-size: 1.2em;
margin-bottom: 15px;
}
.yarpp-custom-related ul {
list-style: disc inside;
margin: 0;
padding: 0;
}
.yarpp-custom-related ul li {
margin-bottom: 8px;
}
Добавьте этот CSS в файл стилей вашей темы или подключите через плагин.
Расширение функционала: фильтрация по пользовательским полям
Если на вашем сайте используются пользовательские поля (custom fields) для дополнительной информации, можно учитывать их при подборе связанных записей. Например, если у записей есть поле "product_brand" и вы хотите показывать похожие записи только того же бренда, добавьте в запрос аргумент meta_query:
$args['meta_query'][] = array(
'key' => 'product_brand',
'value' => get_post_meta($post_id, 'product_brand', true),
'compare' => '='
);
Это позволит сузить результаты и сделать рекомендации более точными.
Вывод и подключение плагина
Плагин можно активировать из админки WordPress как обычный. При активации на страницах записей автоматически появится блок с похожими статьями.
Вы можете дополнительно выводить связанные записи в шаблонах, вызвав функцию напрямую:
function yarpp_custom_the_related_posts($post_id = null, $limit = 5) {
if (!$post_id) {
$post_id = get_the_ID();
}
$related = yarpp_custom_get_related_posts($post_id, $limit);
if (!$related) return;
echo '<div class="yarpp-custom-related"><h3>Похожие записи</h3><ul>';
foreach ($related as $post) {
echo '<li><a href="' . get_permalink($post->ID) . '">' . esc_html(get_the_title($post->ID)) . '</a></li>';
}
echo '</ul></div>';
}
Таким образом, вы можете вставлять связанные записи в любое место шаблона.
Заключение
Создание собственного плагина для связанных записей — это отличная возможность оптимизировать работу сайта, контролировать логику рекомендаций и улучшить пользовательский опыт. Такой плагин легко адаптируется и расширяется под любые задачи. Используйте приведенный пример как отправную точку для своих разработок и улучшайте функционал по мере необходимости.