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 Отменим кэширование в браузере
Отменим кэширование страницы перед тем как выполнять какой-либо код связанный с сессиями или который выводит информацию которая всегда должна быть свежей:
// устанавливаем заголовки отменяющие кэш браузера nocache_headers(); // выполняем код
#2 Включаем кэширование для выборочного 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 года. Клиент никогда догадается как очищать кэш. Единственный способом - изменить параметры запроса, чтобы запрос стал другой для браузера.
Заметки
- Смотрите: wp_get_nocache_headers()
Список изменений
С версии 2.0.0 | Введена. |
Код nocache_headers() nocache headers WP 6.5.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}" ); } }