ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
WordPressは、ブラウザからのリクエストを受け取ると、初期化(コア・プラグイン・テーマの読み込み)→クエリ解析→テンプレート選択→投稿の出力(The Loop)→HTML生成・送信という一連の処理を順に実行してページを表示します。この記事では、リクエストが届いてから完成したHTMLが返るまでの内部処理の流れを、入口となるindex.phpからテンプレート出力までの順を追って解説します。
| この記事の要点 |
|---|
|
全体像
WordPressは、テーマやプラグインによって表示されるページが大きく変わるため複雑に見えますが、内部の基本的な処理の流れは共通しています。一般的なテーマ(クラシックテーマ)構成での標準的な流れは、次の8段階としてとらえると理解しやすくなります。
- リクエスト受信:Webサーバーがリクエストを受け、
index.phpへ処理を渡す。 - コアの読み込み:
wp-load.php・wp-config.phpを経由して設定とデータベース接続情報を読み込む。 - 初期化:
wp-settings.phpがコア機能・有効化されたプラグイン・テーマのfunctions.phpを読み込み、フックを登録する。 - クエリ解析:URLをリライトルールと照合し、
WP_Queryが「どの投稿・ページを表示するか」を決定する。 - テンプレート選択:テンプレート階層のルールに従い、表示するページ種別に対応するテンプレートファイルを選ぶ。
- The Loop:選ばれたテンプレート内で、クエリ結果の投稿を1件ずつ取り出して出力する。
- フックによる拡張:各処理の要所でアクション・フィルターが実行され、プラグインやテーマが内容を加工・追加する。
- HTML生成・送信:組み上がったHTMLがブラウザへ返され、ページが表示される。
以降では、それぞれの段階を具体的なファイル名・関数名とともに見ていきます。
1. リクエスト受信から入口ファイルまで
WordPressは、すべてのフロント側リクエストを単一の入口で受け取る「フロントコントローラ」型の構成を採用しています。サーバー設定(Apacheでは.htaccess、Nginxではlocationディレクティブ)により、存在しないファイルへのアクセスはすべてサイトルートのindex.phpへ転送されます。
たとえばApacheの場合、.htaccessに記述されたリライトルールが、実ファイルとして存在しないURLをindex.phpへ振り向けます。index.php自体の処理は非常に短く、表示モードを定義したうえでwp-blog-header.phpを読み込むだけです。
// index.php(概念的な内容) |
wp-blog-header.phpは、コアを読み込むwp-load.phpを呼び出し、続いてメインクエリの実行(wp())とテンプレートの読み込み(template-loader.php)を順に行う、流れ全体の司令塔の役割を持ちます。
2. コアと設定の読み込み(wp-load / wp-config)
wp-load.phpは、サイトの設定ファイルであるwp-config.phpの場所を特定して読み込みます。wp-config.phpには、データベースの接続情報・認証用の秘密鍵・各種定数などサイト固有の設定が記述されています。
wp-config.phpは最後にwp-settings.phpを読み込みます。ここからがWordPress本体の初期化処理です。設定値や接続情報を読み込む段階であり、まだ「どのページを表示するか」は決まっていません。
3. WordPressの初期化(wp-settings.php)
wp-settings.phpは、WordPressの動作に必要な多数のコアファイルを読み込み、システム全体を組み立てる中核的な処理です。主に次のような処理が行われます。
- コア関数群(
load.php・default-constants.phpなど)の読み込み。 - フック機構を提供する
plugin.phpおよびWP_Hookクラスの読み込み。これによりadd_action()/add_filter()などが利用可能になる。 - データベース接続の確立。
- 有効化されているプラグインの読み込み。各プラグインはこの段階でフックを登録する。
- 有効なテーマの
functions.phpの読み込み。テーマ独自の機能やフックの登録が行われる。 - 初期化の節目で
initなどのアクションフックが実行される。
この段階を終えると、コア・プラグイン・テーマがすべて読み込まれ、フックが登録された状態になります。つまり、後続の処理に各拡張が介入できる準備が整います。
4. クエリ解析(リライトとWP_Query)
初期化後、wp-blog-header.phpはwp()関数を呼び出してメインクエリを実行します。ここで行われるのは、URLを解析して「どのコンテンツを表示すべきか」を確定させる処理です。
- リライト解析:リクエストされたURL(パーマリンク)を、登録済みのリライトルールと照合し、内部的なクエリ変数(例:投稿名・カテゴリー・ページ番号など)に変換する。
- クエリ変数の確定:変換結果から、トップページ・個別投稿・固定ページ・アーカイブ・検索結果といった「ページの種別」を判定する。
WP_Queryの実行:確定したクエリ変数をもとにデータベースへ問い合わせ、表示対象となる投稿群を取得する。この結果が「メインクエリ」となる。
この処理によって、is_single()・is_page()・is_home()・is_archive()などの条件分岐タグが正しい値を返すようになり、現在表示しているページの種別がテーマ側から判定できるようになります。
5. テンプレート選択(テンプレート階層)
メインクエリでページ種別が確定すると、template-loader.phpが、その種別に最も適したテンプレートファイルをテーマから選びます。この選択ルールがテンプレート階層(Template Hierarchy)です。WordPressは、種別ごとに「専用の名前のテンプレート」から「汎用的なテンプレート」へと、優先順位の高い順に存在を確認し、最初に見つかったものを使用します。最終的にどのページ種別でも、フォールバック先としてindex.php(テーマ内のテンプレート)が用いられます。
代表的なページ種別と、探索されるテンプレートの例は次のとおりです(左ほど優先度が高く、なければ右へフォールバックします)。
| ページ種別 | 優先度の高いテンプレート例 | 最終フォールバック |
|---|---|---|
| 個別投稿 | single-{投稿タイプ}.php → single.php → singular.php | index.php |
| 固定ページ | page-{スラッグ}.php → page-{ID}.php → page.php | index.php |
| カテゴリーアーカイブ | category-{スラッグ}.php → category.php → archive.php | index.php |
| トップページ(投稿一覧) | home.php | index.php |
| 検索結果 | search.php | index.php |
| 404(未検出) | 404.php | index.php |
選ばれたテンプレートは多くの場合、get_header()でヘッダー(header.php)、get_sidebar()でサイドバー、get_footer()でフッター(footer.php)を読み込み、これらを組み合わせて1ページを構成します。なお、ブロックテーマ(フルサイト編集/FSE)の場合は、PHPテンプレートの代わりにHTML形式のブロックテンプレートが用いられるなど、テンプレートの解決方法が異なります。
6. The Loop(投稿の出力)
テンプレート内で投稿内容を出力する仕組みがThe Loop(ループ)です。メインクエリが取得した投稿を1件ずつ取り出し、タイトルや本文などを表示します。ループの基本形は次のようになります。
<?php if ( have_posts() ) : ?> |
have_posts():未処理の投稿が残っているかを判定する。the_post():次の投稿を「現在の投稿」としてセットし、the_title()などのテンプレートタグが現在の投稿を参照できるようにする。the_content():投稿本文を出力する。この内部でも後述のフィルターが適用される。
7. フック機構(アクションとフィルター)
WordPressの拡張性を支える中核がフックです。コアは処理の要所に「差し込み口」を用意しており、プラグインやテーマはそこへ自分の処理を登録します。フックには2種類あります。
- アクション(Action):特定のタイミングで「処理を実行する」ためのフック。
add_action()で関数を登録し、コア側のdo_action()で実行される。例:init・wp_head・wp_footerなど。 - フィルター(Filter):データを受け取り「加工して返す」ためのフック。
add_filter()で関数を登録し、コア側のapply_filters()で値が渡される。例:本文を加工するthe_content、タイトルを加工するthe_titleなど。
登録時に指定する優先度(priority)の数値が小さいほど先に実行され、同じ優先度なら登録順に実行されます。たとえばthe_contentフィルターには、コアやプラグインが段落の自動整形・ショートコード展開・埋め込み変換などを登録しており、これらが順に適用された結果が最終的な本文として出力されます。このフック機構があるため、コア本体を改変せずに表示内容や挙動を拡張できます。
8. HTML生成・送信
テンプレートとThe Loop、そして各フックでの加工をすべて経て、完成したHTMLが組み上がります。最終的にこのHTMLがHTTPレスポンスとしてブラウザへ送信され、ページが表示されます。ヘッダーのwp_head()(wp_headアクション)やフッターのwp_footer()(wp_footerアクション)の位置で、プラグインが必要なCSSやJavaScriptの読み込みタグを出力するのも、この一連の流れの一部です。
つまずきやすいポイント
| 注意点 | 内容と対処の考え方 |
|---|---|
| プラグイン競合 | 複数のプラグインが同じフックや出力に介入し、互いの処理を打ち消したり想定外の順序で動いたりすることがある。原因切り分けでは、プラグインを一時的に無効化して問題が再現するかを確認すると特定しやすい。 |
| フックの優先度 | 同じフックに複数の処理が登録されると、優先度の数値順に実行される。期待した結果にならない場合、他の処理に後から上書きされている可能性があるため、優先度の指定を見直す。 |
| メインクエリの改変 | 表示件数や対象を変えたい場合、テンプレート内で新たにクエリを作るよりも、pre_get_postsなどのフックでメインクエリ自体を調整するほうが、条件分岐やページネーションとの整合性を保ちやすい。 |
| キャッシュ | キャッシュ系プラグインやサーバー・CDNのキャッシュが有効な場合、ここまでの処理の結果が保存され、次回以降は処理を経ずに保存済みHTMLが返ることがある。変更が反映されないときは、各層のキャッシュをクリアして確認する。 |
よくある質問(FAQ)
Q. すべてのアクセスがindex.phpを通るなら、サイトごとにファイルを分けなくてよいのですか。
A. はい。WordPressは単一の入口ですべてのリクエストを受け、URLの解析結果に応じて表示するページを動的に切り替える設計です。どのページを表示するかは、URLをWP_Queryが解析して決定するため、URLごとに個別のPHPファイルを用意する必要はありません。
Q. 表示中のページに対応するテンプレートファイルがテーマに無い場合はどうなりますか。
A. テンプレート階層のルールに従い、より汎用的なテンプレートへ順にフォールバックします。専用テンプレートが見つからない場合でも、最終的にはテーマのindex.phpが使われるため、ページが表示できなくなることはありません。
Q. アクションフックとフィルターフックは、どう使い分ければよいですか。
A. 「特定のタイミングで何か処理を実行したい」場合はアクション、「渡されたデータを加工して返したい」場合はフィルターを使います。たとえばフッターにタグを追加するならアクション(wp_footer)、投稿本文の内容を書き換えるならフィルター(the_content)が適しています。
以上が、WordPressがリクエストを受け取ってからページを表示するまでの一連の処理の流れです。「初期化 → クエリ解析 → テンプレート選択 → 出力」という骨格と、各所に差し込まれるフックの役割を押さえておくと、テーマやプラグインの動作を理解し、不具合の原因を切り分ける際の手がかりになります。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?