Функция nocache_headers() в WordPress: Как предотвратить кэширование в браузере

NOCACHE_HEADERS() │ WP 2.0.0

Функция nocache_headers() устанавливает заголовки, чтобы предотвратить кэширование в различных браузерах.

Разные браузеры поддерживают разные заголовки для предотвращения кэширования, поэтому необходимо отправить несколько заголовков, чтобы все браузеры поняли, что кэширование не должно происходить.

Использование

Функция для вызова:

nocache_headers();

Пример

1. Отмена кэширования в браузере

Отмените кэширование страницы перед выполнением какого-либо кода, связанного с сессиями или выводящего информацию, которая всегда должна быть актуальной:

// Устанавливаем заголовки, переопределяющие кэш браузера
nocache_headers();

// Выполняем нужный код

2. Включение кэширования для селективных AJAX-запросов

Предположим, что нам нужно, чтобы наш AJAX-запрос кэшировался в браузере. Когда этот запрос повторяется в течение определённого времени, браузер берет данные из кэша и не выполняет новый AJAX-запрос.

Это можно сделать, установив правильные заголовки для кэширования. Вот как это можно реализовать.

Вариант 1: Использование фильтра nocache_headers

Вам нужно вставить фильтр прямо в код PHP и убедиться, что он работает для вашего запроса, чтобы кэширование работало для других запросов.

Предположим, что наше AJAX-событие называется my_ajax_action, тогда:

add_filter('nocache_headers', function($headers) {
    // Включаем кэширование только для нашего события
    if ($_REQUEST['action'] === 'my_ajax_action') {
        $life_time = HOUR_IN_SECONDS; // кэшируем на один час

        $headers = array(
            'Expires'       => gmdate('D, d M Y H:i:s', time() + $life_time) . ' GMT',
            'Cache-Control' => 'public',
        );
    }

    return $headers;
});

// Обработчик AJAX-запроса
add_action('wp_ajax_' . 'my_ajax_action', 'my_ajax_action_function');
function my_ajax_action_function() {
    // делаем что-то и возвращаем результат в AJAX-запрос
    // результат этого запроса будет кэшироваться в браузере!
}

Плюс этого варианта: Вы можете установить кэширование для нескольких событий одновременно, просто добавив проверку имени события.

Вариант 2: Прямо в коде обработчика

Устанавлива��ь заголовки прямо в функции-обработчике AJAX-запроса может быть удобнее, потому что заголовки можно задать прямо там.

// Обработчик AJAX-запроса
add_action('wp_ajax_' . 'my_ajax_action', 'my_ajax_action_function');
function my_ajax_action_function() {
    // Включаем кэширование в браузере
    $life_time = HOUR_IN_SECONDS; // кэшируем на один час
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $life_time) . ' GMT');
    header('Cache-control: public');

    // делаем что-то и возвращаем результат AJAX-запросу
    // результат этого запроса будет кэшироваться в браузере!
}

Плюс этого варианта: Меньше кода, и настройка кэширования осуществляется прямо в функции-обработчике.

Недостаток этого метода: Вы не сможете программно удалить этот кэш. Если браузер его закэшировал, то всё. Например, вы случайно сделали кэш на 3 года. Клиент никогда не поймет, как очистить этот кэш. Единственный способ — изменить параметры запроса, так чтобы запрос стал другим для браузера.

3. Добавление собственных заголовков для всех вызовов wp_get_nocache_headers()

Давайте добавим свои заголовки для всех вызовов функции wp_get_nocache_headers(), которая вызывается, например, для всех админ страниц. Мы используем фильтр nocache_headers для этой цели:

add_filter('nocache_headers', function($headers) {
    return [
        'Cache-Control' => 'no-store, no-cache, must-revalidate, max-age=0, some-custom-thing',
        'Pragma'        => 'no-cache',
        'Expires'       => gmdate('D, d M Y H:i:s GMT', time())
    ] + $headers;
});

Примечания

Для более детальной информации обратитесь к функции wp_get_nocache_headers().

Изменения

Функция была введена в версии 2.0.0.

Код функции nocache_headers()

В WordPress 6.7.2 эта функция выглядит следующим образом:

function nocache_headers() {
    if (headers_sent()) {
        return;
    }

    $headers = wp_get_nocache_headers();

    unset($headers['Last-Modified']);
    header_remove('Last-Modified');

    foreach ($headers as $name => $field_value) {
        header("{$name}: {$field_value}");
    }
}

Связанные функции

  • wp_set_auth_cookie()
  • wp_shortlink_header()
  • do_robots()
  • wp_mail()
  • и другие.

Эти функции так или иначе связаны с управлением заголовками и кэшированием в WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *