WordPressエンジニア向け入門その4、リクエストに応じたデータを取得するメインクエリ処理

WordPressエンジニア向け入門その4です。 前回 『WordPressエンジニア向け入門その3、リクエスト解析とページ種類の決定』は、WordPressのリクエストの仕組みについて説明しました。今回はその続きで、リクエスト解析結果に基づいたデータ取得処理についてです。

この連載の中でも特に重要な部分です。メインクエリを理解することでWordPressの思想が見えてきます。残念ながら世の中のWordPressの情報で、メインクエリを理解せずに誤ったデータ取得について記載されているものもまだまだ多いです。 確実に理解することで開発の効率化・品質の向上が期待できます。

スポンサーリンク

メインクエリとは

メインクエリとは読んで字のごとく、「メイン」の「クエリ」です。

  • メインとは、ページで主となるもの(データ)のことです。
  • クエリとは、データの検索(取得)のことです。

組み合わせると、 ページの主となるデータの検索(取得)処理となります。ページの主となるデータとはなんでしょうか。ページ種類ごとに以下の分類になります。

  • 個別投稿記事ページ → 投稿データ1記事
  • アーカイブページ → アーカイブに属する投稿データ(通常、複数件)

ページ種類に応じて適切なデータを取得する処理のことをメインクエリといいます。 メインクエリは自動で処理されることもポイントです。

サブクエリとは

メインクエリがあればサブクエリもあります。ページのメインデータではデータを取得・表示する際はサブクエリを実行します。サブクエリは例えば、サイドバーに新着記事5件表示や記事の下部に関連記事を表示する際に利用します。

詳しい処理方法等はまた別の機会に。

データ取得処理

それではメインクエリによるデータ取得処理について説明します。データの取得条件はリクエストの種類(URL)によって変わります。個別投稿記事ページヘのリクエストなのか、アーカイブページへのリクエストなのか等で取得すべきデータが変わるからです。

データ取得処理はWP_Queryというクラスに定義されており、get_posts関数で処理されます。データ取得結果等は$wp_queryというグローバル変数に格納されます。

実際にリクエストからデータを取得する例を見ていきましょう。

例1、カテゴリーアーカイブへのリクエストがあった場合

カテゴリアーカイブページ(http://example.com/category/foo)にリクエストがあった場合、リクエスト解析処理にて、 index.php?category_name=fooというリクエストパラメータと解釈されます。(詳しくは前回の記事 『WordPressエンジニア向け入門その3、リクエスト解析とページ種類の決定』をご覧ください)

category=fooというパラメータを元にfooカテゴリに属する投稿記事データを取得します。

例2、個別投稿記事ページへのリクエストがあった場合

パーマリンク設定が、http://example.com/%category%/%postname%/(カテゴリスラッグ/投稿スラッグ)で、 個別投稿記事ページ(http://example.com/foo/bar)にリクエストがあった場合(カテゴリ:foo、投稿スラッグ:bar)、リクエスト解析処理にて、 index.php?name=bar&category_name=fooというリクエストパラメータと解釈されます。

name=barのnameパラメータから個別投稿記事へのリクエストと判断し、投稿記事barを取得します。

クエリフラグの設定

クエリフラグとは、is_singleやis_categoryといったページ種類の判定用フラグのことです。グローバル変数の$wp_queryのプロパティとして設定されます。

メインクエリの処理(get_posts関数)にて、データを取得する前にクエリフラグ設定処理が実行されます。カテゴリアーカイブへリクエストがあった場合、is_archiveやis_categoryがtrueと設定されます。

メインクエリの変更方法

メインクエリはリクエストの種類に応じて決定し、自動でデータを取得する処理であることがわかりました。では、データ取得処理を変更することはできるのでしょうか?

はい、可能です。

例えば、

  • 特定のカテゴリのときだけ表示件数を変えたい
  • 特定の投稿記事は非表示にしたい

など。ページの種類や条件によって、表示内容を制御したい場合、WordPressで用意されているフックを使えば実現できます。

メインクエリ変更に関するフック

よく使う関連フックは以下の2つです。

  • request
  • pre_get_posts

ほとんどの場合、pre_get_postsを使用すれば事足りるはずです。簡単に説明すると、requestフィルターがリクエストの内容を変更するフックで、pre_get_postsはデータ取得の条件を変更するフックです。

詳しい使い方等はまたの機会に。

まとめ

もう一度おさらいすると、メインクエリとは、リクエストされたページの種類に応じて適切なデータを自動で取得する処理のことです。

必ず自動で取得する処理が実行されるので、それを生かしたサイトにしましょう。間違ってもメインクエリの存在を無視して、自分でページのメインデータを取得しなおすことのないように気をつけましょう。

データ取得条件を変更したいときはフックを使うことがWordPressのお作法です。

スポンサーリンク

この記事が気に入っていただけたらシェアお願いします。励みになります。
prev WordPressエンジニア向け入門その3、リクエスト解析とページ種類の決定 next WordPressエンジニア向け入門その5、ページ種類に応じたテンプレートファイルの選択

スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です