reset_postdata
はどのように機能しますか?ドキュメントは言う:
新しいWP_Queryを使用して二次クエリループの後にメインクエリループのグローバル$ post変数を復元する
しかし、このクラスでは、現在のWP_Query
インスタンスの「現在」の投稿を受け取り、それをグローバル$post
として設定します。それではそれはどのようにメインクエリループの投稿を復元しますか?
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
を設定する方法です。