WordPressのリクエスト処理まとめ(『詳解WordPress』を読んで) | WordPress
出典: プライム・ストラテジー株式会社『詳解WordPress』(要点を自分の言葉でまとめたもの。原文の引用は最小限に留めている)
フロントコントローラとページコントローラ
通常のサイト表示(投稿・固定ページ・アーカイブ・トップページなど)は、どのURLでアクセスしても必ずindex.phpという1つのフロントコントローラからWordPressの実行が始まる。一方、管理画面での投稿更新のような処理はindex.phpを経由せず、wp-admin/post.phpのようなページごとのコントローラが直接処理を担う(ページコントローラ方式)。
サイト表示時の流れ(例: 投稿ID=1の個別記事ページ)
- WebサーバがHTTPリクエスト(例:
GET /?p=1)をPHPの環境変数として受け取る - WordPressはクエリ文字列
p=1を「投稿ID1の個別記事ページを取得する」という意味のWordPressクエリに変換 - WordPressクエリをSQLクエリに変換し、MySQLに実行を依頼
- 取得したデータをもとにHTMLを生成し、レスポンスとして返す
管理画面での更新時の流れ(例: 投稿の本文編集→保存)
wp-admin/post.phpがPOSTデータ(action=editpost、post_ID=1など)を受け取る- リクエストヘッダのCookie(ログインCookie)を検証し、ログイン状態と編集権限を確認
- POSTデータから更新用のSQLクエリを組み立て、MySQLに実行を依頼
- 更新後、編集画面へリダイレクトさせるため、ステータスコード
302とLocationヘッダーを含むレスポンスを返す(このレスポンスにボディは無い) - リダイレクトを受け取ったブラウザは、レンダリングを行わずに新たなGETリクエストを発行し、更新後の編集画面を表示する
このとき、リクエストにはログイン確認用のwordpress_logged_in_から始まるCookieや、保存直後を示すwp-saving-postのようなCookieが含まれる。レスポンスは通常の200 OKで、更新後の編集画面のHTMLが返される。
the_content系のフック・フィルターの探し方
the_contentに関連するアクション・フィルターがコアのどこで呼ばれているかは、ソースコードに対して以下のようなコマンドで検索すると調べやすい。
$ find ./ -name "*.php" | xargs egrep '(do_action|apply_filters)(_ref_array)?\s*\(' -ni | grep "the_content"
これを実行すると、例えば以下のような箇所がヒットする(WordPressコアのバージョンにより行番号やファイル構成は異なる)。
wp-admin/includes/export.php:the_content_exportフィルターwp-includes/feed.php:the_contentフィルター、the_content_feedフィルターwp-includes/deprecated.php:the_content_rssフィルター(非推奨)wp-includes/formatting.php、wp-includes/post-template.php:the_contentフィルター、the_content_more_linkフィルターwp-includes/comment.php:抜粋生成時のthe_contentフィルター
このようにgrep/egrepでコア全体を横断検索すると、あるフックがどこで発火しているかを効率よく特定できる。