WP функция/фильтр для модификации HTTP заголовков?

16 июн. 2011 г., 18:40:21
Просмотры: 18K
Голосов: 19

Существует ли специальная функция, действие или фильтр в 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');    
    }
}

Но является ли это правильным способом?

0
Все ответы на вопрос 4
0
15

Вот код, который я использовал, основанный на оригинальном вопросе и ответе 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-заголовки действительно изменились.

13 февр. 2014 г. 16:56:29
11
11

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

Первый аргумент, который передаётся, — это массив заголовков, где ключом является имя заголовка. Второй аргумент — это ссылка на объект класса wp.

28 мар. 2013 г. 00:10:27
Комментарии

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

pixeline pixeline
1 нояб. 2014 г. 20:26:31

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

Dominic P Dominic P
1 нояб. 2014 г. 20:39:22

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

pixeline pixeline
1 нояб. 2014 г. 20:43:48

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

Dominic P Dominic P
2 нояб. 2014 г. 20:22:06

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

drzaus drzaus
11 дек. 2015 г. 22:14:42

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

Dominic P Dominic P
12 дек. 2015 г. 21:48:57

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

Bryan Willis Bryan Willis
8 янв. 2016 г. 07:11:28

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

Dominic P Dominic P
8 янв. 2016 г. 09:08:34

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

Bryan Willis Bryan Willis
8 янв. 2016 г. 09:41:54

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

Bryan Willis Bryan Willis
8 янв. 2016 г. 09:44:41

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

Dominic P Dominic P
8 янв. 2016 г. 11:56:18
Показать остальные 6 комментариев
2

Действие init — это неподходящее место для этого. Лучше использовать template_redirect, чтобы изменения затрагивали только фронтенд сайта, а не админку.

16 июн. 2011 г. 18:54:03
Комментарии

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

mikkelbreum mikkelbreum
16 июн. 2011 г. 19:04:44

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

Otto Otto
17 июн. 2011 г. 21:49:11
0

send_headers является предпочтительным методом по сравнению с wp_headers в данной ситуации, как показано в кодексе.

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);

Вот мое объяснение почему в похожем вопросе.

8 янв. 2016 г. 09:51:17