如何从插件中仅将HTTP头更改为特定类别的帖子

时间:2017-03-05 作者:Jim Duggan

我有一个插件,用于注入额外的HTTP头。它可以与以下代码配合使用:

add_action( \'send_headers\', \'jim_stop\' );
function jim_stop() {

    header( \'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\' );
    header( \'Pragma: no-cache\' );
    header( \'Expires: Thu, 01 Dec 1994 16:00:00 GMT\' );

}
它将上述HTTP头设置为所有帖子。但是,我只想将标题插入到特定类别的页面中。例如,假设类别slug为x id为75.

设置特定于类别文章的HTTP标头x, 我用过in_category( \'x\' ) 条件如下:

add_action( \'send_headers\', \'jim_stop\' );
function jim_stop() {
    if ( in_category( \'x\' ) ) {
        // category specific HTTP headers    
    }
}
但那没用。

我也尝试过这样检查类别:

$cat = get_query_var( \'cat\' );
if ( $cat == \'75\' ) {
    // category specific HTTP headers
}
也像这样:

global $post;
if ( in_category ( \'x\', $post->ID ) ) {
    // category specific HTTP headers
}
但这些也失败了。

因为类别检查不适用于send_headers 动作钩,我试过用wp_headers 过滤器挂钩,如下所示:

add_filter( \'wp_headers\', \'add_header_xua\' );
function add_header_xua( $headers ) {
    if ( in_category( \'x\' ) ) {
        // category specific HTTP header changes
    }
    return $headers;
}
但它也失败了。所以我的问题是:

如何将HTTP标头更改仅限于特定类别的帖子

1 个回复
最合适的回答,由SO网友:Fayaz 整理而成

为什么不起作用:

send_headers 一旦HTTP 缓存、内容等的标头已发送,但尚未正确启动主查询。这就是为什么in_category() 当您在此操作挂钩中使用该函数时,该函数不起作用。同样适用于wp_headers 过滤器挂钩。

要使其正常工作,请使用template_redirect 行动挂钩(甚至wp 动作挂钩)。此钩子是在正确启动主数据库查询相关对象之后,但在生成任何输出之前激发的。所以这个钩子很适合设置额外的HTTP头,重定向到另一个URL等。

您还需要检查is_single() 因为您只想将其应用于该类别的帖子。否则,它也将应用于类别存档页面。

因此,工作代码如下所示:

add_action( \'template_redirect\', \'jim_stop\' );
function jim_stop() {
    if( is_single() && in_category( \'x\' ) ) {
        header(\'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\');
        header(\'Pragma: no-cache\');
        header(\'Expires: Thu, 01 Dec 1990 16:00:00 GMT\');
    }
}
现在,类别检查将起作用,这些额外的HTTP头将只应用于来自类别的帖子x.

相关推荐

将WordPress中的“http://localhost:8888/”替换为网站URL“

由于最近的一些安全漏洞,我不得不用所有新的本地文件替换服务器上的网站。Question: 现在我明白了“http://localhost:8888/“我的博客帖子中的字符串(例如图像源和其他地方)导致网站无法正常工作。我已经生成了新的permalinksSettings->Permanlinks->Save如何替换“http://localhost:8888/“使用”mysiteurl.com“。有脚本吗?