出典: プライム・ストラテジー株式会社『詳解WordPress』(要点を自分の言葉でまとめたもの。原文の引用は最小限に留めている)

フロントコントローラとページコントローラ

通常のサイト表示(投稿・固定ページ・アーカイブ・トップページなど)は、どのURLでアクセスしても必ずindex.phpという1つのフロントコントローラからWordPressの実行が始まる。一方、管理画面での投稿更新のような処理はindex.phpを経由せず、wp-admin/post.phpのようなページごとのコントローラが直接処理を担う(ページコントローラ方式)。

サイト表示時の流れ(例: 投稿ID=1の個別記事ページ)

  1. WebサーバがHTTPリクエスト(例: GET /?p=1)をPHPの環境変数として受け取る
  2. WordPressはクエリ文字列p=1を「投稿ID1の個別記事ページを取得する」という意味のWordPressクエリに変換
  3. WordPressクエリをSQLクエリに変換し、MySQLに実行を依頼
  4. 取得したデータをもとにHTMLを生成し、レスポンスとして返す

管理画面での更新時の流れ(例: 投稿の本文編集→保存)

  1. wp-admin/post.phpがPOSTデータ(action=editpost、post_ID=1など)を受け取る
  2. リクエストヘッダのCookie(ログインCookie)を検証し、ログイン状態と編集権限を確認
  3. POSTデータから更新用のSQLクエリを組み立て、MySQLに実行を依頼
  4. 更新後、編集画面へリダイレクトさせるため、ステータスコード302とLocationヘッダーを含むレスポンスを返す(このレスポンスにボディは無い)
  5. リダイレクトを受け取ったブラウザは、レンダリングを行わずに新たな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でコア全体を横断検索すると、あるフックがどこで発火しているかを効率よく特定できる。