何时应该使用wp_Reset_postdata而不是wp_Reset_Query?

时间:2017-11-29 作者:Narek Zakarian

似乎有一半的教程在抄本中使用wp_reset_postdata() 和一半使用wp_reset_query(). 怎么回事?也许两者都用?那么...怎么样rewind_posts()? 我在问一个答案based on facts, 没有意见。

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

wp_reset_postdata() 重置global $post 变量到post 主查询的属性,该属性将是主查询上一次出现的任何帖子。如果你使用setup_postdata()$query->the_post() 在自定义查询上。这两者都取代了全球$post 变量,使函数the_title() 在循环中获取当前帖子的正确标题。

wp_reset_query() 将主查询重置回最初加载时的状态。我知道发生这种情况的唯一原因是query_posts() 来修改它。无论如何你都不应该这样做。此函数还调用wp_reset_postdata() 在内部,因此也会产生同样的效果。

rewind_posts() 将主查询中的当前帖子设置为第一篇帖子。自从have_posts() 呼叫rewind_posts() 在内部,一旦你通过了最后一篇文章,我不确定你什么时候需要使用这个。可能只有当您需要在循环结束之前返回到循环的开始时。

所以基本上你应该使用wp_reset_postdata() 每当您执行以下任一操作时:

辅助查询:

$my_query = new WP_Query( $args );

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
endwhile;

wp_reset_postdata();
循环get_posts() 结果:

global $post;

$my_posts = get_posts( $args );

foreach ( $my_posts as $post ) : setup_postdata( $post );
    the_title();
endforeach;

wp_reset_postdata();
或者获取单个帖子并使用模板标记:

global $post;

$post = get_post( $id );

setup_postdata( $post );

the_title();

wp_reset_postdata();
你会用rewind_posts() 如果需要转到循环的开头。这个例子很奇怪,但我想不出更好的例子了。基本上,如果要显示循环的前3个帖子,请转到开头并显示所有帖子:

global $wp_query;

$started_over = false;

while ( have_posts() ) : the_post();
    the_title();

    if ( ! $started_over && $wp_query->current_post == 2 ) {
        $started_over = true;
        rewind_posts();
    }
endwhile;
你基本上不需要wp_reset_query();

结束

相关推荐

WP_QUERY不使用POST_TYPE

我有两台机器:本地和部署。在本地计算机上,我有以下代码:$all_prods = array( \'posts_per_page\' => -1, \'post_type\' => \'product\', ); dump(query_posts($all_prods)); 我得到的结果是我之前创建的三个产品。但部署计算机上的同一代码返回一个空数组,尽管该网站中有许多产品。我认为部署计算机的post类型有另一个前缀,