当前浏览:首页 / WordPress函数 / wp_reset_postdata()

wp_reset_postdata()

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

postdata

reset

  • wp_reset_postdata() 在执行一个独立的查询循环后,此函数将$post全局恢复为主查询中的当前post
  • wp_reset_query() 销毁前一个查询并建立新查询

说明

使用此函数可将模板标签的上下文从二次查询循环还原回主查询循环。

主查询循环和二次查询循环之间的区别是:

  • 主查询循环是基于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开始引入

使用示例

  • 示例1

    二次循环和复位示例

    注意:如果在查询中使用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(); ?>
    
  • 示例2

    警告,只有在查询成功时才重置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