Кэширование в WordPress — ключ к высокой производительности сайта, особенно при большом трафике. Однако стандартные методы кэширования часто не учитывают различия между типами запросов, такими как запросы страниц, AJAX, REST API и запросы с GET-параметрами. В этой статье мы подробно разберём, как эффективно настроить и расширить WP Super Cache для кэширования разных типов запросов, включая практические примеры и код.
Особенности кэширования разных типов запросов в WordPress
В WordPress существует несколько типов запросов, которые обрабатываются по-разному и требуют особого подхода к кэшированию:
- Стандартные запросы страниц — это главные страницы сайта, категории, архивы и т.д. Обычно их кэширование стандартно поддерживается WP Super Cache.
- AJAX-запросы — выполняются без перезагрузки страницы, часто возвращают динамические данные, что требует особого подхода, чтобы не кэшировать устаревшие ответы.
- REST API запросы — используются для интеграций и динамического взаимодействия с сайтом, тоже нуждаются в специфическом кэшировании.
- Запросы с GET-параметрами — могут выдавать разный контент в зависимости от параметров, что нужно учитывать при кэшировании.
Настройка WP Super Cache для каждого из них требует понимания, как плагин обрабатывает разные запросы и где нужно вмешаться с дополнительным кодом.
Настройка кэширования страниц с GET-параметрами
По умолчанию WP Super Cache не кэширует страницы с GET-параметрами, чтобы избежать ошибок с динамическим контентом. Но иногда нам нужно кэшировать такие страницы, например, страницы фильтров или пагинации.
Для этого в настройках WP Super Cache включите опцию "Кэшировать страницы с параметрами запроса" (Cache pages with GET parameters). Но это не всегда достаточно — нужно контролировать, какие параметры учитываются.
Вот пример функции, которая позволит включить кэширование только для определённых GET-параметров, например, для параметров фильтрации:
function wpsupercache_allow_cache_for_get_params( $cache, $url ) {
$allowed_params = array('filter', 'orderby');
$parsed_url = wp_parse_url($url);
if ( empty($parsed_url['query']) ) {
return $cache;
}
parse_str($parsed_url['query'], $query_params);
foreach ( $query_params as $key => $value ) {
if ( ! in_array($key, $allowed_params) ) {
return false; // Не кэшируем, если есть запрещенный параметр
}
}
return $cache;
}
add_filter('wp_super_cache_cache_get_query', 'wpsupercache_allow_cache_for_get_params', 10, 2);
Эта функция проверяет параметры запроса и разрешает кэширование только при наличии разрешённых параметров. Остальные запросы будут пропускаться.
Кэширование AJAX-запросов в WordPress с WP Super Cache
AJAX-запросы часто выполняются через admin-ajax.php и по умолчанию не кэшируются, так как это может привести к выдаче устаревших данных. Но если у вас есть AJAX-запросы с данными, которые меняются редко, можно реализовать кэширование на уровне ответа.
Пример: кэшируем результат AJAX-запроса с помощью транзиентов (временного хранилища в базе данных), чтобы ускорить выдачу:
add_action('wp_ajax_wpsupercache_get_data', 'wpsupercache_ajax_get_data');
add_action('wp_ajax_nopriv_wpsupercache_get_data', 'wpsupercache_ajax_get_data');
function wpsupercache_ajax_get_data() {
$cache_key = 'wpsupercache_ajax_data';
$data = get_transient($cache_key);
if ( false === $data ) {
// Длительная операция, например запрос к внешнему API
$data = array('time' => current_time('mysql'), 'value' => rand(1, 100));
set_transient($cache_key, $data, 3600); // Кэш на 1 час
}
wp_send_json_success($data);
}
Такой подход уменьшит нагрузку на сервер при частых AJAX-запросах.
Кэширование REST API запросов
REST API — мощный инструмент для создания динамических сайтов и приложений на WordPress. Однако стандартный WP Super Cache не кэширует ответы REST API.
Для кэширования REST API можно использовать промежуточное кэширование с помощью транзиентов или внешних кешей (Redis, Memcached). Пример реализации кэширования REST API внутри callback-функции контроллера:
add_action('rest_api_init', function () {
register_rest_route('wpsupercache/v1', '/data/', array(
'methods' => 'GET',
'callback' => 'wpsupercache_rest_api_data',
));
});
function wpsupercache_rest_api_data( WP_REST_Request $request ) {
$cache_key = 'wpsupercache_rest_data';
$data = get_transient($cache_key);
if ( false === $data ) {
$data = array('time' => current_time('mysql'), 'random' => rand(100, 999));
set_transient($cache_key, $data, 600); // Кэш на 10 минут
}
return rest_ensure_response($data);
}
Такой подход снизит время ответа и нагрузку на сервер при частых запросах к API.
Исключения и тонкая настройка кэширования в WP Super Cache
Очень важно не кэшировать страницы и запросы с данными, которые часто меняются, например, корзину, страницу профиля или результаты поиска. WP Super Cache позволяет настроить исключения с помощью фильтров и настроек в админке.
Пример: исключаем из кэширования запросы, если пользователь авторизован, или если в URL есть определённый параметр:
function wpsupercache_skip_cache_for_logged_in_users_and_params( $cache ) {
if ( is_user_logged_in() ) {
return false;
}
if ( isset($_GET['nocache']) ) {
return false;
}
return $cache;
}
add_filter('wp_super_cache_should_cache', 'wpsupercache_skip_cache_for_logged_in_users_and_params');
Это гарантирует, что кэш будет пропущен для авторизованных пользователей и при наличии параметра nocache.
Рекомендации по использованию WP Super Cache с учётом разных типов запросов
- Включайте кэширование GET-запросов только для параметров, которые не влияют на безопасность и не возвращают персональные данные.
- Используйте транзиенты для кэширования AJAX и REST API, если данные обновляются не чаще нескольких минут.
- Настраивайте исключения для авторизованных пользователей и чувствительных страниц.
- Регулярно очищайте кэш при обновлении контента через хуки WP Super Cache.
- Для сложных сценариев кэширования рассмотрите интеграцию с Redis или Memcached.
Полезные плагины для расширения кэширования в WordPress
Кроме WP Super Cache, для сложного кэширования AJAX и REST API можно использовать плагины:
- Clearfy Pro — оптимизация и настройка кэширования, улучшение производительности.
- WPRemark — улучшение работы с AJAX и динамическим контентом.
Автоматическое очищение кэша при изменении данных
Для поддержания актуальности кэша важно автоматически очищать его при обновлении записей, пользовательских данных или настроек. WP Super Cache уже поддерживает базовую очистку, но для кастомных типов данных можно добавить свой хук:
function wpsupercache_clear_cache_on_post_save( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) {
return;
}
if ( function_exists('wp_cache_clear_cache') ) {
wp_cache_clear_cache();
}
}
add_action( 'save_post', 'wpsupercache_clear_cache_on_post_save' );
Это обеспечит сброс кэша при обновлении любых записей, что особенно важно при кэшировании AJAX и REST API.
Используя данные рекомендации, вы сможете значительно повысить производительность вашего WordPress-сайта, корректно кэшируя разные типы запросов с помощью WP Super Cache и дополнительных решений.