AJAX запросы широко используются в современных WordPress-сайтах для динамического обновления контента без перезагрузки страницы. Однако кэширование таких запросов часто вызывает сложности, ведь стандартные кэш-плагины, включая WP Super Cache, по умолчанию не кешируют AJAX ответы, чтобы не нарушить логику работы сайта. В этой статье мы подробно разберём, как правильно организовать кэширование AJAX запросов в WordPress с использованием WP Super Cache и собственных решений, чтобы ускорить сайт и снизить нагрузку на сервер.
Почему кэширование AJAX запросов в WordPress важно
AJAX (Asynchronous JavaScript And XML) позволяет загружать и отображать данные без перезагрузки страницы, что улучшает пользовательский опыт. Однако каждый AJAX запрос, если он обращается к базе данных или API, создаёт нагрузку на сервер, особенно при большом трафике.
Без правильно настроенного кэширования AJAX-запросы выполняются «на живую» каждый раз, что снижает производительность сайта. Кэширование же позволяет сохранять результат запроса и отдавать его повторно без лишних вычислений.
WP Super Cache — один из популярных плагинов кэширования, умеет кэшировать HTML-страницы. Но AJAX запросы обычно не попадают в кэш по умолчанию, поскольку они требуют динамического, индивидуального ответа для каждого пользователя.
Особенности кэширования AJAX в WP Super Cache
WP Super Cache имеет механизм исключения кэширования для запросов, в которых передаётся параметр action в URL, что характерно для AJAX вызовов WordPress. Такие запросы считаются динамическими и не кэшируются по умолчанию.
Это сделано для того, чтобы не возвращать устаревшие данные или не мешать работе пользовательских функций и форм. Однако при правильной настройке можно кэшировать AJAX ответы, если они не зависят от сессии или персональных данных.
Как WP Super Cache обрабатывает AJAX запросы
По умолчанию WP Super Cache игнорирует все запросы с параметром action в URL. Это значит, что если вы используете стандартный WordPress AJAX через admin-ajax.php, плагин не будет кэшировать эти ответы.
Чтобы изменить это поведение, можно использовать фильтры плагина и собственный код для сохранения результатов AJAX в кэше вручную.
Реализация кэширования AJAX с помощью собственного кода и WP Super Cache
Давайте рассмотрим пример, как организовать кэширование пользовательского AJAX запроса с помощью WP Super Cache и transient API WordPress. Мы создадим AJAX обработчик, который сначала проверит, есть ли кэшированный ответ, и если нет — выполнит вычисления и сохранит результат в кэш.
Создание AJAX обработчика с кэшированием
add_action('wp_ajax_wpsupercache_get_data', 'wpsupercache_get_data_callback');
add_action('wp_ajax_nopriv_wpsupercache_get_data', 'wpsupercache_get_data_callback');
function wpsupercache_get_data_callback() {
// Получаем параметр (например, ID)
$param = isset($_GET['param']) ? sanitize_text_field($_GET['param']) : '';
// Ключ для transient — уникален для параметра
$cache_key = 'wpsupercache_ajax_data_' . md5($param);
// Пытаемся получить кэш
$cached = get_transient($cache_key);
if ($cached !== false) {
wp_send_json_success($cached);
}
// Если кэша нет, выполняем тяжелую операцию (например, запрос к базе)
$data = wpsupercache_generate_data($param);
// Сохраняем в кэш на 10 минут
set_transient($cache_key, $data, 10 * MINUTE_IN_SECONDS);
wp_send_json_success($data);
}
function wpsupercache_generate_data($param) {
// Здесь может быть любая логика: запросы к базе, API и т.п.
// Для примера возвращаем массив с датой и параметром
return [
'param' => $param,
'time' => current_time('mysql'),
];
}
Этот код создаёт AJAX обработчик wpsupercache_get_data, который сначала проверяет кэш, а если его нет — генерирует данные и записывает в transient. Таким образом, повторные запросы в течение 10 минут будут получать ответ из кэша без дополнительной нагрузки.
Вызов AJAX из JavaScript с кэшированием
Теперь пример вызова AJAX с фронтенда, используя jQuery:
jQuery(document).ready(function($) {
$('#load-data').on('click', function() {
var param = $('#input-param').val();
$.ajax({
url: wpsupercache_ajax_object.ajax_url,
data: {
action: 'wpsupercache_get_data',
param: param
},
dataType: 'json',
success: function(response) {
if(response.success) {
$('#result').html('Параметр: ' + response.data.param + '<br>Время: ' + response.data.time);
} else {
$('#result').html('Ошибка получения данных');
}
}
});
});
});
Не забудьте локализовать скрипт и передать ajax_url из PHP:
wp_enqueue_script('wpsupercache-ajax', get_template_directory_uri() . '/js/wpsupercache-ajax.js', ['jquery'], null, true);
wp_localize_script('wpsupercache-ajax', 'wpsupercache_ajax_object', [
'ajax_url' => admin_url('admin-ajax.php'),
]);
Дополнительные советы по кэшированию AJAX в WordPress
Использование WP Super Cache с внешними endpoint
Если вы создаёте собственные REST API или AJAX-ендпоинты вне admin-ajax.php, можно интегрировать WP Super Cache, настроив кэширование через mod_rewrite или PHP-кэш. Важно исключать персонализированные данные и использовать уникальные ключи кэша.
Управление временем жизни кэша и очистка
Transient API позволяет просто управлять временем жизни кэша. Если данные меняются по событию (например, обновление поста), нужно сбрасывать кэш вручную, используя delete_transient('wpsupercache_ajax_data_' . md5($param)).
Использование плагинов для расширенного кэширования AJAX
В некоторых случаях полезно использовать плагины, которые поддерживают кэширование REST API и AJAX, например, Clearfy Pro. Они позволяют гибко управлять кэшированием и исключениями.
Заключение
Кэширование AJAX запросов — важный этап оптимизации производительности сайта на WordPress. Стандартный WP Super Cache не кэширует их автоматически, но с помощью transient API и кастомных обработчиков можно организовать эффективный кэш. Это снижает нагрузку на сервер и ускоряет отклик сайта, улучшая опыт пользователей. Рекомендуется тщательно тестировать логику кэша, особенно если данные персонализированы или быстро меняются.