WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com wordpress jino

nocache_headers() WP 2.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()

Хуков нет.

Возвращает

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

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

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

Код nocache_headers: wp-includes/functions.php VER 4.9.8

<?php
function nocache_headers() {
	$headers = wp_get_nocache_headers();

	unset( $headers['Last-Modified'] );

	// In PHP 5.3+, make sure we are not sending a Last-Modified header.
	if ( function_exists( 'header_remove' ) ) {
		@header_remove( 'Last-Modified' );
	} else {
		// In PHP 5.2, send an empty Last-Modified header, but only as a
		// last resort to override a header already sent. #WP23021
		foreach ( headers_list() as $header ) {
			if ( 0 === stripos( $header, 'Last-Modified' ) ) {
				$headers['Last-Modified'] = '';
				break;
			}
		}
	}

	foreach ( $headers as $name => $field_value )
		@header("{$name}: {$field_value}");
}

Cвязанные функции

Из метки: PHP headers (заголовки куки)

Еще из раздела: Без рубрики

1 коммент
  • Geleosan cайт: life-trip.ru

    Не совсем по теме, но был бы рад, если что-то посоветуете. У меня проблема с тем, что иногда комментатор блога видит в полях Имя/Емей/Сайт не свои данные, а другого недавнего комментатора. Закономерности не нашел. Просто иногда люди пишут мне об этом. Причем я специально попросил вот только что комментатора проверить эти поля, после того, как я в W3TC очистил кеш, и тогда становится все в порядке, вместо чужих данных появляются свои.

    В W3TC у меня включен page cache, brouser cache и database cache. В настройке Page Cache для "comment cookie lifetime" стоит значение "-1", то есть кукисы хранятся, как и у самого вордпресса по умолчанию 1 год. Понимаю, что проблема не во времени хранения кукисов, а в том, что подставляются данные не из тех кукисов.

    Может сможете подсказать, в какую сторону копать? Что такого делает W3TC?

    P.S. C плагином Hyper Cache + DB Cache была подобная штука. Без плагинов проблемы не встречалось вроде бы.

    Ответить4.6 года назад #
Здравствуйте, !     Войти . Зарегистрироваться