说明
使用此函数可将模板标签的上下文从二次查询循环还原回主查询循环。
主查询循环和二次查询循环之间的区别是:
- 主查询循环是基于URL请求的,在处理主题模板之前被初始化;
- 二次查询循环是在主题模板或插件文件中的查询(使用新的WP_Query)
使用 $sec_query = new WP_Query()
和$sec_query->the_post()
的二次查询循环会影响全局$post
变量。而默认情况下,模板标签使用全局$post
变量。wp_reset_postdata()
将全局$post
变量恢复到主查询中的当前post(包含在全局$wp_query
变量中,而不是$sec_query
变量),这样模板标签就会再次默认引用主查询循环。
实例
<?php $args = array( 'posts_per_page' => 3 ); // the query $sec_query = new WP_Query( $args ); ?> <?php if ( $sec_query->have_posts() ) : ?> <!-- start of the loop. the_post() sets the global $post variable --> <?php while ( $sec_query->have_posts() ) : $sec_query->the_post(); ?> <!-- template tags will return values from the post in the $sec_query object <?php the_title(); ?> <?php the_excerpt(); ?> <?php endwhile; ?><!-- end of the loop --> <?php else: ?> <?php _e( 'Sorry, no posts matched your criteria.' ); ?> <?php endif; ?> <!-- 重置全局post变量,在此后,我们又回到主查询对象上 --> <?php wp_reset_postdata(); ?>
源码
更新日志
版本 | 描述 |
---|---|
3.0.0 | 开始引入 |
使用示例
二次循环和复位示例
注意:如果在查询中使用the_post(),则需要在之后运行wp_reset_postdata()以使模板标签再次使用主查询的当前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 --> <?php else: ?> <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p> <?php endif; ?> <!-- 重置主查询循环 --> <?php wp_reset_postdata(); ?>
警告,只有在查询成功时才重置post数据…
$query = array( //some post query parameters ); $post_results = get_posts($query); if(!empty($post_results)){ //do something with your query results //invoke post data reset here wp_reset_postdata(); } //if you invoke it after the check and the result did not return any posts, it will reset the post data from a previous query wp_reset_postdata(); // WRONG