YARPP и Multisite: синхронизация связанных записей в мультисайтовой сети WordPress

Плагин 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, которая интегрируется с современными плагинами и расширяет функциональность мультисайта.

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

⭐⭐⭐⭐⭐
Вывод связанных записей по автору с помощью кода в WordPress
23.03.2026
Как создать автоматические связи между записями по тегам в WordPress
07.02.2026
YARPP и комплексное кеширование связанных записей в WordPress: практические решения
18.03.2026
Как автоматизировать создание связанных записей по ключевым словам в WordPress
09.04.2026
Как использовать YARPP для кастомных типов записей в WordPress
04.02.2026
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙