・query_posts()を使用したら、wp_reset_query()を最後に呼び出す
・WP_Queryを使用したら、wp_reset_postdata() を最後に呼び出す
重要なのは、この部分だと思います。・WP_Queryを使用したら、wp_reset_postdata() を最後に呼び出す
ネットで見かけるものって、これがないものが結構多い気がします。
なくても支障がないケースも多いでしょうけど・・。
素人の直観では「WP_Query」を使うようにして、データの取得がすべて終わったら「wp_reset_postdata」を呼び出すようにすればOKかなぁと思う。
わかりやすい解説のサイト
$wp_the_query ..... WP_Query オブジェクト。URL のクエリーバックアップ用。
$wp_query ......... WP_Query オブジェクト。カレントのクエリー。
$posts ............ クエリーを実行して取得した記事オブジェクトの配列。
$post ............. カレントの記事オブジェクト。
そして、これらのグローバル変数を上書きする関数は以下の通り。
query_posts() ........................ $wp_query を上書き。
the_post(), WP_Query::the_post() ..... $post を上書き。
テンプレートファイル内では $wp_query, $posts, $post はグローバル変数として宣言されているので、これらも何らかの値を代入すれば上書きされます。
さらに、上書きされたグローバル変数を復元する関数があります。
wp_reset_query() ........ $wp_query を $wp_the_query, $post を $wp_query->post で復元。
wp_reset_postdata() ..... $post を $wp_query->post で復元。
WordPress ループ&クエリーのモヤモヤを解消しよう! | wpxtreme
上記の引用先の記事が非常にわかりやすいと思う。
テーマのテンプレートを見てみる
while ( have_posts() ) : the_post();
//何らかの処理
endwhile;
・グローバル変数 $wp_query を使用します。
・WP_Query::the_post() を呼び出して、グローバル変数 $post をセットします。
関数リファレンス/the post - WordPress Codex 日本語版
the_post()関数で、グローバル変数の「$post」などに値が代入されるようです。
query_posts() を見てみる
すこし見てみたのですが、query_posts()をつかうのが妥当そうでない感じのものが多かったので省略。派生的なループ
派生的な一覧 (例えばページの下部に関連記事を表示したり、サイドバーのウィジェットでリンクの一覧を出したり等) を表示したい場合は、WP_Query の新しいインスタンスを生成するか、get_posts() を使ってください。
もし query_posts() を使う場合は、用が済んだら必ず wp_reset_query() を呼び出してください。
テンプレートタグ/query posts - WordPress Codex 日本語版
派生的なループには、WP_Query を使ったほうがよさそうです。
WP_Queryを見てみる
$numposts = 10;
$args = array( 'post_type' => 'page' ,'posts_per_page' =>$numposts,'offset' =>0,'orderby' =>'date','order'=>'DESC');
$the_query = new WP_Query( $args );
while ( $the_query->have_posts() ){
$the_query->the_post();
$post_id = $the_query->post->ID;
$url = get_permalink($post_id);
echo $url;
}
wp_reset_postdata();
関数リファレンス/wp reset postdata - WordPress Codex 日本語版$the_query->the_post();で、グローバル変数の$postを使う(汚染する)ので、wp_reset_postdata();を最後に呼び出して、元の状態に戻すという流れになるようですね。
get_postsとかもある
get_posts の最も適切な使い方は、パラメータに基づいて投稿データの配列を作成することです。最近の投稿あるいはパラメータに一致した投稿を取得します。複数のループを作成するのに get_posts を使用する事もできます。ただしこの場合は new WP_Query を使用して WP_Query を直接参照するほうが好ましいでしょう。
get_pages とパラメータが似ていますが実装方法はかなり異なっており、適切に使う必要があります。get_posts は WP_Query を使用していますが、get_pages はデータベースに直接クエリを投げます。それぞれ実装の差異を反映したパラメータになっています。
query_posts も WP_Query を使用していますが、グローバル変数 $wp_query を書き換えてメインループを直接変更しているので、使う場合は注意してください。一方、get_posts は新しい WP_Query オブジェクトを参照するため、メインループに影響を与えません。
テンプレートタグ/get posts - WordPress Codex 日本語版
どう使い分けたらよいかは、私にはわかりません。
スポンサーリンク
コメントを残す