Плагин 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.