Плагин YARPP (Yet Another Related Posts Plugin) отлично подходит для показа связанных записей на одном сайте WordPress. Но что делать, если у вас мультисайтовая сеть, и вы хотите показывать связанные записи из разных сайтов сети? В стандартной конфигурации YARPP работает только с одной базой данных сайта, и связанные записи выводятся только из текущего сайта. В этой статье мы подробно разберём, как настроить YARPP для мультисайтовой сети и организовать кросс-ссылки между сайтами.
Почему стандартный YARPP не работает в мультисайтовой сети для кросс-ссылок
В мультисайтовой сети WordPress каждая подсайт хранит записи в отдельных таблицах базы данных: например, wp_2_posts, wp_3_posts и так далее. Плагин YARPP по умолчанию выполняет поиск связанных записей только в таблицах текущего сайта (например, wp_posts, wp_postmeta и т. д.). Это означает, что он не видит записи из других подсайтов.
Для организации связанных записей между сайтами нужно реализовать механизм, который позволит плагину обращаться к данным сразу из нескольких таблиц или баз, либо реализовать агрегацию данных связанных записей в одном месте.
Задача усложняется тем, что каждая запись имеет свои ID в пределах сайта, и нужно аккуратно работать с идентификаторами и ссылками, чтобы избежать конфликтов и ошибок.
Подходы к синхронизации связанных записей между сайтами мультисайта
1. Использование глобальной таблицы для хранения метаданных связанных записей
Один из вариантов — создать отдельную таблицу в базе, которая будет хранить данные о связях между записями разных сайтов. При сохранении записи на любом из сайтов, с помощью хуков WordPress, можно обновлять эту таблицу с информацией о связях.
Преимущества: централизованное хранение связей, быстрая выборка.
Недостатки: дополнительная логика, необходимость синхронизации при обновлениях, сложность поддержки.
2. Копирование связанных записей между сайтами (репликация)
Можно реализовать механизм копирования связанных записей из одного сайта в другой с помощью REST API или WP CLI, и затем YARPP будет работать как обычно, поскольку все записи есть в текущей базе.
Минус — дублирование данных, сложности с синхронизацией изменений.
3. Расширение YARPP с помощью пользовательских фильтров и запросов к другим таблицам
YARPP предоставляет фильтры, например, yarpp_get_related, которые позволяют подменять результаты запроса связанных записей. Можно написать свою функцию, которая будет объединять результаты из нескольких сайтов.
Это наиболее гибкий и прямой способ, который мы рассмотрим подробнее ниже.
Практическая реализация: расширяем YARPP для мультисайтовой сети
Для начала создадим функцию, которая будет получать связанные записи из текущего сайта, а затем дополнительно делать запросы к другим сайтам мультисети и объединять результаты.
Для переключения между сайтами в мультисайте используем функцию switch_to_blog().
function yarpp_ru_get_related_multisite($related_posts, $post_id, $args) {
// Получаем связанные записи из текущего сайта
$results = $related_posts;
// Идентификаторы других сайтов в сети, где хотим искать связанные записи
$other_sites = [2, 3]; // замените на свои ID сайтов
foreach ($other_sites as $site_id) {
switch_to_blog($site_id);
// Получаем связанные записи для $post_id с другого сайта
// Для этого используем функцию yarpp_get_related, но она не доступна напрямую, поэтому можно сделать свой запрос
global $wpdb;
$table = $wpdb->posts;
// Пример простого запроса связанных записей по заголовку или другим параметрам
$query = $wpdb->prepare(
"SELECT ID FROM $table WHERE post_title LIKE %s AND post_status = 'publish'",
'%' . get_the_title($post_id) . '%'
);
$related_ids = $wpdb->get_col($query);
foreach ($related_ids as $related_id) {
$results[] = (object) [
'ID' => $related_id,
'blog_id' => $site_id
];
}
restore_current_blog();
}
// Убираем дубликаты
$unique_results = [];
$ids_seen = [];
foreach ($results as $item) {
$key = (isset($item->blog_id) ? $item->blog_id . '-' : '') . $item->ID;
if (!in_array($key, $ids_seen)) {
$ids_seen[] = $key;
$unique_results[] = $item;
}
}
return $unique_results;
}
add_filter('yarpp_get_related', 'yarpp_ru_get_related_multisite', 10, 3);В этом примере мы делаем простой поиск похожих заголовков на других сайтах. В реальном проекте логику поиска можно усложнить, например, искать по таксономиям, метаданным или использовать индексацию.
Вывод связанных записей из разных сайтов с корректными ссылками
Важно корректно формировать ссылки на записи из других сайтов. Для этого при выводе связанных записей нужно проверять, к какому сайту принадлежит запись, и формировать URL с помощью get_permalink() после переключения на нужный блог.
function yarpp_ru_render_related_multisite($related_posts) {
echo '<ul>';
foreach ($related_posts as $post) {
if (isset($post->blog_id)) {
switch_to_blog($post->blog_id);
$permalink = get_permalink($post->ID);
$title = get_the_title($post->ID);
restore_current_blog();
} else {
$permalink = get_permalink($post->ID);
$title = get_the_title($post->ID);
}
echo '<li><a href="' . esc_url($permalink) . '">' . esc_html($title) . '</a></li>';
}
echo '</ul>';
}Этот код можно использовать в кастомных шаблонах YARPP для вывода связанных записей.
Рекомендации по оптимизации и кешированию
Так как переключение между сайтами и дополнительные запросы могут замедлить страницу, стоит использовать кеширование. Можно кэшировать результаты функции yarpp_ru_get_related_multisite с помощью Transients API:
function yarpp_ru_get_related_multisite_cached($related_posts, $post_id, $args) {
$cache_key = 'yarpp_multisite_related_' . $post_id;
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$results = yarpp_ru_get_related_multisite($related_posts, $post_id, $args);
set_transient($cache_key, $results, 12 * HOUR_IN_SECONDS);
return $results;
}
remove_filter('yarpp_get_related', 'yarpp_ru_get_related_multisite', 10);
add_filter('yarpp_get_related', 'yarpp_ru_get_related_multisite_cached', 10, 3);Это позволит снизить нагрузку базы данных и ускорить отображение связанных записей.
Альтернативные плагины и решения
Если задача кажется слишком сложной, можно рассмотреть специализированные плагины для мультисайтов, например, WPCommunity, которые предлагают расширенные возможности связи между сайтами.
Также существуют решения с использованием Elasticsearch или внешних поисковых сервисов для кросс-сайтового поиска и показа связанных записей.
Итог
Мультисайтовая сеть WordPress предоставляет большие возможности, но требует более сложных решений для кросс-ссылок между сайтами. Расширение YARPP с помощью фильтров и функций переключения блогов позволяет реализовать синхронизацию связанных записей. При этом важна оптимизация и кеширование. Также можно рассмотреть готовые плагины с поддержкой мультисайта.
Если вы ищете удобные инструменты для работы с мультисайтами и связями, обратите внимание на тему WPCommunity от WPSHOP, которая интегрируется с современными плагинами и расширяет функциональность мультисайта.