因此,我有一个插件,可以在页面/帖子/自定义帖子类型的内容中添加或预先添加增强的作者传记。
它通过钩住the_content
或the_excerpt
以及根据插件的配置附加/前置内容。
我已经开始通过一个小部件,例如通过Category Posts 小部件。小部件正在使用the_excerpt()
在自定义查询循环中,根据配置的类别提取帖子,并在提要栏的上下文中显示帖子摘录。
作为这一点的直接影响,我的插件the_excerpt
正在调用筛选器挂钩。我想做的是能够检测我的过滤器挂钩是否在侧栏或小部件的上下文中被调用,并有条件地决定是否将插件的内容附加到传递给过滤器挂钩的帖子内容中。伪代码看起来像这样。。。
add_filter (\'the_excerpt\', array ($this, \'insert_biography_box\'));
function insert_biography_box ($content) {
if (in_sidebar ()) {
return $content;
}
// do code stuff to append/prepend biography content
return $content;
}
。。。但在WordPress核心资源、论坛和这里进行了大量搜索之后,它看起来不像是
is_sidebar
或
is_widget
(或名称上的其他变体)存在。
甚至可以确定是在侧栏的上下文中还是在小部件中调用过滤器挂钩函数吗?
EDIT: 根据@toscho的建议使用is_main_query
, 我修改了过滤器挂钩the_content
和the_excerpt
看起来像这样。。。
add_filter (\'the_excerpt\', array ($this, \'insert_biography_box\'));
add_filter (\'the_content\', array ($this, \'insert_biography_box\'));
function insert_biography_box ($content) {
error_log (\'insert_biography_box: current filter=\' . current_filter ());
if (!is_main_query ()) {
error_log (\'Not main query, baling\');
return $content;
}
// do code stuff to append/prepend biography content
$biography = \'some-magic-function-return-value\';
return $content . $biography;
}
基于此,我希望看到消息
Not main query, baling
当Category Posts小部件调用时,在我的PHP错误日志中
the_excerpt()
在侧边栏的上下文中。但我没有。
对于上下文,Category Posts小部件正在小部件的widget
像这样的方法(为了清晰起见,请严格解释)。。。
$cat_posts = new WP_Query (...);
while ($cat_posts->have_posts ()) {
$cat_posts->the_post ();
the_excerpt ();
}
。。。我是否遗漏了一些东西(很可能),或者我只是不了解我使用的上下文
is_main_query()
(很有可能)?
SO网友:Gary Gale
在WordPress hacks forum, 有人建议使用in_the_loop()
这在某些时候是可行的,一些插件使用the_content
和/或the_excerpt
, 但并非所有我测试过的插件都是如此。
同样,我现在使用is_main_query()
这在某些时候是可行的,有些插件可以,但不是所有插件都可以。
但是测试的神奇组合is_main_query()
和in_the_loop()
似乎是在耍花招。
所以(伪)代码现在看起来像这样。。。
add_filter (\'the_excerpt\', array ($this, \'insert_biography_box\'));
add_filter (\'the_content\', array ($this, \'insert_biography_box\'));
function insert_biography_box ($content) {
if (!in_the_loop () || !is_main_query ()) {
return $content;
}
// do code stuff to append/prepend biography content
$biography = \'some-magic-function-return-value\';
return $content . $biography;
}
。。现在,它正好提供了我想要的行为,而不是使用边栏和/或页脚小部件中的内容或摘录过滤器的插件。