web-dev-qa-db-ja.com

いつwp_reset_postdataとwp_reset_queryを使用すべきですか?

Codexのチュートリアルの半分はwp_reset_postdata()を使い、半分はwp_reset_query()を使っているようです。どうしたんだ?たぶんそれらの両方を使う? rewind_posts()はどうですか?私は答えを求めています 事実に基づいて 意見ではなく/。

1
Narek Zakarian

wp_reset_postdata()global $post変数の値をメインクエリのpostプロパティにリセットします。カスタムクエリでsetup_postdata()または$query->the_post()を使用した場合はこれを行います。これらは両方ともグローバルな$post変数を置き換えるので、the_title()のような関数はループ内の現在の投稿の正しいタイトルを取得します。

wp_reset_query()は最初にロードされたときのものにメインクエリをリセットします。私が知っているのは、これが起こる唯一の理由はあなたがそれを変更するためにquery_posts()を使ったかどうかです。どのような場合でもこれをするべきではありません。この関数は内部的にwp_reset_postdata()も呼び出すので、同じ効果があります。

rewind_posts()は、メインクエリの現在の投稿を最初の投稿に設定します。最後の投稿を過ぎるとhave_posts()rewind_posts()を内部的に呼び出すので、いつこれを使う必要があるのか​​わかりません。おそらく、ループが終了する前にループの先頭に戻る必要がある場合のみです。

したがって、基本的には、次のいずれかを行うときはいつでもwp_reset_postdata()を使用する必要があります。

二次クエリ:

$my_query = new WP_Query( $args );

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
endwhile;

wp_reset_postdata();

get_posts()の結果をループする:

global $post;

$my_posts = get_posts( $args );

foreach ( $my_posts as $post ) : setup_postdata( $post );
    the_title();
endforeach;

wp_reset_postdata();

または単一の投稿を取得してテンプレートタグを使用する:

global $post;

$post = get_post( $id );

setup_postdata( $post );

the_title();

wp_reset_postdata();

また、ループの先頭に移動する必要がある場合は、rewind_posts()を使用します。この例は変ですが、もっと良いものを考えることはできませんでした。それは基本的にあなたがループの最初の3つの投稿を見せたいならばそれから始めに行ってそれらのすべてを見せてください:

global $wp_query;

$started_over = false;

while ( have_posts() ) : the_post();
    the_title();

    if ( ! $started_over && $wp_query->current_post == 2 ) {
        $started_over = true;
        rewind_posts();
    }
endwhile;

そして、あなたは基本的に決してwp_reset_query();を必要とするべきではありません

4
Jacob Peattie