問題描述
我已經看到 wp_headers 和 send_headers 都用於同樣的事情,我想知道你是如何想知道使用哪一個,何時…
在 send_headers codex 頁面上有一個例子,為 Internet Explorer 向後相容新增 X-UA-Compatible: IE=edge,chrome=1,因為元標記通常是 fails on intranet sites if loaded too late 。
這就是 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;
}
更新:我實際上剛剛注意到,a conversation on this 或多或少在幾年前就類似的問題開始了…
另外,send_headers 只與前端有關嗎?我看過 wp_headers 做這樣的檢查:
if ( isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) )
和
if (!is_admin())
所以我在想,也許 send_headers 不必做這些檢查…
最佳解決方案
好吧,我想我想出來了
這兩個工作大部分是透過將 http /php 標頭髮送到瀏覽器來預期的。 wp_headers 實際上是 send_headers()功能中的一個過濾器。您可以使用它來修改標題,然後將其傳送到瀏覽器,但有一些例外。 wp_headers 將無法做任何事情,如果它是一個靜態快取頁面處理…
這是 send_headers 鉤子發揮作用的地方。在 wp_headers 過濾器之後,send_headers()功能檢查是否已經傳送 Last-Modified,會告訴我們頁面是否被快取,然後在快取,內容型別等已經傳送之後讓我們掛接它。
所以對於我使用 X-UA-Compatible 的例子,當它們都工作時,我傾向於使用 send_headers 。為什麼?對於一個如果你要新增這兩個,send_headers 將贏得每一次,並將確保它是載入,即使新增頁面快取後。
使用<meta> 標籤 (如 many popular frameworks use) 也適用於 x-ua-compatible,但在許多瀏覽器中不起作用,除非在開啟頭標籤後立即載入。這是由於各種原因,如“intranet” setting is set network wide 。因此使用 php 方法更安全。但是,如果要新增兩者,則元標記將獲勝 (假設包含足夠早。
關於 X-UA-Compatible 相容,我希望這將是無關緊要的,因為 Microsoft is dropping support 為舊版本的 IE 下週!
此外,我沒有使用 is_admin()檢查 wp_headers 篩選器,並且不會修改 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);
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。