Как удалить кэш AJAX-запросов в WordPress без плагинов

В 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-запросы. Однако базовое отключение кэша через заголовки и правильная настройка исключений в плагинах кэширования часто решают проблему без хлопот.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать собственные таблицы в базе данных WordPress: практическое руководство
02.01.2026
Как полностью настроить страницу входа в WordPress: плагины и примеры кода
10.01.2026
Как создать автоматический редирект после изменения URL в WordPress
10.02.2026
Как использовать REST API в WordPress для создания приложений
05.12.2025
Как изменить динамические URL в WordPress с помощью фильтров
15.03.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее