記事の詳細

この間「あれーなんでこれASC指定なのに表示変わらないんだー?」ってなっていたら「これメインループやん」というところにいきついたのでメモメモ。

 

WordPressのメインループとメインクエリ

WordPressをいじっているとよく見かける下のコード。

デフォルト投稿コンテンツ、固定ページ、カテゴリやアーカイブで利用されているこのコードは「メインループ」
このコード=メインループが、サーバーに設定したデータベースから呼び出す記事データの条件が「メインクエリ」
メインループはメインクエリを発行して情報を取得し、ページとして「自動的に」表示します。

query:問い合わせ

WordPressのサブループとサブクエリ

別途、さらに見かけるのが下のコード。

上記メインループとは別途にループを使う際に利用されているこのコードは「サブループ」
固定ページに投稿記事一覧を出したい、とか、アーカイブページに固定ページ一覧を出したい、とか、「テーマのメインとなっているループ以外にループを同ページに使いたい」となったときは、自分でメインループとは別に「これ出して!」とクエリを発行しないといけません。これがサブクエリ。
メインループ以外は全部サブループ。一ページ内部に異なるループが存在しているならどれか一つがメインループで他のループは全部サブループのはず。

サブクエリは上記の通り自分で「お願いねー」とやるので自動的ではありません。

 

「have_posts()」…メインループに「表示数を制限」「並び順を変更」など条件を付けたいからメインクエリを書き変える

1.非推奨:query_posts()

  • wp_reset_query の記述を忘れると、他のページが変わってしまう可能性がある
  • データベースを再度読み込んでいるので表示速度が遅い
  • ページネーションやナビゲーション、カテゴリ選択などがうまく動かないことがある

「データベースを再度読み込んでいる」とはどういうことかというと、

  1. 「この情報表示するのね! わかった、もってくるね!」(have_post())
  2. 「あっ、この情報の表示の仕方違うの? わかった! もう一回データベース行ってくるね!」(query_post())
  3. 「これでいい? 表示するね!」

という手順をしているのですね。遅くなるわけです。

query_posts()は以下のように書かれています。何度でも書きますがもう非推奨ですよ。使わないようにしましょう。

昔のWEBなどにこういった記載があったら書き変えていきましょう。

 

2.functions.phpに書くpre_get_posts

pre_get_postsはアクションフック。functionで変更するページを指定しながら利用します。

 

サブループに「表示数を制限」「並び順を変更」など条件を付けて表示する

1.get_post()

テンプレートタグ。「setup_postdata()」で「the_title」や「the_content」のテンプレートタグを利用できるようになります。内部でグローバル変数 $post を書き換えているので、「wp_reset_postdata();」でリセット必須。
(つまりget_post()はsetup_postdate()を入れないとテンプレートタグが使えないってことです)

ちょっと複雑な表示の仕方の参考はこちら。

あるカスタム投稿ページで別のカスタム投稿の記事一覧が取得できて、かつそれがエディタ上で配置を変更できる、そしてその記事一覧が記事ページが属するタクソノミ―と同...

上記記事の内容は書き変えれば以下のWP_Queryでもいけます。たぶん。

パラメータはこちら。

2.WP_Query

クラス。内部でグローバル変数 $post を書き換えているので、「wp_reset_postdata();」でリセット必須。

パラメータはこちら。

get_post()とWP_Queryの違いはそんなにないそうです。WP_Queryのほうができることが多いようなので、こっちを利用していった方がいいかもしれませんね。

get_post()

  • foreach文と組み合わせて使われるのが一般的。「配列の中から指定された条件のものをすべて抽出する」
  • テンプレートタグ。WordPressに何かを実行あるいは取得するように指示するもの。

WP_Query

  • while文と組み合わせて使われるのが一般的。「条件が満たされる場合に処理を進める」
  • クラス。リクエストの解析と操作、投稿取得。

まとめ

  • メインループを書き変える場合は「pre_get_posts」
  • サブループを作るときは「WP_Query」
  • テーマを作っているときのデフォルトのループは「メインループ」。
  • テーマを利用しているときのループ追加は「サブループ」。

そして「query_posts()」は使わない。

これだけ守っておけばなんとかなります。
たぶん。

いや勉強しないとだめですね……。

 

この記事であなたの課題を解決することができましたか?

疑問点があったり、解決できなかったことがありましたら、お気軽にご相談してください。

The following two tabs change content below.
久保田 里美

久保田 里美

価値あるコンテンツ制作部インクループ株式会社
デザイナー。コンセプト設立からデザインを理論立てて起こすことをポリシーに、WEB媒体から紙媒体まで幅広く手掛けていきたいデザイナー。日々勉強日々精進。

ほかの投稿も読んでみませんか?

コメントは利用できません。

AD

ページ上部へ戻る