Reset_postdata如何恢复主查询循环的POST?

时间:2016-01-30 作者:Paul

如何reset_postdata 作品医生说:

使用新的WP\\U查询在辅助查询循环之后还原主查询循环的全局$post变量

但在课堂上,它占据了当前WP_Query 实例,并将其设置为全局$post. 那么它如何恢复主查询循环的post呢?

这个WP_Query class.

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

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 到主查询的当前职位