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.