В WordPress AJAX — это мощный инструмент для динамического обновления контента без перезагрузки страницы. Однако одна из частых проблем — это слишком жёсткое кэширование AJAX ответов на стороне сервера или прокси, из-за чего динамические данные не обновляются, и пользователь видит устаревшую информацию.
Почему возникает жёсткое кэширование AJAX в WordPress
Кэширование — важный элемент оптимизации производительности сайта. Обычно WordPress и плагины используют кэширование страниц, объектов и запросов, чтобы ускорить загрузку. Но AJAX запросы должны быть всегда «свежими», так как от них зависит интерактивность и актуальность данных.
Проблема возникает, когда сервер, прокси (например, Varnish, Cloudflare) или плагины кэшируют AJAX ответы, несмотря на то, что они должны быть исключены из кэширования. Это приводит к тому, что пользователь получает старые данные.
Кроме того, некоторые темы или плагины могут некорректно обрабатывать AJAX запросы, например, неправильно выставлять HTTP заголовки кэширования.
Как выявить, что AJAX запросы кэшируются
- Откройте инструменты разработчика в браузере (F12) и перейдите на вкладку Network.
- Отправьте AJAX запрос (например, вызовите функционал, который обновляет часть страницы).
- Посмотрите заголовки ответа. Если есть заголовок
Cache-Controlс директивами типаmax-ageилиpublic, это может указывать на кэширование. - Если данные не меняются при повторных запросах, скорее всего, кэширование действительно происходит.
Как отключить кэширование AJAX запросов в WordPress и на сервере
Самый простой и надёжный способ — правильно настроить заголовки HTTP для AJAX ответов. WordPress AJAX запросы обычно идут по адресу admin-ajax.php и используют параметр action. Мы можем добавить фильтр, который отключит кэширование для этих запросов.
function wpfind_disable_ajax_cache() {
if (defined('DOING_AJAX') && DOING_AJAX) {
nocache_headers(); // отключает кэширование
}
}
add_action('send_headers', 'wpfind_disable_ajax_cache');Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин.
Функция nocache_headers() выставляет необходимые HTTP заголовки, запрещающие кэширование. Это помогает предотвратить кэширование на уровне браузера и большинства серверов.
Однако иногда прокси-серверы или CDN (например, Cloudflare) игнорируют эти заголовки. В таком случае нужно настроить правила исключения для admin-ajax.php на стороне CDN.
Пример настройки исключения в Cloudflare
В панели управления Cloudflare зайдите в раздел Page Rules и добавьте правило для URL https://ваш_домен/admin-ajax.php*, где укажите опцию «Bypass cache».
Плагины для управления кэшированием AJAX запросов
Если вы используете плагины кэширования, есть смысл проверить их настройки и возможности:
- WP Rocket — в настройках есть опция исключения AJAX URL из кэширования. Обычно
admin-ajax.phpисключён по умолчанию, но стоит проверить. - W3 Total Cache — в разделе Page Cache можно добавить исключения по URL.
- LiteSpeed Cache — также поддерживает правила для исключения AJAX запросов.
Если плагин не позволяет гибко настраивать исключения, можно воспользоваться хуком PHP, показанным выше.
Дополнительные советы и примеры кода для разработчиков
Как добавить заголовки для REST API запросов
Если вы используете REST API, аналогичная проблема может возникать и там. Чтобы отключить кэширование для REST API ответов, можно использовать фильтр:
function wpfind_disable_rest_cache($response, $server, $request) {
$response->header('Cache-Control', 'no-cache, no-store, must-revalidate');
$response->header('Pragma', 'no-cache');
$response->header('Expires', '0');
return $response;
}
add_filter('rest_post_dispatch', 'wpfind_disable_rest_cache', 10, 3);Этот код обеспечивает правильные заголовки, чтобы REST API ответы не кэшировались.
Как отладить AJAX запросы с помощью консоли
Для проверки работы AJAX можно добавить вывод в консоль браузера в JavaScript, например:
jQuery(document).ready(function($) {
$.ajax({
url: ajaxurl,
method: 'POST',
data: { action: 'wpfind_test_ajax' },
success: function(response) {
console.log('AJAX response:', response);
}
});
});И в PHP-файле добавить обработчик:
function wpfind_test_ajax_callback() {
echo 'AJAX работает и не кэшируется';
wp_die();
}
add_action('wp_ajax_wpfind_test_ajax', 'wpfind_test_ajax_callback');
add_action('wp_ajax_nopriv_wpfind_test_ajax', 'wpfind_test_ajax_callback');Если вы видите консольное сообщение и оно актуально при каждом запросе, значит кэширование отключено.
Выводы и рекомендации
Жёсткое кэширование AJAX запросов — частая проблема, которая может сбивать динамическую логику сайта. Чтобы с ней справиться, нужно:
- Правильно выставлять HTTP заголовки для AJAX ответов с помощью
nocache_headers()в WordPress. - Проверять и настраивать исключения кэширования на уровне CDN и прокси.
- Использовать настройки кэш-плагинов для исключения AJAX URL.
- Тестировать AJAX ответы с помощью инструментов разработчика и консоли.
Следуя этим рекомендациям, вы сможете обеспечить корректную работу динамического функционала на вашем сайте WordPress без сбоев из-за кэширования.