我有一个插件,用于注入额外的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标头更改仅限于特定类别的帖子
最合适的回答,由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
.