WP функция/фильтр для модификации HTTP заголовков?
Существует ли специальная функция, действие или фильтр в WordPress для добавления/изменения HTTP заголовков?
Сейчас я просто добавляю вызов PHP функции header() через хук 'init' в WordPress таким образом:
add_action('init', 'add_header_xua');
function add_header_xua(){
if(!is_admin()){
header('X-UA-Compatible: IE=edge,chrome=1');
}
}
Но является ли это правильным способом?
Вот код, который я использовал, основанный на оригинальном вопросе и ответе Dominic P...
/*
* Изменение HTTP-заголовка
*/
function add_header_xua($headers) {
// var_dump($headers); #=> если вы хотите увидеть текущие заголовки...
if (!is_admin()) {
$headers['X-UA-Compatible'] = 'IE=edge,chrome=1';
}
return $headers;
}
add_filter('wp_headers', 'add_header_xua');
После добавления этого кода в файл functions.php, вы можете проверить его работу, выполнив тест на http://web-sniffer.net/, чтобы убедиться, что HTTP-заголовки действительно изменились.

Я знаю, что прошло некоторое время, но если кто-то ещё наткнётся на это, я нашёл специальный хук WordPress для изменения HTTP-заголовков. Хук называется wp_headers
, и он вызывается в классе wp.
Первый аргумент, который передаётся, — это массив заголовков, где ключом является имя заголовка. Второй аргумент — это ссылка на объект класса wp.

Есть еще один хук: send_headers
. Я не вижу "wp_headers" в списке хуков.

Хм, это интересно. Посмотрите фильтр wp_headers здесь.

Я думаю (но не уверен), что есть "внутренние" хуки (такие как wp_headers) и "публичные" хуки (такие как "send_headers"). "Внутренние" хуки с большей вероятностью могут быть изменены в будущих релизах. "Публичные" хуки считаются более "стабильными". Но возможно я ошибаюсь, я не нашел источников, подтверждающих это ощущение, которое у меня сложилось в ходе различных исследований хуков.

Это вполне возможно, но в данном случае похоже, что два хука просто выполняют разные функции. send_headers
— это экшен, который срабатывает после отправки заголовков, тогда как wp_headers
— это фильтр для заголовков, который применяется до их отправки.

Что ж... если тот факт, что только у send_headers
есть страница в кодексе, является каким-то показателем того, какой из них использовать...

Однако учтите, что команда WordPress пытается перейти от кодекса к новому справочнику по коду

wp_headers
— это фильтр внутри функции send_headers(). Для решения данной конкретной задачи лучше использовать фильтр send_headers
, так как он имеет приоритет над wp_headers
. Важно отметить, что send_headers
выполняется после проверки заголовка "Last-Modified". Используя send_headers
вместо wp_headers
, мы гарантируем, что наш тег X-UA-Compatible
будет отправлен даже если страница была закэширована статически, чего wp_headers
сделать не сможет.

@Брайан, интересное объяснение. Но мне любопытно: если страница закэширована статически и отдаётся до выполнения wp_headers
, как тогда может работать send_headers
, если он выполняется после wp_headers
? Разве выполнение всей функции send_headers()
вместе с остальной частью WordPress не будет пропущено?

Эй, Доминик, если посмотреть внутрь функции send_headers() в этой точке, можно увидеть где подключается wp_headers
, а затем как функция продолжает работу, проверяя "Last-Modified" и затем выполняя send_headers do_action_ref_array( 'send_headers', array( &$this ) );. Таким образом, используя этот экшен, мы подключаемся уже после проверки, была ли страница закэширована.

Доминик, я на самом деле узнал все это только сегодня, после того как задал почти идентичный вопрос. send_headers
— это фактически способ, который также демонстрируется в кодексе.

Думаю, ты, возможно, не совсем понимаешь, что делает функция send_headers()
в части с Last-Modified
. Весь этот блок кода только определяет, следует ли удалять заголовок Last-Modified
, и если да, то удаляет его. Если используется полное кэширование страницы, функция вообще не выполнится, и ни один из хуков ничего не сделает. Но в конечном итоге это, наверное, не так уж важно. Оба хука позволяют тебе установить заголовок. Как прокомментировал Мило в связанном твоем вопросе, один — это фильтр, другой — действие. Просто вопрос стиля написания кода.

хорошее замечание насчет хука, но помимо этого, является ли вызов 'сырой' функции header() (с использованием правильного хука) правильным способом, или есть обертка в WordPress, которую следует использовать для этого? Прямой вызов header позволяет только добавлять заголовки, а не изменять их, как это было бы возможно с фильтром (например, когда нужно манипулировать классом body)

header() — это единственный способ. Однако у неё есть второй параметр, который позволяет заменять существующие заголовки вместо добавления новых. Смотрите http://php.net/manual/en/function.header.php

send_headers
является предпочтительным методом по сравнению с wp_headers
в данной ситуации, как показано в кодексе.
is_admin() || add_action('send_headers', function(){
header('X-UA-Compatible: IE=edge,chrome=1');
}, 1);
Вот мое объяснение почему в похожем вопросе.
