WP_Headers与Send_Headers。何时使用每一种?

时间:2016-01-07 作者:Bryan Willis

我看到了wp_headerssend_headers 这两个词以前都用在同一个词上,我想知道你怎么知道该用哪一个,什么时候。。。

send_headers codex page 下面是添加X-UA-Compatible: IE=edge,chrome=1 用于Internet Explorer向后兼容性,因为元标记经常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\' );
}

However wp_headers can also do this:

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;
}
Update: 实际上我刚刚注意到a conversation on this 几年前,或多或少地开始了一个类似的问题。。。

此外,send\\u头是否只与前端有关?我见过wp\\U标头执行如下检查:

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

if (!is_admin()) 
所以我想也许send_headers 不必做那些检查。。。

1 个回复
SO网友:Bryan Willis

Ok so I think I figured it out...

通过向浏览器发送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兼容,除非在开头标记后立即加载,否则在许多浏览器中都不起作用。这是由各种原因造成的,如"intranet" setting is set network wide. 因此,使用php方法更安全。然而,如果您同时添加这两个标签,meta标签将获胜(假设它足够早就包含在内)。

关于X-UA-Compatible 兼容,我希望这很快就会无关紧要Microsoft is dropping support 下周发布旧版IE!

我还测试了wp_headers 过滤时不使用is_admin() 检查,它不会修改admin\\u头,因此不需要检查。

如果你确实因为某种原因需要修改管理员标题,我知道你可以这样做,但我不确定它是否会一直工作。。。

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

Updated Answer based on Toscho\'s suggestion to check for admin:

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

相关推荐

Apply filters on date format

我使用Wordpress主题,其中格式日期和时间直接编码为两种格式:<?php the_time(\'d M\'); ?> <?php the_time(\'H:i\'); ?> 我想要的:显示wordpress选项中定义的日期和时间我不想在子主题中创建修改过的模板,我更喜欢使用函数。我已经在函数中添加了php。php此代码有效:add_filter( \'the_time\', \'changer_date_format\', 10, 1 ); //o