如何确定是否在边栏/小部件上下文中调用了筛选器?

时间:2012-10-10 作者:Gary Gale

因此,我有一个插件,可以在页面/帖子/自定义帖子类型的内容中添加或预先添加增强的作者传记。

它通过钩住the_contentthe_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_sidebaris_widget (或名称上的其他变体)存在。

甚至可以确定是在侧栏的上下文中还是在小部件中调用过滤器挂钩函数吗?

EDIT: 根据@toscho的建议使用is_main_query, 我修改了过滤器挂钩the_contentthe_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() (很有可能)?

2 个回复
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;
}
。。现在,它正好提供了我想要的行为,而不是使用边栏和/或页脚小部件中的内容或摘录过滤器的插件。

SO网友:fuxia

不要要求侧边栏,要求main query:

if ( is_main_query() )
    return;
原因是:摘录或主要内容也可以在其他地方获取,而且您确实不想为每个案例创建新的条件。

结束

相关推荐

Sub Navigation in Sidebar

测试地点:http://www.indysouthportdental.com.php5-1.ord1-1.websitetestlink.com我只想在查看父级中的任何页面时,在侧边栏中显示父级的子级。例如,《口腔健康》有10个子页面。其中一些儿童(例如治疗)页面有儿童页面(口腔健康的孙子)。即使我在孙子页面上,我仍然希望列出父级的唯一子页面。这是我正在使用的代码<?php if($post->post_parent) $children = wp_list_pages(\"