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-ajax.php ), щоб вимкнути браузерне кешування, виставлене в налаштуваннях сервера nginx або apache (htaccess). Включений барузерний кеш в адмінці заважатиме нормальній роботі WP.
wp_get_nocache_headers()
Хуків немає.
Повертає
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 MYH: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 MYH: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.0.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}"); } }