Nested WP_Query breaking loop

时间:2014-05-16 作者:Julian F. Weinert

我正在使用WP_Query 获取没有子页面的所有页面。对于我再次使用的每个页面WP_Query 获取第一个循环中当前页的所有子页。

这一切都很好,我得到了预期的结果。

但是现在使用第三个WP_Query 在其中一个子页面上,第二级循环中断。

我已经试过了wp_reset_query()wp_reset_postdata() 但他们没有做到这一点。

我还试图挽救global $wp_queryglobal $post 并在循环后重置它们,但这也没有帮助。

如何在WP中实现嵌套查询?

Edit 根据要求(以及它的正确性),这是我的代码。我还意识到我的问题不仅适用于第三个循环,也适用于第二个循环。

$all_pages = new WP_Query(array(\'post_type\' => \'page\', \'post_status\' => \'publish\', \'post_parent\' => 0));

while($all_pages->have_posts()) {
    $all_pages->the_post();
    include(get_page_template());
}

wp_reset_postdata();
在页面模板中,我使用以下代码获取子页面:

// child page content rendered here, depending on template

if($post->post_parent == 0) {
    $child_pages = new WP_Query(array(\'post_type\' => \'page\', \'post_status\' => \'publish\', \'page_parent\' => $post->post_parent));

    while($child_pages->have_posts()) {
        $child_pages->the_post();
        include(get_page_template());
    }

    wp_reset_postdata();
}
我可以在子页面上执行WP\\u查询。但当使用the_post(); 这个$child_page 循环停止执行。

2 个回复
最合适的回答,由SO网友:Julian F. Weinert 整理而成

我刚刚找到了答案。我想我在任何地方都有另一个问题,所以我真正的问题无法解决。我是这样做的:

在页面模板中,我首先要做的是

global $post;
$saved_post = $post;
在页面模板的末尾:

if($saved_post) {
    $post = $saved_post;
}
我有两个文件(page.header.php和page.footer.php),我将它们包含在每个页面模板中,用于保存和恢复。

可能有更好的解决方案,所以我仍然对答案和想法感到满意:-)

SO网友:kaiser

这可以在单个查询中完成:

$parent_only = new WP_Query( array(
    \'post_parent\' => 0,
) );
如果您希望在循环中(或在返回的请求上)包含特定页面(例如)的所有子级TRUE 对于is_singular()), 使用get_the_ID() 作为的参数post_parent.

编辑(在更新的问题中看到完整的循环后)

get_page_template() 函数应用于template_include 筛选器回调。当你看到~/wp-includes/template-loader.php and its internals, 然后您将看到以下内容:

is_page() && $template = get_page_template()
此函数不适用于模板内部。如果要包括模板部件,请坚持get_template_part() 相反

假设您要构建一个页面列表,其中每个子页面都列在父页面的下方,每个子页面都列在父页面的下方。这可以通过wp_list_pages() Source

<ul>
    ?>
    wp_list_pages( array(
        \'title_li\' => sprintf(
            \'<h2>%s</h2>\'
            __( \'Pages sorted by parent\', \'your-textdomain\' )
        ),
    ) );
    <?php
</ul>
现在,这将只输出一个页面列表。仔细查看参数列表时,可以使用:child_ofecho 以及:

// Get all parent pages:
$pages = get_pages( array(
    \'number\' => 0, // get *all* pages
) );

// Container:
$output = array();
// Loop and fetch
foreach ( $pages as $page )
{
    $output[] = wp_list_pages( array(
        \'title_li\' => \'...\',
        \'echo\'     => false,
        \'child_of\' => $page->ID,
    ) );
}

// Build the output:
foreach ( $output as $p )
    // etc.
上述示例只是为了澄清内部情况。当然,您可以简单地调整depth 参数,所以wp_list_pages() 获取家长及其子女以构建无序的HTML列表。

因此,正确的方法是通过必要的depth 如果您需要定制订单,请使用指定给walker-钥匙

总结-core会根据默认值为您执行此操作

结束

相关推荐

Scheduling posts via sql

我收到了1万条关于未来日期的帖子。我把我的帖子作为草稿导入,因为它看起来更快。我使用phpmyadmin通过以下sql命令将帖子的状态设置为future:UPDATE wp_posts SET post_status = \'future\' WHERE post_status != \'static\'; 问题是,当我去看我的帖子时,他们都说日期还没有过去,就错过了时间表!是否有任何修正来修正日程安排?