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();