nocache_headers()
Устанавливает заголовки, которые предотвращают кэширование во всех браузерах.
nocache_headers() нужно использовать до вывода любой информации на экран.
функция удаляет http заголовок Last-Modified или устанавливает ему пустое значение. Также прописывает другие заголовки связанные с кэшированием страниц браузером которые возвращает функция wp_get_nocache_headers():
Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Pragma: no-cache
Эта функция используется по всей админ-панели WordPress (wp-admin/admin.php) и при ajax запросах (wp-admin/admin-ajax.php), чтобы отключить браузерное кэширование выставленное в настройках сервера nginx или apache (htaccess). Включенный барузерный кэш в админке будет мешать нормальной работе WP...
Хуков нет.
Возвращает
null. Ничего не возвращает.
Использование
nocache_headers();
Примеры
#1 Включаем кэширование для выборочного AJAX запроса
Допустим, нам нужно чтобы наш АЯКС запрос кэшировался в браузере и при повторении этого запроса в течении указанного времени браузер брал данные из кэша и не делал AJAX запрос.
Добиться этого можно путем установки нужных для кэширования заголовков. Сделать это можно напрямую или через фильтр nocache_headers.
Вариант: через фильтр 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 запроса
// результат этого запроса будет кэшироваться в браузере!
}
Плюс этого варианта:
Установку кэширования можно сделать сразу для нескольких событий, просто дописав проверку названия события.
Вариант: напряямую в коде
Напрямую в коде зачастую удобнее, потому что заголовки можно установить прямо в функции обработчике AJAX запроса.
Допустим наше AJAX событие называется my_ajax_action, тогда:
// Функция обработчик 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 года. Клиент никогда догадается как очищать кэш. Единственный способом - изменить параметры запроса, чтобы запрос стал другой для браузера.
#2 Отменим кэширование в браузере
Отменим кэширование страницы перед тем как выполнять какой-либо код связанный с сессиями или который выводит информацию которая всегда должна быть свежей:
// устанавливаем заголовки отменяющие кэш браузера nocache_headers(); // выполняем код
#3 Добавим собственные nocache заголовки к стандартным
Давайте добавим свои дополнительные заголовки для всех вызовов функции 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 \G\M\T', time() )
] + $headers;
} );
Функция вызывается, например, для всех страниц администрирования.
Заметки
- Смотрите: wp_get_nocache_headers()
Список изменений
| С версии 2.0.0 | Введена. |
Код nocache_headers() nocache headers WP 6.9.4
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}" );
}
}