web-dev-qa-db-ja.com

Reset_postdataはメインクエリループの投稿をどのように復元しますか?

reset_postdataはどのように機能しますか?ドキュメントは言う:

新しいWP_Queryを使用して二次クエリループの後にメインクエリループのグローバル$ post変数を復元する

しかし、このクラスでは、現在のWP_Queryインスタンスの「現在」の投稿を受け取り、それをグローバル$postとして設定します。それではそれはどのようにメインクエリループの投稿を復元しますか?

WP_Queryクラス

7
Paul

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 
});

それではそれはどのようにメインクエリループの投稿を復元しますか?

これは、 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を設定する方法です。

7
Pieter Goosen