Плагин 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>';
}Так вы можете выводить связанные записи в любом месте шаблона, используя преимущества кастомных фильтров.