Вопрос или проблема
Я пытаюсь изменить заголовок cache-control для определенного поста (1234). Попробовал добавить следующее в конец моего functions.php:
add_filter('wp_headers', 'wp_test_headers');
function wp_test_headers($headers)
{
if ( is_single ( 1234) ) {
$headers['Cache-Control']="no-store, no-cache, must-revalidate, max-age=0";
}
return $headers;
}
Однако, когда я открываю страницу поста в браузере, условие никогда не выполняется. Должен ли я добавлять фильтр в другое место или проблема в чем-то другом?
из Как изменить HTTP-заголовки только для постов определенной категории из плагина:
add_action( 'template_redirect', 'update_header_cache' );
function update_header_cache() {
if( is_single( 1234) ) {
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: Thu, 01 Dec 1990 16:00:00 GMT');
}
}
Проблема в вашем коде возникает, потому что фильтр wp_headers запускается слишком рано в процессе выполнения WordPress, чтобы использовать условные теги, такие как is_single(), для определения текущей страницы. Чтобы достичь желаемого результата, используйте hook template_redirect, который выполняется в нужный момент для изменения заголовков на основе контекста текущей страницы. Вот как это сделать:
add_action(‘template_redirect’, ‘modify_cache_control_header’);
function modify_cache_control_header() {
if (is_single(1234)) {
header(‘Cache-Control: no-store, no-cache, must-revalidate, max-age=0’);
header(‘Pragma: no-cache’);
header(‘Expires: Thu, 01 Jan 1970 00:00:00 GMT’);
}
}
.
Ответ или решение
Теория
Ваша задача состоит в том, чтобы изменить HTTP-заголовки для конкретного поста в WordPress. Ваш первоначальный подход с использованием фильтра wp_headers
не работает, поскольку этот фильтр вызывается на слишком ранней стадии выполнения WordPress, когда еще невозможно корректно определить текущий контекст страницы с использованием условных тегов, таких как is_single()
.
Для успешной модификации заголовков на уровне конкретного поста следует использовать хук template_redirect
, который позволяет точно определить контекст страницы перед её окончательной отгрузкой в браузер.
Пример
Давайте посмотрим на корректный пример кода, который реализует решение:
add_action('template_redirect', 'modify_cache_control_header');
function modify_cache_control_header() {
if (is_single(1234)) {
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
}
}
В данном коде хук template_redirect
используется для вызова функции modify_cache_control_header
, которая в свою очередь проверяет, является ли текущая страница постом с ID 1234. Если это так, она устанавливает необходимые заголовки кэширования.
Применение
Чтобы применить это решение, выполните следующие шаги:
-
Откройте файл functions.php: Перейдите в вашу административную панель WordPress и откройте редактор тем, выбрав файл
functions.php
активной темы. -
Добавьте код в functions.php: Вставьте приведенный выше код в
functions.php
. Убедитесь, что вы не нарушаете синтаксис PHP, и включите защиту от инъекций, предусмотрев корректное закрытие и открытие тэгов PHP. -
Проверьте результаты: Откройте браузер и навигацию к посту с ID 1234, чтобы убедиться, что заголовки изменены как ожидалось. Вы можете использовать инструменты разработчика вашего браузера для проверки HTTP-заголовков.
Это решение корректно выполняет поставленную задачу, обеспечивая изменение заголовков HTTP для указанного поста за счёт использования подходящего хука WordPress и проверки текущего контекста страницы.