WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

nocache_headers()WP 2.0.0

Устанавливает заголовки, которые предотвращают кэширование во всех браузерах.

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...

Работает на основе: wp_get_nocache_headers()

Хуков нет.

Возвращает

null. Ничего не возвращает.

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

nocache_headers();

Примеры

0

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

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

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

// выполняем код
0

#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 года. Клиент никогда догадается как очищать кэш. Единственный способом - изменить параметры запроса, чтобы запрос стал другой для браузера.

Заметки

Список изменений

С версии 2.0.0 Введена.

Код 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}" );
	}
}
2 комментария
    Войти