В WordPress нередко возникает ситуация, когда AJAX-запросы к серверу неожиданно кэшируются, что приводит к показу устаревших данных пользователям. Особенно это актуально для динамического контента, который должен обновляться мгновенно. В этой статье разберёмся, как удалить кэш AJAX-запросов без использования плагинов, используя чистый код и стандартные возможности WordPress.
Почему AJAX-запросы могут кэшироваться в WordPress
Сама по себе система AJAX в WordPress (через admin-ajax.php) не кэширует ответы. Однако кэширование может появляться из-за нескольких причин:
- Сторонние плагины кэширования (W3 Total Cache, WP Super Cache, LiteSpeed Cache и др.) могут кэшировать AJAX-ответы.
- Настройки сервера или CDN (например, Cloudflare) могут кэшировать AJAX-запросы.
- Некорректная настройка заголовков HTTP, которые не запрещают кэширование.
Удалить кэш можно на разных уровнях, но если нельзя или нежелательно использовать плагины, то стоит работать с заголовками и AJAX-хуками.
Как запретить кэширование AJAX-ответов через заголовки HTTP
Самый надёжный способ — отправить в ответе правильные заголовки, которые запрещают кэширование браузером и прокси. Для этого в функции-обработчике AJAX нужно использовать PHP-функцию header():
function wp_puzzle_no_cache_ajax_response() {
// Запрещаем кэширование
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
// Ваш код обработки AJAX
$data = array('time' => current_time('mysql'));
wp_send_json_success($data);
}
add_action('wp_ajax_wp_puzzle_no_cache_ajax_response', 'wp_puzzle_no_cache_ajax_response');
add_action('wp_ajax_nopriv_wp_puzzle_no_cache_ajax_response', 'wp_puzzle_no_cache_ajax_response');В этом примере мы явно запрещаем кэширование, отправляя заголовки, которые говорят браузеру и промежуточным прокси не сохранять ответ.
Объяснение заголовков:
Cache-Control: no-cache, no-store, must-revalidate— говорит, что кэшировать нельзя ни в браузере, ни в промежуточных кэших.Pragma: no-cache— для совместимости со старыми HTTP/1.0 прокси.Expires: 0— время истечения кэша уже прошло.
Избегаем кэширования на уровне JavaScript AJAX-запроса
Иногда полезно добавить уникальный параметр к URL AJAX-запроса, чтобы сервер и браузер воспринимали каждый запрос как уникальный. В jQuery для этого есть опция cache:false:
jQuery.ajax({
url: ajaxurl,
method: 'POST',
data: {
action: 'wp_puzzle_no_cache_ajax_response'
},
cache: false,
success: function(response) {
console.log(response.data.time);
}
});Это автоматически добавит к URL параметр с уникальным значением, например _=[timestamp], предотвращая кэширование на стороне клиента и прокси.
Как отключить кэширование AJAX-запросов в популярных плагинах кеширования
Если на сайте установлен плагин кэширования, нужно исключить AJAX-запросы из кэша. Обычно это можно сделать через настройки плагина:
- W3 Total Cache: в разделе Page Cache -> Never cache the following pages добавить
admin-ajax.php. - WP Super Cache: в настройках исключений добавить
wp-admin/admin-ajax.php. - LiteSpeed Cache: в настройках исключений добавить URL AJAX-запросов.
Если по каким-то причинам нет доступа к настройкам, можно добавить фильтр в functions.php, который отправит заголовки, запрещающие кэш:
function wp_puzzle_disable_cache_for_ajax() {
if (defined('DOING_AJAX') && DOING_AJAX) {
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
}
}
add_action('send_headers', 'wp_puzzle_disable_cache_for_ajax');Пример реализации: динамическое обновление счетчика без кэша
Допустим, нужно вывести число посетителей или количество новых заказов, которое обновляется без кэширования.
function wp_puzzle_get_live_count() {
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
$count = get_option('wp_puzzle_live_count', 0);
$count++;
update_option('wp_puzzle_live_count', $count);
wp_send_json_success(array('count' => $count));
}
add_action('wp_ajax_wp_puzzle_get_live_count', 'wp_puzzle_get_live_count');
add_action('wp_ajax_nopriv_wp_puzzle_get_live_count', 'wp_puzzle_get_live_count');JavaScript для периодического обновления счётчика:
setInterval(function() {
jQuery.ajax({
url: ajaxurl,
method: 'POST',
data: { action: 'wp_puzzle_get_live_count' },
cache: false,
success: function(response) {
if(response.success) {
jQuery('#live-count').text(response.data.count);
}
}
});
}, 5000);HTML-элемент для вывода:
<div id="live-count">0</div>Заключение: когда стоит использовать плагины для управления кэшем AJAX
Если вы хотите более гибко управлять кэшированием и оптимизировать производительность, можно обратить внимание на плагины типа Clearfy Pro или ABC Pagination, которые помогают управлять кэшом и оптимизируют AJAX-запросы. Однако базовое отключение кэша через заголовки и правильная настройка исключений в плагинах кэширования часто решают проблему без хлопот.