ループ

基本のループを4つ紹介。

  1. デフォルトのループを変更するには、query_posts()
  2. ループの変更、複数のループを作成する場合は WP_Query()
  3. 静的ループの追加にはget_posts()
  4. デフォルトのループをカスタマイズするには、pre_get_posts

デフォルトループ

デフォルトループの5つの基本アクション

  1. have_posts()を使用し、投稿が検出されたかどうかを確認
  2. 投稿があった場合、whileループが開始
  3. have_posts()trueである限り、whileはループ(繰り返し)を続ける。また、現在の投稿で次のアイテムをチェックするだけ。内部的には、これは投稿カウンターに基づいており、コレクション内の投稿の総数と比較される
  4. the_post()関数はその次の投稿内容を取得し、内部投稿カウンターを更新する
  5. the_post()がなければ、テーマで使用されるテンプレートタグの多くは機能しない

query_postsループ

 注意!query_posts()は非推奨になっています。 
  • query_postsは、クエリ全体を書き換えてしまう
  • wp_reset_query()を呼び出さないかぎり、サイト全体のクエリが書き換わった状態のまま、意図しない結果が表示される危険性があるということで、取り扱いには注意が必要

いつ使うのか?

query_postsは、単一のループに対して返される投稿のタイプを変更するために使用。

例えば、特定のカテゴリからある投稿を除外するなど、投稿の数を制限するのに向いている。

WP_Query()ループ

  • WP_Query()は、渡されたパラメーターを元に、元のメインクエリを壊さずに投稿データを取得することができる
  • WP_Query()で取得したデータは、$wp_queryと同じ構造のオブジェクトとして返ってくる点が最大の違い
  • query_posts()と使い方は似ているが、パラメーターを変更するだけでループを簡単にカスタマイズできる
  • しかしWP_Query()は、$query_string変数は必要ない

いつ使うのか?

WP_Query()は、カスタマイズされた複数のループを作成するために使用する。
複数のループをいくつでも作成し、それぞれの出力をカスタマイズできる。

get_posts()ループ

get_posts()は、テーマに複数のループを作成する最も簡単で安全な方法だが、渡されたパラメーターを元に配列を作る関数で、配列を使用する必要がある。

  • メインクエリを書き換えることは無い。したがい、この関数を読んだ後にリセット処理は不要
  • get_posts()のループの中は、the_titleなどのテンプレートタグは機能しない
  • the_titleなどのテンプレートタグを使いたい場合は、setup_postdataを使う
  • setup_postdata$postの内容を書き換えてしまうため、setup_postdataを使用した後は必ずwp_reset_postdata()でリセットする必要がある
  • posts_per_pageの代わりにnumberpostsを使用して、投稿の数を制限している

いつ使うのか?

get_postsは、サイドバーや、1つのページ内に、特定のカスタム投稿の新着5件を出したいなど、細かなカスタマイズをしなければならないものが混在している場合、メインループの他にサブループを作らなければならない場合などに使える。

ループのカスタマイズ( pre_get_posts )

 

  • pre_get_postsは、WordPressのアクションフック
  • WordPressがクエリを実行する前に呼び出されているフックで、pre_get_postsを使うことでそれぞれのページに合ったクエリの問い合わせ結果をメインクエリとして扱うことができる
  • 各ページにWP_Queryget_posts()と一緒に、パラメーター用の$argsの中にループを書ける
  • 各ページのクエリがfunction.phpに集約される
  • データベースへの問い合わせも1度になるため動作が高速化