【WordPress】記事ループさせるときの注意事項【PHP】

  • 投稿 : 2016-12-24
・query_posts()を使用したら、wp_reset_query()を最後に呼び出す
・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 日本語版

どう使い分けたらよいかは、私にはわかりません。


スポンサーリンク