WP_Query::reset_postdata()
设置全局post变量($GLOBALS[\'post\'] === $post
)到当前回路中的当前柱WP_Query
例子
public function reset_postdata() {
if ( ! empty( $this->post ) ) {
$GLOBALS[\'post\'] = $this->post;
$this->setup_postdata( $this->post );
}
}
这意味着,如果在页面上运行自定义查询,
$post
将保留该自定义查询循环中的最后一篇文章。您可以通过添加
?><pre><?php var_dump($post); ?></pre><?php
直接在自定义查询的循环之后。
循环之后的主查询也是如此,$post
将保留主查询的最后一个帖子和循环前的第一个帖子。
下面是一个简单的测试$post
全球的您可以将其添加到函数文件中,并加载站点上的任何页面
add_action( \'wp_head\', function()
{
global $post;
?><pre><?php var_dump($post->ID); ?></pre><?php
}):
add_action( \'wp_footer\', function()
{
global $post;
?><pre><?php var_dump($post->ID); ?></pre><?php
$q = new WP_Query( \'posts_per_page=3\' );
while ( $q->have_posts() ) {
$q->the_post();
?><pre><?php var_dump($post->ID); ?></pre><?php
the_title();
}
?><pre><?php var_dump($post->ID); ?></pre><?php
wp_reset_postdata();
?><pre><?php var_dump($post->ID); ?></pre><?php
});
那么它如何恢复主查询循环的post呢?
通过调用wp_reset_postdata()
重置全局$post
到主查询循环中的当前帖子。这通常是最后一篇文章的第一篇,具体取决于您是在主查询循环之前还是之后添加自定义查询。
让我们看看如何wp_reset_postdata()
是吗
function wp_reset_postdata() {
global $wp_query;
if ( isset( $wp_query ) ) {
$wp_query->reset_postdata();
}
}
正如你所见,
wp_reset_postdata()
只是一个包装
WP_Query::reset_postdata()
. 这里重要的一点是,它是主查询对象方法的包装器,
$wp_query->reset_postdata();
.
记住,主查询还使用WP_Query
. 下面是如何设置主查询对象
/**
* WordPress Query object
* @global WP_Query $wp_the_query
* @since 2.0.0
*/
$GLOBALS[\'wp_the_query\'] = new WP_Query();
/**
* Holds the reference to @see $wp_the_query
* Use this global for WordPress queries
* @global WP_Query $wp_query
* @since 1.5.0
*/
$GLOBALS[\'wp_query\'] = $GLOBALS[\'wp_the_query\'];
那又怎样
wp_reset_postdata()
它接受主查询对象中的当前帖子,并将其设置为
$post
全球,这就是
WP_Query::reset_postdata()
集合
$post
到主查询的当前职位