您应该在哪里重置POSTATA?

时间:2017-05-24 作者:DᴀʀᴛʜVᴀᴅᴇʀ

我在Q&;中搜索过这个;A但我找不到它。当我在整个网站上阅读答案时,我看到wp_reset_postdata() 放置在多个区域中have_posts() 条件性和外部条件性都在一起。当我阅读上的文档时wp_reset_postdata() 其全部内容如下:

在循环执行单独的查询后,此函数将$post全局恢复为主查询中的当前post。

包含以下代码片段:

<?php
// example args
$args = array( \'posts_per_page\' => 3 );

// the query
$the_query = new WP_Query( $args );
?>

<?php if ( $the_query->have_posts() ) : ?>

    <!-- start of the secondary loop -->
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <?php the_title(); ?>
        <?php the_excerpt(); ?>
    <?php endwhile; ?>
    <!-- end of the secondary loop -->

    <!-- put pagination functions here -->

    <!-- reset the main query loop -->
    <?php wp_reset_postdata(); ?>

<?php else:  ?>

    <p><?php _e( \'Sorry, no posts matched your criteria.\' ); ?></p>

<?php endif; ?>
但当我引用其他方式时,例如“How to fix pagination for custom loops?“在条件之后:

// Output custom query loop
if ( $custom_query->have_posts() ) :
    while ( $custom_query->have_posts() ) :
        $custom_query->the_post();
        // Loop output goes here
    endwhile;
endif;
// Reset postdata
wp_reset_postdata();
在事后而不是在have_posts() 有条件的,因为如果使用else语句,如果没有POST,则不会重置参数。所以我的问题是应该在哪里wp_reset_postdata()

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

Short version:

正如Tom J Nowell所说,

如果没有东西要清理,你就不应该清理

Long version:

然而,如果你把wp_reset_postdata() 在循环之后(或在循环之外),它仍然可以很好地工作。我在各种场景中使用过该功能,包括:

dynamic_sidebar( \'main-sidebar\' );
wp_reset_postdata();
原因是一些小部件在查询帖子时没有清理自己。

请记住要重置哪个查询。以汤姆为例,不管wp_reset_postdataif 语句,一旦调用它,就会出现问题,因为它将直接返回到主帖子,而不是父自定义循环。

函数的作用是告诉WP_Query 对象将当前帖子还原到全局范围。因为它是一个函数而不是一个方法,所以它只处理一个对象-全局$wp_query 的实例WP_Query 对象

如果有自定义循环,则使用新生成的WP_Query, 您应该使用reset_postdata 该查询的方法:

$pages = new WP_Query( \'post_type=page\' );
while( $pages->have_posts() ) {
    $pages->the_post();

    // Page title
    echo \'<h1>\'; the_title();  echo \'</h1>\';

    $books = new WP_Query( \'post_type=book&...\' );
    if( $books->have_posts() ) {
        while( $books->have_posts() ) {
            $books->the_post();

            // Book title
            echo \'<li>\'; the_title(); echo \'</li>\';
        }

        // Don\'t go back to the global post, go back to the "page"
        // wp_reset_postdata();
        $pages->reset_postdata();
    }

    // Page content
    the_content();
}

// Finally, reset the main query
wp_reset_postdata();
希望这能总结一下:)

SO网友:Tom J Nowell

你做得对!It\'s the example that\'s wrong. 遗憾的是,几乎所有的查询示例都有这个问题

通常情况下,将其置于条件之后不会产生不良影响,但嵌套循环时,可能会在边缘情况下导致问题。对于99.9%的用例来说,这不是问题。

通过将其放在条件中,您确保了postdata只有在更改后才会重置。

考虑此边缘情况:

while( have_posts() ) {
    the_post();
    ... stuff...
    $q = new WP_Query( $args );
    if ( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();
            the_title();
            $related_posts = new WP_Query( $args2 );
            if ( $related_posts->have_posts() ) {
                while( $related_posts->have_posts() ) {
                    $related_posts->the_post();
                    //
                }
            }
            wp_reset_postdata();

            the_content();
        }
    }
    wp_reset_postdata();
}
在这里,我们将执行一个嵌套循环来获取相关帖子,但请注意,如果没有找到相关帖子$related_posts->have_posts() 退货false, postdata被重置回主循环的postdata,您将获得主查询post内容,而不是$q 查询

SO网友:Hossein

通常我在if($query->have_posts()) 陈述这样可以确保即使没有post,也会重置查询。我把它放在if($query->have_posts()) 陈述

结束