Как эффективно использовать YARPP для подбора связанных записей по произвольным методам

Плагин Yet Another Related Posts Plugin (YARPP) — один из самых популярных инструментов для вывода связанных записей в WordPress. Но стандартные алгоритмы подбора, основанные на категориях и тегах, не всегда подходят для сложных и уникальных сайтов. В этой статье мы рассмотрим, как расширить функциональность YARPP и настроить подбор связанных записей по произвольным методам, используя кастомные поля (meta), сложные алгоритмы и собственные фильтры.

Почему стандартный подбор YARPP не всегда подходит

По умолчанию YARPP использует таксономии (категории и теги) и заголовки для вычисления релевантности записей. Однако это не всегда достаточно, если:

  • Вы хотите учитывать дополнительные параметры, например, произвольные поля записи.
  • Подбираете связанные товары с учетом цены, бренда или характеристик.
  • Необходим сложный кастомный алгоритм с учетом нескольких критериев.

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

Основные фильтры YARPP для кастомизации подбора связанных записей

YARPP предоставляет несколько ключевых фильтров для вмешательства в логику подбора:

  • yarpp_related_query — позволяет изменить SQL-запрос подбора связанных записей.
  • yarpp_related — фильтрует массив связанных записей после получения результатов.
  • yarpp_score — изменяет итоговый балл релевантности записи, можно повлиять на сортировку.

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

Пример: Подбор записей по произвольному полю meta

Для примера реализуем подбор записей, связанных по значению произвольного поля yarpp_custom_key. То есть, будут показываться записи, у которых совпадает это поле.

add_filter('yarpp_related_query', 'yarppru_related_query_by_custom_meta', 10, 2);
function yarppru_related_query_by_custom_meta($query, $post) {
    global $wpdb;
    // Получаем значение кастомного поля текущей записи
    $meta_value = get_post_meta($post->ID, 'yarpp_custom_key', true);
    if (!$meta_value) {
        return $query; // если нет значения, возвращаем стандартный запрос
    }
    // Формируем новый SQL запрос с JOIN по meta_key и meta_value
    $query = "
        SELECT DISTINCT p.ID, p.post_title, p.post_date, p.post_type, 100 AS score
        FROM {$wpdb->posts} p
        INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
        WHERE pm.meta_key = 'yarpp_custom_key'
        AND pm.meta_value = %s
        AND p.ID != %d
        AND p.post_status = 'publish'
    ";
    // Подставим значения
    $query = $wpdb->prepare($query, $meta_value, $post->ID);
    return $query;
}

Этот фильтр заменит стандартный запрос на поиск записей с совпадающим значением мета-поля. Балл релевантности принудительно выставлен в 100 для приоритета.

Дополнительная фильтрация и сортировка

Если нужно дополнительно отфильтровать или отсортировать связанные записи, можно использовать фильтр yarpp_related:

add_filter('yarpp_related', 'yarppru_filter_related_posts', 10, 2);
function yarppru_filter_related_posts($related_posts, $post) {
    // Фильтруем записи по дополнительному условию
    $filtered = array();
    foreach ($related_posts as $related) {
        $price = get_post_meta($related->ID, 'product_price', true);
        if ($price < 1000) { // например, только товары дешевле 1000
            $filtered[] = $related;
        }
    }
    return $filtered;
}

Таким образом, можно гибко управлять результатами, исключая нежелательные записи.

Использование плагинов для расширения функционала YARPP

Если не хочется писать много кода, есть плагины, которые могут помочь:

  • Clearfy Pro — оптимизирует работу WordPress, включая улучшение запросов и кэширования, что положительно влияет на производительность YARPP.
  • ABC Pagination — поможет реализовать удобную навигацию по связанным записям, если их много.

Интеграция с такими плагинами обеспечит вам удобный и быстрый функционал.

Оптимизация производительности подбора связанных записей

Подбор связанных записей — ресурсозатратная операция, особенно на больших сайтах с тысячами записей. Вот несколько советов для оптимизации:

  • Используйте кэширование результатов, например, через Transients API или плагины кеширования.
  • Минимизируйте число JOIN и сложных SQL-запросов, по возможности переносите логику в PHP.
  • Применяйте индексы для таблицы postmeta по ключам, которые используете для поиска.
  • Ограничивайте число связанных записей в настройках YARPP.

Также можно использовать фильтр yarpp_cache для тонкой настройки кэширования.

Пример полного решения: вывод связанных записей по нескольким произвольным полям

Предположим, нужно выбрать связанные записи, у которых совпадают сразу два мета-поля: brand и color. Для этого напишем фильтр:

add_filter('yarpp_related_query', 'yarppru_related_query_by_multiple_meta', 10, 2);
function yarppru_related_query_by_multiple_meta($query, $post) {
    global $wpdb;
    $brand = get_post_meta($post->ID, 'brand', true);
    $color = get_post_meta($post->ID, 'color', true);
    if (!$brand || !$color) {
        return $query; // fallback
    }
    $query = "
        SELECT DISTINCT p.ID, p.post_title, p.post_date, p.post_type,
        (CASE WHEN pm1.meta_value = %s THEN 50 ELSE 0 END +
         CASE WHEN pm2.meta_value = %s THEN 50 ELSE 0 END) as score
        FROM {$wpdb->posts} p
        INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = 'brand'
        INNER JOIN {$wpdb->postmeta} pm2 ON p.ID = pm2.post_id AND pm2.meta_key = 'color'
        WHERE pm1.meta_value = %s
        AND pm2.meta_value = %s
        AND p.ID != %d
        AND p.post_status = 'publish'
    ";
    $query = $wpdb->prepare($query, $brand, $color, $brand, $color, $post->ID);
    return $query;
}

Этот код ищет записи, у которых совпадают оба поля, и начисляет им баллы для сортировки. Можно адаптировать под большее число полей и другие правила.

Вывод связанных записей в шаблоне с учетом кастомной логики

Для вывода связанных записей с кастомным алгоритмом можно использовать функцию yarpp_get_related с параметрами:

$related_posts = yarpp_get_related(array(
    'post_type' => array('post', 'product'),
    'limit' => 5,
));
if ($related_posts) {
    echo '<ul>';
    foreach ($related_posts as $post) {
        setup_postdata($post);
        echo '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title($post) . '</a></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Связанные записи не найдены.</p>';
}

Так вы можете выводить связанные записи в любом месте шаблона, используя преимущества кастомных фильтров.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать автоматические связи между записями по тегам в WordPress
07.02.2026
Как добавить собственный тип записей в WordPress: практическое руководство с примерами кода
26.11.2025
YARPP и комплексное кеширование связанных записей в WordPress: практические решения
18.03.2026
Как создать собственный блок связанных записей с использованием YARPP и AJAX
21.03.2026
WooCommerce: как исключить товары по метаданным из списка связанных товаров
30.04.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙