処理速度計測中:0.012 sec  ページキャッシュは使用しておりません。
2013年04月22日 大曲 仁

WordPress の表示ロジックを理解する – Reloaded –

パラメーターの理解が基本中のキ

WordPress を理解する上で、最も重要なことは「与えられたパラメーターから条件に合致した記事情報を抽出して表示するアプリケーションである」という理解です。

http://www.example.com/index.php?p=nnnn
http://www.example.com/index.php?cat=n

インストール直後のパーマリンク設定がデフォルトになっている場合には、上記のようなパラメーターを伴ったURLとなります。この指定されたパラメーターによって表示される内容が変わります。当然と言えば当然のように思われがちですが、普段からパーマリンクの設定をカスタマイズしていると、意外とこの点の理解が不足がちです。

指定可能なパラメーターは 3.5 では、標準で下記の46種類が存在します。このほかにカスタム投稿タイプやカスタム分類の設定を行っている場合、register_post_type、register_taxonomy で指定した query_var が追加となります。

パラメーター名 役割 指定例
m 日時 201304
p 投稿のID 1234
posts 不明
w 12
cat カテゴリーのterm_id 1
withcomments コメントフィード関連 1
withoutcomments コメントフィード関連 0
s サイト内検索の検索文字列 WordPress
search 不明
exact 検索時完全一致にするかどうか 1
sentence 検索文字列の分解を行うか 1
calendar 不明
page ページ分割時のページ送り数 3
paged アーカイブページのページ送り数 5
more moreの表示 1
tb トラックバック 1
pb 不明
author 作成者のユーザーID 2
order アーカイブの昇順・降順 asc
orderby アーカイブの順列 date
year 2013
monthnum 4
day 16
hour 20
minute 21
second 23
name 投稿スラッグ  hello-world
category_name カテゴリースラッグ uncategorized
tag タグのterm_id 4
feed フィードの種類 rss2
author_name 作成者名 omagari
static 不明
pagename 固定ページのスラッグ sample-page
page_id 固定ページのID 2
error レスポンスコード? 404
comments_popup コメントポップアップ
attachment メディアのスラッグ koara
attachment_id メディアのID 11094
subpost attachmentのエイリアス
subpost_id attachment_idのエイリアス
preview プレビューかどうか 1
robots ロボットテキストかどうか 1
taxonomy 分類 category
term 分類のスラッグ uncategorized
cpage コメント分割時のページ送り数 4
post_type 投稿タイプスラッグ custom_post

この標準で利用できるパラメーターは、wp-includes/class-wp.php の最初に記述されている、WP クラスのメンバー変数、$public_query_vars として定義されています。

var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type');

では、パーマリンクをデフォルト以外に設定していた場合は、どうなのでしょう?

 URLからパラメーターへの変換 – リライトルール –

パーマリンクの設定をデフォルト以外にした場合、アクセスされたURLを元にしてパラメーターに変換を行っています。

例えば、このページ https://www.prime-strategy.co.jp/wp/2499/ は、内部的に、 https://www.prime-strategy.co.jp/index.php?p=2499 に変換されてから処理されています。

url-mapping

では、どうやってパラメーターへの変換を行っているのでしょうか?
WordPress は、デー タベース上に表示可能なURLのパターンとパラメーターへのマッピングデータを持っています。これをリライトルールと言います。
マッピングデータというからには、あのパターンはこの変換、このパターンはこの変換といったように、複数の変換ルールによって構成されています。例示するとインストール直後にパーマリンク設定を行った時点での変換ルールは68通りとなります。

わざわざデータベースにこのマッピングデータを保存するのは、WordPress のパーマリンク設定が何通りも設定可能となっており、この設定如何でリライトリールの内容も変わるため、ファイル上で変換ルールを管理することが煩雑となってしまうためです。

このため、WordPress は、パーマリンク設定を変更する際に、それに適したリライトルールの生成を行ってデータベースに保存しています。一種のキャッシュデータと考えても間違いではありません。

リライトルールの変換方法

リライトルールは、URLパターンの正規表現をキーとした連想配列で構成されています。
この連想配列をループ処理によって、順繰りに先頭からURLとの照合処理を行い、最初に合致した変換ルールを採用します。つまり、リライトルールの中に複数合致するものがあったとしても、より先にある変換ルールが採用されるというわけです。
たとえば、カテゴリーのURLと同じになる固定ページを作ったとしても、カテゴリーが表示されるのは、カテゴリーの変換ルールが先に記述され変換ルールとして採用されるためです。

採用された変換ルールの確認

想定したURLにアクセスしても、意図したとおりの表示にならなかった場合、まずは、この変換ルールが正しく行われているか確認しましょう。
確認するのには、Debug BarDebug Bar Extender を使うと、ブラウザ上から簡単に確認することができます。

想定したURLにアクセスして、Debug 表示のRequest メニューを見ると、リクエストされたURL(Request )、採用された変換ルール(Matched Rewrite Rule )と変換されたパラメーター(Matched Rewrite Query )が分かるようになっています。

debug-request

図の場合は、archives/2593 というリクエストに対して、archives/([0-9]+)(/[0-9]+)?/?$ という変換ルールが合致し、p=2593&page= へと変換されたということになっています。

補足

リライトルールは、options テーブルに rewrite_rules という名前で保存されています。具体的な中身を見たければ、

<?php var_dump( get_option( 'rewrite_rules' ) ); ?>

で確認することができます。

まとめ

  • WordPress は、46種のパラメーターで指定された条件に合った記事の表示を行うアプリケーション
  • パーマリンクの設定を行っている場合は、リライトルールによってパラメーターへの変換がおこなわれている
  • 表示がうまくいかない場合は、Debug Bar、Debug Bar Extender を使って変換内容を確認すべし

実行フローを理解する

WordPress の表示を区分するとしてて、全体を4フェイズに分けて考える

phase

  1. 初期化
  2. 解析
  3. 抽出
  4. 表示

初期化

phase1

初期化フェイズは、WordPress の処理に必要な情報の読み込みや環境設定を行います。プラグインやテーマのfunctions.php の読み込みもこの段階で行われます。

 解析

phase2

解析は、リクエストされたURLから WordPress として有効なパラメーターを拾い出す処理です。上述したリライトルールを用いた変換処理もこの時点でおこなわれます。

抽出

phase3

抽出処理は、有効とされたパラメータに応じたSQL文を組み立て、条件にあった記事の取得と、表示に必要な変数の設定、レスポンスヘッダーの発行を行っています。

表示

phase4

 ここでようやくテンプレートファイルの処理となります。前フェイズで抽出した記事データを元にループ処理を用いてWebページの表示を行います。

ファイルの読み込み順序

Leave a Reply

Your email address will not be published. Required fields are marked *

トラックバックURL

https://www.prime-strategy.co.jp/wp/2499/trackback/