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のお作法です。