Кэширование в WordPress обычно применяется ко всему сайту или к отдельным типам страниц, однако в реальных проектах часто возникает задача кэшировать разные страницы по-разному. Например, статические страницы — максимально кэшировать, а страницы с динамическим контентом — обновлять чаще или вообще не кэшировать. В этой статье мы подробно разберём, как реализовать кэширование раздельных страниц в WordPress, какие инструменты для этого использовать и приведём примеры кода.
Почему важно кэшировать страницы по-разному? Основные причины
В большинстве случаев WordPress-сайт содержит различные типы страниц: статичные страницы, записи блога, страницы с динамическим содержимым (корзина, личный кабинет, результаты поиска и т.п.). Универсальное кэширование для всех страниц может привести к проблемам:
- Замедление обновления динамичного контента. Например, цены в интернет-магазине или количество товаров в корзине должны отображаться актуально.
- Пользователь видит устаревшую информацию. При слишком агрессивном кэшировании динамических страниц страдает UX.
- Избыточные запросы к серверу. Страницы, которые редко меняются, лучше кэшировать дольше, чтобы снизить нагрузку.
Поэтому важно иметь гибкий подход к кэшированию, который позволит задавать правила по разным страницам.
Какие способы кэширования раздельных страниц существуют?
Рассмотрим наиболее распространённые методы:
1. Кэширование на уровне плагинов с поддержкой правил
Многие популярные плагины кэширования, например Clearfy Pro, WP Rocket, LiteSpeed Cache позволяют задавать исключения и правила кэширования по URL, типу страницы и другим параметрам. Это самый простой и безопасный способ.
2. Использование условных тегов WordPress для управления кэшем в коде
Если вы пишете собственный механизм кэширования или расширяете существующий, можно использовать условные теги WordPress, например is_page(), is_single(), is_user_logged_in() и др., чтобы определить, кэшировать страницу или нет.
3. Object Cache и Transients с условиями
Для частичного кэширования динамического контента подойдут Object Cache или API временных данных — Transients. Здесь можно хранить кэш для определённых частей страниц с разным временем жизни.
Пример: реализация простого условного кэширования в functions.php
Ниже пример функции wpcache_cache_page(), которая кэширует только статические страницы и записи, пропуская корзину, личный кабинет и страницы поиска.
function wpcache_cache_page() {
if (is_admin() || is_user_logged_in()) {
return; // Не кэшируем админку и залогиненных пользователей
}
if (is_page() || is_single()) {
// Логика кэширования страницы
// Например, используем Transient API
$cache_key = 'wpcache_page_' . md5($_SERVER['REQUEST_URI']);
$cached = get_transient($cache_key);
if ($cached !== false) {
echo $cached;
exit;
} else {
ob_start();
// Запускаем рендеринг страницы как обычно
// После вывода сохраняем в кэш
add_action('shutdown', function() use ($cache_key) {
$output = ob_get_contents();
set_transient($cache_key, $output, HOUR_IN_SECONDS);
ob_end_flush();
});
}
}
}
add_action('template_redirect', 'wpcache_cache_page', 0);
Этот код кэширует HTML выдачу страниц и записей на 1 час, не кэшируя админку и страницы для залогиненных пользователей. Для исключения других URL можно расширить условия.
Как расширить кэширование для AJAX и REST API с разными правилами
Для сайтов с динамическим контентом часто нужно кэшировать AJAX-запросы и REST API ответы. Обычно их не кэшируют или делают отдельный кэш с маленьким временем жизни. Ниже пример, как в REST API добавить кэш с учётом типа запроса:
add_filter('rest_pre_echo_response', function($response, $server, $request) {
$route = $request->get_route();
$cache_key = 'wpcache_rest_' . md5($route . json_encode($request->get_params()));
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
set_transient($cache_key, $response, 5 * MINUTE_IN_SECONDS); // кэш на 5 минут
return $response;
}, 10, 3);
Такой подход помогает снизить нагрузку без потери актуальности данных.
Рекомендации по плагинам для продвинутого кэширования с разделением правил
- Clearfy Pro — поддерживает гибкие правила исключений и позволяет быстро настроить кэширование для разных типов страниц.
- WP Rocket — очень популярный плагин с возможностью исключения URL и кэширования отдельных типов страниц.
- LiteSpeed Cache — отлично подходит для сайтов на LiteSpeed сервере, поддерживает сложные правила кэширования.
- Redis Object Cache — для кэширования объектов с тонким контролем, можно использовать в связке с условными тегами.
Ошибки и подводные камни при раздельном кэшировании
При реализации раздельного кэширования важно учитывать:
- Не кэшировать страницы с персонализированным или пользовательским контентом без правильной очистки кэша.
- Учитывать куки и сессии, чтобы избежать показа чужих данных.
- Проверять, что правила кэширования не конфликтуют между собой и не создают циклы.
- Тестировать работу кэша в разных сценариях — для гостей, залогиненных, разных ролей.
Итог
Раздельное кэширование страниц в WordPress — эффективный способ ускорить сайт без потери актуальности контента. Используйте условные теги, Transients API, а также гибкие настройки плагинов, чтобы настроить кэширование под конкретные задачи проекта. Приведённые примеры кода помогут вам быстро начать и избежать типичных ошибок.