Как вывести связанные записи по произвольным полям (meta) в WordPress

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

Почему важно использовать произвольные поля для связанных записей

Произвольные поля (meta) в WordPress позволяют хранить дополнительную информацию о записи: например, характеристики товара, дату события, автора проекта, рейтинг и многое другое. При подборе похожих записей по таким метаданным можно значительно повысить релевантность выдачи, особенно для сайтов с кастомным контентом — интернет-магазинов, каталогов, образовательных порталов и т.п.

Стандартные алгоритмы YARPP не учитывают meta, поэтому при необходимости фильтрации по ним нам придётся либо использовать фильтры и хуки плагина, либо писать собственные запросы к базе данных.

Использование фильтра yarpp_related_query для добавления meta-запросов

YARPP предоставляет фильтр yarpp_related_query, с помощью которого можно модифицировать SQL-запрос, формируемый для поиска связанных записей. Мы можем добавить в WHERE условие по произвольным полям.

Ниже пример функции, которая добавляет условие, чтобы связанные записи имели meta-поле product_color с таким же значением, как и у текущей записи:

function yarppru_add_meta_filter_to_yarpp_query($query, $args) {
    global $wpdb, $post;

    // Получаем значение мета текущей записи
    $current_meta = get_post_meta($post->ID, 'product_color', true);
    if (empty($current_meta)) {
        return $query; // Если нет значения, не фильтруем
    }

    // Добавляем JOIN для таблицы postmeta
    if (strpos($query, 'JOIN {$wpdb->postmeta}') === false) {
        $query = str_replace('WHERE', 'JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID WHERE', $query);
    }

    // Добавляем условие по meta_key и meta_value
    $meta_condition = $wpdb->prepare("pm.meta_key = 'product_color' AND pm.meta_value = %s", $current_meta);

    // Вставляем условие в WHERE
    $query = str_replace('WHERE', "WHERE $meta_condition AND", $query);

    return $query;
}
add_filter('yarpp_related_query', 'yarppru_add_meta_filter_to_yarpp_query', 10, 2);

Обратите внимание, что здесь мы используем глобальную переменную $post, чтобы получить значение мета текущей записи, и подключаем таблицу postmeta для сравнения.

Как применить фильтр для нескольких meta-полей

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

function yarppru_add_multiple_meta_filters($query, $args) {
    global $wpdb, $post;

    $meta_checks = [];
    $meta_pairs = [
        'product_color' => get_post_meta($post->ID, 'product_color', true),
        'product_size' => get_post_meta($post->ID, 'product_size', true),
    ];

    foreach ($meta_pairs as $key => $value) {
        if (!empty($value)) {
            $meta_checks[] = $wpdb->prepare("(pm.meta_key = %s AND pm.meta_value = %s)", $key, $value);
        }
    }

    if (empty($meta_checks)) {
        return $query;
    }

    // Добавляем JOIN для таблицы postmeta, если ещё не добавлен
    if (strpos($query, 'JOIN {$wpdb->postmeta}') === false) {
        $query = str_replace('WHERE', 'JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID WHERE', $query);
    }

    $meta_condition = implode(' OR ', $meta_checks);

    $query = str_replace('WHERE', "WHERE ($meta_condition) AND", $query);

    return $query;
}
add_filter('yarpp_related_query', 'yarppru_add_multiple_meta_filters', 10, 2);

Так мы расширяем выборку связанных записей, учитывая сразу несколько условий по произвольным полям.

Использование плагинов для расширения YARPP с meta-полями

Если хочется упростить задачу и не писать код вручную, можно рассмотреть специализированные плагины, которые расширяют YARPP. Например, YARPP Pro от WPShop предлагает расширенные возможности по фильтрации и интеграции с meta-полями.

Также полезен плагин Clearfy Pro, который оптимизирует запросы и совместим с YARPP, позволяя улучшить производительность при сложных фильтрах.

Кэширование и оптимизация запросов с meta-фильтрами

Фильтрация по мета-данным значительно усложняет SQL-запросы и может негативно сказаться на производительности сайта, особенно при большом количестве записей. Чтобы этого избежать:

  • Используйте кэширование результатов YARPP с помощью плагинов кэширования (например, WP Super Cache, W3 Total Cache).
  • Оптимизируйте таблицу postmeta с помощью индексов по meta_key и meta_value.
  • Используйте объектный кэш WordPress (Redis, Memcached) для хранения результатов запросов.
  • По возможности ограничьте количество отображаемых связанных записей (например, 5-10 штук).

Пример кода для кэширования результатов YARPP с meta-фильтрами

function yarppru_get_related_with_cache($post_id, $args = []) {
    $cache_key = 'yarpp_related_meta_' . $post_id;
    $related = wp_cache_get($cache_key, 'yarpp');

    if ($related === false) {
        // Используем стандартный вызов YARPP, он применит наши фильтры
        $related = yarpp_get_related(['post_id' => $post_id] + $args);
        wp_cache_set($cache_key, $related, 'yarpp', 3600); // кэш на час
    }

    return $related;
}

Такой подход снижает нагрузку при повторных запросах на одних и тех же страницах.

Вывод связанных записей с meta-фильтрами в шаблоне

Для вывода связанных записей можно использовать стандартные функции YARPP, которые уже учитывают наши фильтры. Например, в шаблоне single.php:

<?php
$related_posts = yarppru_get_related_with_cache(get_the_ID(), ['limit' => 5]);
if (!empty($related_posts)) {
    echo '<h3>Похожие записи по характеристикам</h3><ul>';
    foreach ($related_posts as $post) {
        setup_postdata($post);
        echo '<li><a href="' . get_permalink($post) . '">' . esc_html(get_the_title($post)) . '</a></li>';
    }
    wp_reset_postdata();
    echo '</ul>';
} else {
    echo '<p>Похожие записи не найдены.</p>';
}
?>

Советы по кастомизации вывода

  • Для улучшения визуального восприятия используйте кастомные шаблоны YARPP — в них можно добавить отображение meta-полей рядом с заголовками.
  • Добавьте поддержку AJAX для подгрузки связанных записей без перезагрузки страницы, улучшая UX.
  • Используйте плагин ABC Pagination для удобной навигации по связанным записям, если их много.

Заключение по теме

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

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

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

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

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

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