Плагин YARPP (Yet Another Related Posts Plugin) — один из самых популярных инструментов для вывода связанных записей в WordPress. Однако при работе с крупными сайтами с большим количеством контента и запросов стандартное кеширование YARPP может быть недостаточно эффективным. В этой статье подробно рассмотрим, как реализовать комплексное кеширование связанных записей, чтобы ускорить работу сайта и снизить нагрузку на сервер.
Почему важно кешировать связанные записи в YARPP
По умолчанию YARPP вычисляет связанные записи динамически, анализируя содержимое, таксономии и метаданные. При большом количестве запросов и записей это приводит к значительной нагрузке на базу данных и замедлению страницы.
Кеширование позволяет сохранить результаты вычислений и отдавать их без повторного анализа, значительно уменьшая время отклика и потребление ресурсов.
Рассмотрим несколько способов кеширования связанных записей в YARPP с примерами кода и рекомендациями.
Виды кеширования для YARPP
1. Встроенное кеширование YARPP
С версии 4.5 YARPP реализует базовое кеширование результатов выборки в опциях WordPress. Но для крупных проектов этого часто недостаточно.
Кеш хранится в базе данных и очищается при обновлении записи или изменении контента.
2. Использование Object Cache (Redis, Memcached)
Для повышения производительности рекомендую использовать внешнее объектное кеширование через Redis или Memcached. WordPress поддерживает это через плагины типа Clearfy Pro, который умеет оптимизировать кеширование и совместим с YARPP.
Пример подключения Redis для кеширования YARPP:
function yarpp_redis_cache_results($results, $post_id) {
$cache_key = 'yarpp_related_' . $post_id;
$cached = wp_cache_get($cache_key, 'yarpp');
if ($cached !== false) {
return $cached;
}
wp_cache_set($cache_key, $results, 'yarpp', 3600); // Кеш на 1 час
return $results;
}
add_filter('yarpp_get_related', 'yarpp_redis_cache_results', 10, 2);
В этом примере результаты связанных записей кешируются в объектном кеше Redis для каждого поста отдельно, что снижает количество запросов к базе.
3. Кеширование на уровне шаблона с помощью Transients API
Если вы хотите кешировать сгенерированный HTML блок связанных записей, можно использовать Transients API. Это подходит, если структура вывода сложная, и вы хотите не только кешировать данные, но и готовый HTML.
Пример реализации:
function yarpp_ru_get_related_posts_html($post_id) {
$cache_key = 'yarpp_related_html_' . $post_id;
$cached_html = get_transient($cache_key);
if ($cached_html !== false) {
return $cached_html;
}
$related_posts = yarpp_get_related(array('post_id' => $post_id));
if (empty($related_posts)) {
return '';
}
ob_start();
echo '<ul class="yarpp-related-list">';
foreach ($related_posts as $post) {
echo '<li><a href="' . get_permalink($post->ID) . '">' . esc_html(get_the_title($post->ID)) . '</a></li>';
}
echo '</ul>';
$html = ob_get_clean();
set_transient($cache_key, $html, HOUR_IN_SECONDS);
return $html;
}
Выводим в шаблоне так:
echo yarpp_ru_get_related_posts_html(get_the_ID());
При изменении контента кэш нужно сбрасывать, для этого можно повесить удаление transient на хуки обновления записи.
Как организовать сброс кеша YARPP при обновлении записей
Чтобы кеш всегда был актуальным, нужно удалять сохранённые данные при изменении постов. Добавим следующие хуки:
function yarpp_ru_clear_cache_on_save($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
delete_transient('yarpp_related_html_' . $post_id);
wp_cache_delete('yarpp_related_' . $post_id, 'yarpp');
}
add_action('save_post', 'yarpp_ru_clear_cache_on_save');
add_action('delete_post', 'yarpp_ru_clear_cache_on_save');
Таким образом, при любом обновлении или удалении записи кэш YARPP будет очищаться, и пользователи увидят актуальные связанные записи.
Дополнительные советы по оптимизации YARPP на больших сайтах
Используйте выборочный кешинг и пагинацию
Если у вас много связанных записей, выводите их с пагинацией, чтобы не перегружать страницу. Для этого можно использовать плагины вроде ABC Pagination, которые хорошо совместимы с YARPP.
Оптимизируйте запросы YARPP
Иногда помогает ограничение количества запросов и отключение некоторых параметров в настройках YARPP — например, отключить поиск по контенту и оставить только таксономии.
Используйте кастомные шаблоны YARPP
Создайте кастомные шаблоны вывода YARPP, которые генерируют минимально необходимый HTML. Чем проще и компактнее шаблон, тем быстрее рендеринг.
Выводы
Комплексное кеширование связанных записей YARPP — ключ к высокой производительности крупных WordPress-сайтов. Комбинация объектного кеширования, Transients API и грамотного сброса кеша при обновлениях поможет значительно ускорить выдачу связанных записей.
Рекомендуется тестировать разные методы кеширования в вашей среде, чтобы подобрать оптимальный вариант.
Для удобства оптимизации можно использовать плагины из WPShop.ru, например, Clearfy Pro для продвинутого кеширования и оптимизации.