wp_headers против send_headers. Когда использовать каждый?

10

Я видел, wp_headersи send_headersоба использовали раньше для одного и того же, и мне интересно, как вы думаете, какой из них использовать и когда ...

На send_headersстранице кодекса есть пример добавления X-UA-Compatible: IE=edge,chrome=1обратной совместимости для Internet Explorer, так как метатег часто дает сбой на сайтах интрасети, если загружается слишком поздно .

Вот как send_headersвыглядит пример:

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

Однако wp_headersтакже может сделать это:

apply_filters ( 'wp_headers', array $headers, WP $this )

add_filter( 'wp_headers', 'wpieeam_headers' );
function wpieeam_headers($headers) {
    if (!is_admin()) {
        $headers['X-UA-Compatible'] = 'IE=edge,chrome=1';    
    }
    return $headers;
}

Обновление: я только что заметил, что разговор об этом более или менее начался по похожему вопросу пару лет назад ...

Кроме того, send_headers имеет отношение только к внешнему интерфейсу? Я видел, как wp_headers делает такие проверки:

if ( isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) )

а также

if (!is_admin()) 

так что я думаю, что, возможно send_headers, не нужно делать эти проверки ...

Брайан Уиллис
источник
1
Вообще говоря, одно - это действие, а другое - фильтр. Действия предназначены для выполнения чего-либо, когда происходит событие, а фильтр - для изменения чего-либо до его использования.
Мило

Ответы:

9

Хорошо, так что я думаю, что я понял это ...

Обе они работают по большей части, как и следовало ожидать, отправляя заголовки http / php в браузер. wp_headersна самом деле это фильтр внутри send_headers()функций. Вы можете использовать его для изменения заголовков, прежде чем они будут отправлены в браузер, за некоторым исключением. wp_headersне сможет ничего сделать, если это статическая кэшированная страница имела дело с ...

Это где send_headersкрюк вступает в игру. После wp_headersфильтра send_headers()функция, проверяющая Last-Modified, была ли отправлена ​​с, сообщит нам, была ли страница кэширована или нет, и затем позволяет нам подключиться к ней после того, как все кэширование, тип контента и т. Д. Были отправлены.

Так что для моего примера использования X-UA-Compatible, пока они оба работают, я склонен использовать send_headers. Почему? Например, если вы добавите оба из них, send_headersкаждый раз будет выигрывать и гарантировать, что он был загружен, даже если он был добавлен после кэширования страницы.

Хотя использование <meta>тега, как и многие популярные фреймворки , также будет работать для x-ua-совместимого, оно не будет работать во многих браузерах, если не будет загружено почти сразу после открывающего тега head. Это вызвано различными причинами, например, если настройка «интрасеть» установлена ​​в сети . По этой причине использование метода php безопаснее. Однако, если бы вы добавили оба, метатег победил бы (при условии, что он включался достаточно рано).

Что касается X-UA-Compatibleсовместимости, я надеюсь, что это скоро будет неактуально, так как Microsoft на следующей неделе прекращает поддержку более старых версий IE!


Кроме того, я протестировал wp_headersфильтр без использования is_admin()проверки, и он не изменит admin_headers, так что проверка не нужна.

Если вам по какой-то причине нужно было изменить заголовки администратора, я знаю, что вы можете сделать это следующим образом, но я не уверен, будет ли это работать постоянно ...

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

Обновленный ответ основан на предложении Toscho проверить администратора:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
Брайан Уиллис
источник
2
Вы должны все еще использовать is_admin() || add_action( … ), потому что нет необходимости загрязнять список зарегистрированных обратных вызовов, если вам это не нужно.
fuxia
Интересно, что ... Я создавал WordPress сайты уже около десяти лет, и я никогда не видел этот формат до того, как использовал символ или. Я на самом деле задал вопрос о том, как правильно отформатировать условия пару лет назад, если вы хотите добавить такой подход.
Брайан Уиллис
Тошо Я обновил свой ответ на основе вашего предложения. Это то, что вы имели в виду?
Брайан Уиллис
Да, выглядит правильно. :)
fuxia
« send_headersБудет выигрывать каждый раз и будет гарантировать, что он был загружен, даже если он был добавлен после того, как страница была кэширована» - просто заметьте, что send_headersэто не работает, чтобы превзойти кэширование страниц, используемое плагинами, такими как W3 Total Cache, в моих тестах, или любое статическое кэширование это эффективно обходит WordPress на уровне сервера.
Ник