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" в списке хуков.
pixeline
Хм, это интересно. Посмотрите фильтр wp_headers здесь.
Dominic P
Я думаю (но не уверен), что есть "внутренние" хуки (такие как wp_headers) и "публичные" хуки (такие как "send_headers"). "Внутренние" хуки с большей вероятностью могут быть изменены в будущих релизах. "Публичные" хуки считаются более "стабильными". Но возможно я ошибаюсь, я не нашел источников, подтверждающих это ощущение, которое у меня сложилось в ходе различных исследований хуков.
pixeline
Это вполне возможно, но в данном случае похоже, что два хука просто выполняют разные функции. send_headers — это экшен, который срабатывает после отправки заголовков, тогда как wp_headers — это фильтр для заголовков, который применяется до их отправки.
Dominic P
Что ж... если тот факт, что только у send_headers есть страница в кодексе, является каким-то показателем того, какой из них использовать...
drzaus
Однако учтите, что команда WordPress пытается перейти от кодекса к новому справочнику по коду
Dominic P
wp_headers — это фильтр внутри функции send_headers(). Для решения данной конкретной задачи лучше использовать фильтр send_headers, так как он имеет приоритет над wp_headers. Важно отметить, что send_headers выполняется после проверки заголовка "Last-Modified". Используя send_headers вместо wp_headers, мы гарантируем, что наш тег X-UA-Compatible будет отправлен даже если страница была закэширована статически, чего wp_headers сделать не сможет.
Bryan Willis
@Брайан, интересное объяснение. Но мне любопытно: если страница закэширована статически и отдаётся до выполнения wp_headers, как тогда может работать send_headers, если он выполняется после wp_headers? Разве выполнение всей функции send_headers() вместе с остальной частью WordPress не будет пропущено?
Dominic P
Эй, Доминик, если посмотреть внутрь функции send_headers() в этой точке, можно увидеть где подключается wp_headers, а затем как функция продолжает работу, проверяя "Last-Modified" и затем выполняя send_headers do_action_ref_array( 'send_headers', array( &$this ) );. Таким образом, используя этот экшен, мы подключаемся уже после проверки, была ли страница закэширована.
Bryan Willis
Доминик, я на самом деле узнал все это только сегодня, после того как задал почти идентичный вопрос. send_headers — это фактически способ, который также демонстрируется в кодексе.
Bryan Willis
Думаю, ты, возможно, не совсем понимаешь, что делает функция send_headers() в части с Last-Modified. Весь этот блок кода только определяет, следует ли удалять заголовок Last-Modified, и если да, то удаляет его. Если используется полное кэширование страницы, функция вообще не выполнится, и ни один из хуков ничего не сделает. Но в конечном итоге это, наверное, не так уж важно. Оба хука позволяют тебе установить заголовок. Как прокомментировал Мило в связанном твоем вопросе, один — это фильтр, другой — действие. Просто вопрос стиля написания кода.
Dominic P
хорошее замечание насчет хука, но помимо этого, является ли вызов 'сырой' функции header() (с использованием правильного хука) правильным способом, или есть обертка в WordPress, которую следует использовать для этого? Прямой вызов header позволяет только добавлять заголовки, а не изменять их, как это было бы возможно с фильтром (например, когда нужно манипулировать классом body)
mikkelbreum
header() — это единственный способ. Однако у неё есть второй параметр, который позволяет заменять существующие заголовки вместо добавления новых. Смотрите http://php.net/manual/en/function.header.php
Otto
send_headers является предпочтительным методом по сравнению с wp_headers в данной ситуации, как показано в кодексе.
is_admin() || add_action('send_headers', function(){
header('X-UA-Compatible: IE=edge,chrome=1');
}, 1);
Вот мое объяснение почему в похожем вопросе.