the_content and is_main_query

时间:2014-09-27 作者:Pieter Goosen

我正在使用the_content 滤器一切都很完美,摘录我的更改也应用于自定义查询。如果小部件使用自定义查询,我的更改也会显示在侧栏中

为了解决这个问题,我使用is_main_query() 仅以主查询为目标,但它不起作用。更改仍然简单地应用于所有查询。有趣的是,所有其他条件检查is_single()is_category() 如果我以特定页面为目标,则有效,但所有更改都会影响该页面上的任何其他自定义查询,无论我是否使用is_main_query() 还是不

我是不是错过了什么。如何仅使用the_content 滤器

add_filter(\'the_content\', \'custom_content\');

function custom_content($content){

    if(is_main_query()){ // << THIS IS NOT WORKING
        // My custom content that I add to the_content()    
    }
    return $content;
}

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

老实说in_the_loop() 是您想要的:

add_filter( \'the_content\', \'custom_content\' );

function custom_content( $content ) {
    if ( in_the_loop() ) {
        // My custom content that I add to the_content()    
    }
    return $content;
}
什么in_the_loop 是否检查全局$wp_query 当前帖子的(即主要查询对象)为-1 < $current_post < $post_count.

当主查询正在循环时会发生这种情况,因为在循环开始之前,当前post是-1,而在循环结束之后,当前post再次重置为-1。

所以,如果in_the_loop() 是真的,这意味着主查询对象是循环的,这就是您在本例中所需要的(并且是在上添加操作的相同结果loop_start 并在上删除loop_end, 就像“ialocin”写的答案一样;事实上,它也是出于同样的原因工作的,并且得到了我的+1)。

@ialocin方法的好处是,当您想要以不同于主查询对象的查询对象为目标时,因为in_the_loop() 仅适用于主查询。

SO网友:Nicolai Grossherr

这只是对“奥托”答案的补充。只是为了让它更容易理解。基本上,正如@Otto所说的,您必须颠倒逻辑,这意味着:如果您能够可靠地确定主查询,那么您可以在the_content 滤器

例如,可以在pre_get_posts 行动,因此这将起作用:

function wpse162747_the_content_filter_callback( $content ) {
    return $content . \'with something appended\';
}

add_action( \'pre_get_posts\', \'wpse162747_pre_get_posts_callback\' );
function wpse162747_pre_get_posts_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( \'the_content\', \'wpse162747_the_content_filter_callback\' );
    }
}
由于您应该在不再需要过滤器时将其移除,因此我认为loop_end 行动应该是实现这一目标的好地方,作为我们可以利用的对应行动loop_start. 如下所示:

add_action( \'loop_start\', \'wpse162747_loop_start_callback\' );
function wpse162747_loop_start_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( \'the_content\', \'wpse162747_the_content_filter_callback\' );
    }
}

add_action( \'loop_end\', \'wpse162747_loop_end_callback\' );
function wpse162747_loop_end_callback( $query ) {
    if ( $query->is_main_query() ) {
        remove_filter( \'the_content\', \'wpse162747_the_content_filter_callback\' );
    }
}

SO网友:Otto

您正在使用is_main_query() 不正确。除非重新定义了全局$wp\\u查询变量,否则global is\\u main\\u query()函数将返回true。

可能没有百分之百可靠的方法从the\\u内容过滤器内部判断您所处的当前循环是否是主查询。内容过滤器只是过滤内容。它没有任何形式的能力来知道它用于什么循环。

相反,您应该在需要时添加过滤器,然后在不需要时删除它。

结束

相关推荐

注意:未定义索引:SUPPRESS_FILTERS

我正在做一个主题的除虫工作,我希望有人能帮助我。我使用JustinTadlock创建的这个函数在博客页面上显示自定义帖子类型,并且将wp debug设置为true,我会收到一个通知:未定义索引:suppress\\u filters消息。代码如下:// Custom Post Type for the public blog posts to show on Index or blog page add_filter( \'pre_get_posts\', \'my_get_posts\' );&