- サイトデザイン工事中です。ご意見をお寄せください。
- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
クエリ概要
提供:WordPress Codex 日本語版
この記事はWordPressがブログページを構築する仕組みとその仕組みを修正する方法について述べる開発者向け概要です。ターゲットとなるのは、クエリやパーマリンク機能を拡張するプラグインの開発者、そしてWordPREssのコアに新機能を付け加えたり、バグを修正するためにWordPressをよりよく知ろうとしている開発者です。
より詳しく知るには、ここで言及されるWordPressのコアPHPファイルや関数を読む必要があります。
それでは、ここでWordPressがいかにして表示すべきページやポストを決定し、それを表示するかをステップごとに説明します:
- ユーザーがあなたのページの一部となるURLを入力したり、リンクをクリックしたりすると、WordPressは手始めにいくつかのコアファイル (wp-config.php, wp-settings.php, など)を起動させます。ファイル読み込み順の詳細に興味があるならば、index.phpから始めて、includeやrequireで追加されていくPHPファイルを追うのが良いでしょう。
- WordPressはあなたが有効にしているすべてのプラグインを読み込んで初期化します(これはinitアクションと呼ばれています)
- WordPressは国際化のために テキスト・ドメイン と、現在有効になっているテーマのfunctions.phpを読み込みます。
- WordPressはwp()関数(を参照)を起動します。すると、$wp->main()($wp はWPクラスのインスタンス。wp-includes/classes.php参照)が呼び出されます。これによりWordPressに対して以下の命令が発行されます:
- WP->parse_request()を使ってURLをパースし、クエリを特定せよ--詳しくは以下を参照
- $wp_query->parse_query()を使い($wp_queryはWP_Queryクラスのインスタンス。wp-includes/query.php参照)、条件分岐タグで使用されるすべてのis_変数を設定せよ。※この関数は「パース」という名前を持つにも関わらず、この場合、WP_Query->parse_queryが実際にパースを行うことはない。すでにWP->parse_request()で処理されているからである。
- 特定したクエリをMySQLのデータベースクエリに変換し、WP_Query->get_posts()関数によって投稿のリストを取得するデータベースクエリを発行せよ。そして、WordPressループ内で使用される$wp_queryオブジェクトの中に保存せよ。
- 404エラーを処理せよ
- ブログのHTTPヘッダーを送出せよ
- WordPressループのための変数を設定せよ
- WordPressはテンプレートを読み込み、テンプレート階層に従ってどのテンプレートファイルを使用するかを特定します。そして、そのファイルを実行します(基本的にはあなたのテンプレートファイルに書いてあることをそのまま行います)。場合によっては、フィードファイル(wp-rss2.phpなど)を実行するかもしれません。
- 多くの場合、テンプレートやフィードファイルが[[The Loop|WordPresループ]を実行して、投稿やページを表示します。
- また、テンプレートやフィードファイルは、WordPressに組み込まれた関数を使って、カテゴリーやアーカイブへのパーマリンクを出力します。
WP->parse_request()についての詳細
すでに述べたように、WP->parse_request() (WPクラスのインスタンス。wp-includes/classes.php参照)はURLをクエリ特定のためにパースします。これが行うことをステップごとに示します:
- URLからGET変数の部分を取り除く(URL内の?に続く部分)。それから、ブログのホームURLも取り除く。
- $wp_rewrite->wp_rewrite_rules() ($wp_rewriteはWP_Rewriteクラスのインスタンス。wp-includes/rewrite.php参照)を呼び出して現在有効になっているリライト・ルールを取得する。リライト・ルールはWordPressパーマリンクのための一連のパターンマッチルールであり、マッチした場合にどうすればよいかを指定する。例えば、デフォルトで抜き出されたパーマリンクがcategory/abcだとすると、カテゴリーabcが要求されているということが特定される。また、ホームページ用のリライトルールもある(ブログURLの後ろに何もない)。
- リライトルールはパーマリンクがマッチするまでルールを適用する。何も見つからなければ、404エラーである。マッチすれば、WordPressは適用されたルールに従って情報を抽出する。
- 現在有効になっているクエリ変数のリストを取得する。それぞれのクエリ変数に対し、WordPressはそれがパラーマリンクの解析によって得られたのか、それともPOSTやGETからなのかを判断し、クエリ特定のための配列($wp->query_varsはWP クラスのインスタンス。wp-includes/classes.php参照)に格納する。
プラグインで改造できるもの
上記で述べたデフォルトのクエリやパーマリンク構造に関して、プラグインで修正できるものを挙げます。修正の具体的な詳細はカスタムクエリを参照してください。
- パーマリンクの解析方法を変更するために、リライト・ルールの追加、修正、削除する。これはフィルターやアクションではなく、add_rewrite_rule、add_rewrite_endpointといったwp-includes/rewrite.php内の関数を呼び出すことで実現する。WP_Rewrite->wp_rewrite_rules()は基本的に以前保存されたリライト・ルールを利用するだけなので、少しトリッキーである(リライト・ルールはrewrite_rulresオプションとしてWordPressデータベースに保存されている)。もしリライト・ルールを修正したければ、$wp_rewrite->flush_rules()で再度解析させるようにしなくてはならない。これはプラグインのinitアクションを利用し、一連の処理の初期段階で起こす必要がある。
- 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アクション)