问题描述

reset_postdata 如何工作?文件说:

restore the global $post variable of the main query loop after a secondary query loop using new WP_Query

但是在该类中,它需要当前 WP_Query 实例的”current” 文档,并将其设置为全局 $post 。那么它如何恢复主查询循环的帖子?

WP_Query 类。

最佳解决方案

WP_Query::reset_postdata()将全局后变量 ($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
});

So how does it restore the post of the main query loop?

这是通过调用 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 设置为主查询的当前帖子

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。