wp_headers与send_headers。什么时候使用每个?


10

我已经看过wp_headers并且send_headers都用于同一件事,而且我想知道您是如何知道要使用哪个以及何时使用的...

send_headersCodex页面上,有一个添加X-UA-Compatible: IE=edge,chrome=1for Internet Explorer向后兼容性的示例,因为如果太晚加载,meta标记在Intranet网站上通常会失败

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
一般来说,一个是动作,另一个是过滤器。动作用于在事件发生时执行某些操作,而过滤器用于在使用某些事件之前对其进行修改。
米洛

Answers:


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标签之后立即加载,否则它就不能在许多浏览器中使用。这是由各种原因引起的,例如,如果将“ Intranet”设置设置为网络范围。因此,使用php方法更安全。但是,如果您要同时添加这两个元素,则meta标签会获胜(假设其中包含的时间足够早。

关于X-UA-Compatible兼容性,我希望这将是无关紧要的,因为微软下周将不再支持旧版本的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网站上做了大约十年了,在使用or符号之前,我从未见过这种格式。实际上,几年前我问过一个有关如何正确格式化条件的问题,如果您想添加这种方法。
Bryan Willis

Toscho我根据您的建议更新了答案。这是你的意思吗?
布莱恩·威利斯

是的,看起来不错。:)
fuxia

send_headers每次都会取胜,即使在缓存页面后添加,也能确保它被加载。” —注意,send_headers在我的测试中,W3 Total Cache之类的插件使用的页面缓存或任何静态缓存都无法胜过在服务器级别有效绕过WordPress。
尼克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.