检查模板中的主查询

时间:2015-09-29 作者:Nikita

除了索引中的主循环之外。php,我调用了其他几个跨主题的自定义查询,如下所示:

$new_query = new WP_Query(array(
    // some args
));

if ($new_query->have_posts()) : 

    while ( $new_query->have_posts() ) : $new_query->the_post();

        // This is the same template that I use in the main query or other custom queries
        get_template_part( \'template-parts/content\' );

    endwhile; 

endif;
wp_reset_postdata();
现在,我需要从模板文件中检查它是从这个自定义查询调用还是从主查询调用。

内容也是如此。php

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

        <?php if ( is_main_query() ) {
            // Do some staff
        } else {
            // Do other staff

        } ?>

</article>
is_main_query() 总是返回true,因为它指的是global $wp_query, 我想是吧。我可以用$new_query->is_main_query() 但在模板文件中是不可能的。那么如何解决这个问题呢?谢谢

EDIT:

我在这里找到了一个解决方案Which custom query am I in and how can I access its properties & methods?关键是要设置全局布尔值并在模板文件中进行检查

$new_query = new WP_Query(array(
    // some args
));

$GLOBALS[\'is_custom_query\'] = FALSE;

if ($new_query->have_posts()) : 

    while ( $new_query->have_posts() ) : $new_query->the_post();

        $GLOBALS[\'is_custom_query\'] = TRUE;
        get_template_part( \'template-parts/content\' );
        $GLOBALS[\'is_custom_query\'] = FALSE;

    endwhile; 

endif;
wp_reset_postdata();
不确定此解决方案的可靠性。

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

使用in_the_loop(), 如果在主循环中,它将返回true;如果不在主循环中,它将返回false,就像在自定义查询循环中一样

Return:(bool)如果调用方在循环内,则为True;如果循环尚未开始或结束,则为false。

两者之间的区别is_main_query()in_the_loop() 是吗is_main_query() 使用WP_Query::is_main_query() 然后使用全局$wp_the_query. $wp_is_query 存储主查询,这就是为什么is_main_query() 在循环中始终返回true。您还应该阅读this post

总之,你可以

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

    <?php if ( in_the_loop() ) {
        // Do some staff
    } else {
        // Do other staff

    } ?>

</article>

相关推荐

Increase offset while looping

我正在编写一个自定义帖子插件,它将自定义帖子分组显示为选项卡。每组4个岗位。是否可以编写一个偏移量随每次循环而增加的查询?因此,结果将是:-第一个查询显示从1到4的帖子-第二个查询显示从5到8的帖子-第三个查询显示从9到12的帖子等。 <div class=\"official-matters-tabs\"> <?php $args = array(\'post_type\' => \'official-matters\', \'showp