• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

クエリ概要

提供: WordPress Codex 日本語版
移動先: 案内検索

この記事はWordPressがブログページを構築する仕組みとその仕組みを修正する方法について述べる開発者向け概要です。ターゲットとなるのは、クエリやパーマリンク機能を拡張するプラグインの開発者、そしてWordPressのコアに新機能を付け加えたり、バグを修正するためにWordPressをよりよく知ろうとしている開発者です。

より詳しく知るには、ここで言及されるWordPressのコアPHPファイルや関数を読む必要があります。

それでは、ここでWordPressがいかにして表示すべきページやポストを決定し、それを表示するかをステップごとに説明します:

  1. ユーザーがあなたのページの一部となるURLを入力したり、リンクをクリックしたりすると、WordPressは手始めにいくつかのコアファイル(wp-config.php, wp-settings.php, など)を起動させます。ファイル読み込み順の詳細に興味があるならば、index.phpから始めて、includeやrequireで追加されていくPHPファイルを追うのが良いでしょう(またはhumanshell.net の分かりやすい記事をご覧ください)。
  2. WordPressはあなたが有効にしているすべてのプラグインを読み込んで初期化します(これはinitアクションと呼ばれています)。
  3. WordPressは国際化のために テキスト・ドメイン と、現在有効になっているテーマのfunctions.phpを読み込みます。
  4. WordPressはwp()関数(を参照)を起動します。すると、$wp->main()$wpWPクラスのインスタンス。wp-includes/class-wp.php参照)が呼び出されます。これによりWordPressに対して以下の命令が発行されます:
    1. WP->parse_request()を使ってURLをパースし、クエリを特定せよ(詳しくは以下を参照)
    2. $wp_query->parse_query()を使い($wp_queryWP_Queryクラスのインスタンス。wp-includes/query.php参照)、条件分岐タグで使用されるすべてのis_変数を設定せよ。※この関数は「パース」という名前を持つにも関わらず、この場合、WP_Query->parse_queryが実際にパースを行うことはない。すでにWP->parse_request()で処理されているからである。
    3. 特定したクエリをMySQLのデータベースクエリに変換し、WP_Query->get_posts()関数によって投稿のリストを取得するデータベースクエリを発行せよ。そして、WordPressループ内で使用される$wp_queryオブジェクトの中に保存せよ
    4. 404エラーを処理せよ
    5. ブログのHTTPヘッダーを送出せよ
    6. WordPressループのための変数を設定せよ
  5. WordPressはテンプレートを読み込み、テンプレート階層に従ってどのテンプレートファイルを使用するかを特定します。そして、そのファイルを実行します(基本的にはあなたのテンプレートファイルに書いてあることをそのまま行います)。場合によっては、フィードファイル(wp-rss2.phpなど)を実行するかもしれません。
  6. 多くの場合、テンプレートやフィードファイルがWordPressループを実行して、投稿やページを表示します。
  7. また、テンプレートやフィードファイルは、WordPressに組み込まれた関数を使って、カテゴリーやアーカイブへのパーマリンクを出力します。

WP->parse_request()についての詳細

すでに述べたように、WP->parse_request() (WPクラスのインスタンス。wp-includes/class-wp.php参照)はURLをクエリ特定のためにパースします。これが行うことをステップごとに示します:

  1. URLからGET変数の部分を取り除く(URL内の?に続く部分)。それから、ブログのホームURLも取り除く。
  2. $wp_rewrite->wp_rewrite_rules() ($wp_rewriteWP_Rewriteクラスのインスタンス。wp-includes/rewrite.php参照)を呼び出して現在有効になっているリライト・ルールを取得する。リライト・ルールはWordPressパーマリンクのための一連のパターンマッチルールであり、マッチした場合にどうすればよいかを指定する。例えば、デフォルトで抜き出されたパーマリンクがcategory/abcだとすると、カテゴリーabcが要求されているということが特定される。また、ホームページ用のリライトルールもある(ブログURLの後ろに何もない)。
  3. リライトルールはパーマリンクがマッチするまでルールを適用する。何も見つからなければ、404エラーである。マッチすれば、WordPressは適用されたルールに従って情報を抽出する。
  4. 現在有効になっているクエリ変数のリストを取得する。それぞれのクエリ変数に対し、WordPressはそれがパーマリンクの解析によって得られたのか、それともPOSTやGETからなのかを判断し、クエリ特定のための配列($wp->query_varsWP クラスのインスタンス。wp-includes/class-wp.php参照)に格納する。

プラグインで改造できるもの

上記で述べたデフォルトのクエリやパーマリンク構造に関して、プラグインで修正できるものを挙げます。修正の具体的な詳細はカスタムクエリを参照してください。

  • パーマリンクの解析方法を変更するために、リライト・ルールの追加、修正、削除する。これはフィルターやアクションではなく、add_rewrite_ruleadd_rewrite_endpointといったwp-includes/rewrite.php内の関数を呼び出すことで実現する。WP_Rewrite->wp_rewrite_rules()は基本的に以前保存されたリライト・ルールを利用するだけなので、少しトリッキーである(リライト・ルールはrewrite_rulresオプションとしてWordPressデータベースに保存されている)。もしリライト・ルールを修正したければ、$wp_rewrite->flush_rules()で再度解析させるようにしなくてはならない。これはプラグインのactivation/deactivation/uninstallアクションを利用し、一連の処理の初期段階で起こす必要がある。毎リクエストごとにこれを行わないことは非常に重要です。プラグインの有効化のような時のみに行なってください。
  • POST、GET、パーマリンク・リクエストなどから特定されたクエリに保存されているクエリ変数に働きかけるため、クエリ変数を削除・追加する(query_varsフィルター)。
  • クエリ変数が保存された後にクエリを修正する(requestフィルター、またはparse_requestアクション。もし条件分岐タグのテストを行いたければ、is_変数がセットされた後に実行されるparse_queryまたはpre_get_postsアクションを使う)。
  • クエリが特定された後に作られるMySQLデータベースクエリを以下のフィルターを使って修正する。
    • posts_where
    • posts_join
    • posts_groupby
    • posts_orderby
    • posts_distinct
    • posts_fields
    • post_limits
    • posts_where_paged
    • posts_join_paged
    • posts_request
  • データベースクエリの結果を修正する(the_postsフィルター)
  • デフォルトのテンプレート選択を上書きする(template_redirectアクション)

関連

記事

コード・ドキュメンテーション

  • クラス: WP_Query - WP_Query クラスの詳細な全容
  • クラス: WP_Comment_Query - コメント関連のクエリのためのクラス
  • クラス: WP_User_Query - ユーザー関連のクエリのためのクラス
  • オブジェクト: $wpdb - $wpdb オブジェクトの使い方全容
  • 関数: set_query_var()
  • 関数: get_query_var()
  • 関数: query_posts() - 追加のカスタムクエリを作成
  • 関数: get_post() - 項目の ID を取得しデータベース内にあるその投稿のレコードを返す
  • 関数: get_posts() - 投稿の配列を返すことに特化した関数
  • 関数: get_pages() - ページの配列を返すことに特化した関数
  • 関数: have posts() - クエリが投稿を返すか否かを判断する条件関数
  • 関数: the_post() - クエリ後に自動的にループを設定する
  • 関数: rewind_posts() - 現状のループをリセットする
  • 関数: setup_postdata() - ループ内で個別の結果を得るためのクエリデータを設定する
  • 関数: wp_reset_postdata() - 直前のクエリを復元する (通常はループ内の別のループの後に用いられる)
  • 関数: wp_reset_query()
  • 関数: is_main_query() - 変更されるクエリがメインのクエリであることを確認する
  • アクションフック: pre_get_posts - WordPressクエリが実行される前に変更する
  • アクションフック: the_post - post クエリの後で post オブジェクトを変更する
  • フィルターフック: found_posts - WP_Query オブジェクトの found_posts 値を変更する

最新英語版: WordPress Codex » Query_Overview最新版との差分