問題描述

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。