AJAX-запросы в WordPress широко используются для динамического обновления контента без перезагрузки страницы. Однако иногда браузеры или серверные прокси могут кэшировать ответы на AJAX-запросы, что приводит к отображению устаревших данных. В этой статье мы рассмотрим, как правильно настроить удаление или отключение кэша для AJAX-запросов в WordPress без использования сторонних плагинов.
Почему возникает кэширование AJAX-запросов?
По умолчанию браузеры и промежуточные серверы (например, CDN или прокси) могут кэшировать ответы на GET-запросы, включая AJAX-запросы. Это происходит потому, что HTTP протокол предполагает, что GET-запросы являются идемпотентными, и их результаты можно кешировать для оптимизации скорости загрузки.
В WordPress AJAX-запросы часто реализуются через admin-ajax.php, и если не указать специальные заголовки, браузер может использовать старый кэшированный ответ.
Для POST-запросов кэш обычно не применяется, но иногда и их можно заставить кэшироваться при неправильной настройке сервера.
Как отключить кэш для AJAX-запросов в WordPress (HTTP-заголовки)
Самый надежный способ — отправлять специальные HTTP-заголовки, которые запрещают кэширование ответа. Их можно добавить в функцию, обрабатывающую AJAX-запрос.
Пример функции обработчика AJAX-запроса с необходимыми заголовками:
add_action('wp_ajax_wp_puzzle_no_cache_ajax', 'wp_puzzle_no_cache_ajax_handler');
add_action('wp_ajax_nopriv_wp_puzzle_no_cache_ajax', 'wp_puzzle_no_cache_ajax_handler');
function wp_puzzle_no_cache_ajax_handler() {
// Отключаем кэширование
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);
}
Здесь:
Cache-Control: no-cache, no-store, must-revalidate— говорит браузеру и прокси не кэшировать ответ;Pragma: no-cache— устаревший, но поддерживаемый заголовок для совместимости;Expires: 0— дата истечения срока действия ответа уже наступила.
Этим вы гарантируете, что ответ на AJAX-запрос не будет кешироваться.
Как удалить кэшированные AJAX-ответы на стороне клиента (JavaScript)
Иногда браузер может кэшировать GET-запросы, даже если сервер отправляет заголовки. Чтобы полностью исключить кэширование, можно добавить уникальный параметр к URL AJAX-запроса — например, временную метку.
Пример использования jQuery:
jQuery.ajax({
url: ajaxurl + '?action=wp_puzzle_no_cache_ajax&_=' + new Date().getTime(),
method: 'GET',
success: function(response) {
console.log('Ответ сервера:', response);
}
});
Этот трюк заставит браузер считать каждый запрос уникальным и не использовать кэш.
Если вы используете fetch API:
fetch(ajaxurl + '?action=wp_puzzle_no_cache_ajax&_=' + Date.now(), {
method: 'GET',
credentials: 'same-origin'
})
.then(response => response.json())
.then(data => console.log('Ответ сервера:', data));
Особенности работы с POST AJAX-запросами
POST-запросы по умолчанию не кэшируются браузерами, но на некоторых серверах или при использовании CDN могут возникать нюансы. Рекомендуется также отправлять заголовки для запрета кэширования, как показано выше.
Пример POST-запроса с fetch:
fetch(ajaxurl, {
method: 'POST',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
body: new URLSearchParams({
action: 'wp_puzzle_no_cache_ajax'
})
})
.then(response => response.json())
.then(data => console.log('Ответ сервера:', data));
Использование плагинов для управления кэшированием AJAX
Хотя задача решается кодом, иногда удобнее использовать плагины с расширенными функциями управления кэшом. Например, Clearfy Pro позволяет эффективно управлять кэшированием и отключать его для отдельных запросов.
Также WPRemark и My Popup используют AJAX, где важно контролировать кэширование для актуальных данных.
Диагностика и проверка отключения кэша AJAX
Чтобы убедиться, что кэш отключен, можно использовать инструменты разработчика в браузере (Chrome DevTools, Firefox Developer Tools):
- Откройте вкладку Network;
- Отправьте AJAX-запрос;
- Выберите запрос admin-ajax.php и посмотрите заголовки Response Headers — должны присутствовать
Cache-Control: no-cache, no-store, must-revalidateи другие заголовки; - Проверьте, что в колонке Size не отображается (from cache) или аналогичные отметки.
Если кэш всё ещё используется, попробуйте добавить параметр _ с уникальным значением к URL запроса, как показано в примерах выше.
Резюме: практические шаги для удаления кэша AJAX в WordPress
- Добавьте в обработчик AJAX-запроса заголовки для отключения кэширования;
- На стороне клиента добавьте уникальный параметр в URL GET-запроса;
- Для POST-запросов также отправляйте заголовки отключения кэша;
- Проверьте работу через инструменты разработчика;
- При необходимости используйте плагины, например Clearfy Pro, для расширенного контроля.