如何正确重置嵌套的WP_QUERY查询

时间:2017-04-28 作者:supertrue

我错过了一些东西。重置查询以使其不干扰可能嵌套在其中的任何其他查询的正确方法是什么?

This is the kind of result I\'m going for:

主页

这是主页内容。现在,让我们显示一些自定义嵌套查询。

Outer page 1

 Inner post 1
 Inner post 2
外部第1页内容(续)

Outer page 2

 Inner post 1
 Inner post 2
外部第2页内容(续)

。。。等

但我不能得到Outer Page X content continued 零件加工它总是还原为内部查询或主页查询。

Here\'s my page template. 它是用我在每个重置函数中得到的行为进行注释的(wp_reset_postdata(), wp_reset_query(), $query->reset_query(), 和$query->reset_postdata()).

// BEGIN PAGE TEMPLATE 

while ( have_posts() ) : the_post();

    the_title(); // "Main page"

    /* --------- OUTER QUERY --------- */
    $outer_query = new WP_Query( [ \'post_type\' => \'page\' ] );

    if ($outer_query->have_posts()) : 
        while ($outer_query->have_posts()) : $outer_query->the_post();
            the_title(); // "Outer page 1", "Outer page 2", etc.

                /* --------- INNER QUERY --------- */
                $inner_query = new WP_Query( [ \'post_type\' => \'post\', \'posts_per_page\' => 2 ] ); 

                if ($inner_query->have_posts()) :
                    while ($inner_query->have_posts()) : $inner_query->the_post();
                        the_title();
                    endwhile;
                endif;

            /**
             * Now I\'m done with the inner query.
             * How do I get back to the outer query?
             * 
             * Desired value of the_title(): 
             *   "Outer page 1" on first iteration, "Outer page 2" on second, etc.
             */

            // wp_reset_postdata();            // Nope! Results in "Main page"
            // wp_reset_query();               // Nope! Results in "Main page" 
            // $inner_query->reset_postdata(); // Nope! Results in "Inner post 1"
            // $inner_query->reset_query();    // Nope! Results in "Inner post 2"
            // If no reset is used:            // Nope! Results in "Inner post 2"
            the_title();

        endwhile;
    endif;
    wp_reset_postdata();

    // Now back to the main page
    the_title(); // Works

endwhile;

// END OF PAGE TEMPLATE
正确的方法是什么?我正在寻找一个可概括的答案,它不依赖于知道查询的深度有多深,也不依赖于使用它的上下文。i、 例如,可以提取成短代码的东西。

1 个回复
SO网友:RCNeil

这涉及到此处提供的答案Loop within a loop? 除非我发布了完整的代码:

$query = new WP_Query($args);

while ($query->have_posts()) :

    // initialization for $inner_args & backup the current global $post
    global $post;
    $backup = $post; 
    $inner_query = new WP_Query($inner_args);

    while ($inner_query->have_posts()) :
        // do something
    endwhile;
    $inner_query->reset_postdata();
    // restore the global $post from the previously created backup
    $post = $backup;

endwhile;
$query->reset_postdata();
这里最重要的是您要将当前帖子设置为备份,因为当WP_Query postdata已设置,先前的循环将丢失。内部查询完成循环后,可以将post设置回备份,并在“父”循环中继续。

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post