結論
テンプレート階層は、WordPress が「今のページを表示するのに、テーマのどのファイルを使うか」を決める探索の順番です。ページの種類ごとに候補のファイルが決まっていて、上から順に探し、最初に見つかったファイルを使います。どれも無ければ、最後は必ず index.php が使われます。
だから、テーマは index.php 1枚から作り始められます。見た目を分けたいページの種類があれば、その種類用のファイルを1枚ずつ足します。ただし、ブロックテーマは .php ではなく .html のテンプレートを使います。Theme Handbook は、その場合も階層(探す順番)は同じだと説明しています。
原因・仕組み(主な探索の順番)
Theme Handbook の Template Hierarchy に載っている順番です(クラシックテーマ)。
| ページの種類 | 探す順番(左から) |
|---|---|
| 個別投稿 | single-{post-type}-{slug}.php → single-{post-type}.php → single.php → singular.php → index.php |
| 固定ページ | カスタムテンプレート → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php |
| カテゴリー | category-{slug}.php → category-{id}.php → category.php → archive.php → index.php |
| タグ | tag-{slug}.php → tag-{id}.php → tag.php → archive.php → index.php |
| カスタム投稿タイプの一覧 | archive-{post_type}.php → archive.php → index.php |
| フロントページ | front-page.php → home.php → page.php → index.php |
| 投稿一覧(ブログのホーム) | home.php → index.php |
| 検索結果 | search.php → index.php |
| 404(ページが無い) | 404.php → index.php |
{slug} はスラッグ(URL に使う英数字の名前)、{id} は ID 番号に置き換わります。たとえばスラッグが news のカテゴリーなら、category-news.php があればそれが最優先です。
「フロントページ」と「投稿一覧(ホーム)」は、設定 → 表示設定 でトップページに固定ページを選ぶかどうかで意味が変わります。判定の違いは is_front_page と is_home の違い|静的フロントページ設定での判定表 で詳しく扱っています。
手順(テンプレートを足していく順番)
style.cssとindex.phpだけでテーマを作り、全ページが表示されることを確認する。- 個別投稿と固定ページの見た目を分けたいなら、
single.phpとpage.phpを足す。共通にしたいならsingular.php1枚でよい。 - 一覧ページ(カテゴリー・タグ・日付など)をまとめて変えたいなら
archive.phpを足す。カテゴリーだけ変えたいならcategory.php。 - 404 ページと検索結果ページを用意する(
404.php、search.php)。 - 特定のページだけ特別な見た目にしたいときに、
page-{slug}.phpなどの細かいファイルを足す。
共通の部品(ヘッダー・フッター・記事カード)は、get_header() の使い方|説明・引数・注意点・get_footer() の使い方|説明・引数・注意点・get_template_part() の使い方|説明・引数・注意点 で分けて読み込みます。
動作確認(検証環境と結果)
WordPress 7.1.3(ja)、PHP 8.2.12 の CLI 検証環境で、テーマ guide-th を作って有効化し、個別投稿・固定ページ・カテゴリー・404 の各ページで、コアの get_single_template() などの関数が返すファイル名を、ファイルを足しながら確かめました。
| テーマにあるファイル | 個別投稿 | 固定ページ | カテゴリー | 404 |
|---|---|---|---|---|
A: index.php のみ |
index.php | index.php | index.php | index.php |
B: Aに singular.php を追加 |
singular.php | singular.php | index.php | index.php |
C: Bに single.php・archive.php を追加 |
single.php | singular.php | archive.php | index.php |
D: Cに category.php・page.php・404.php を追加 |
single.php | page.php | category.php | 404.php |
ファイルを足すたびに、表の順番どおりに、より具体的なファイルへ切り替わることが確認できました。確認後は元のテーマに戻し、テスト用のテーマと投稿を削除しています。
テンプレート階層の注意点
- ファイル名のつづり:
singel.phpのような書き間違いは、エラーにならず単に無視され、index.phpなどが使われます。表示が変わらないときは、まずファイル名を確認します。 - 子テーマ: 子テーマを使うと、子テーマにあるテンプレートが親テーマより優先されます(子テーマの作り方と functions.php|親テーマCSSの正しい読み込み)。
- ホームの名前の混乱: 固定ページ用のテンプレートを
home.phpと名付けると、投稿一覧で使われてしまいます。公式の表示設定の解説も、この名前を避けるよう注意しています。
テンプレート階層でよくあるミス
index.phpを作らずにsingle.phpだけ用意し、テーマとして認識されない。page.phpを作ったのに、front-page.phpがあるせいでトップページに反映されない。- カテゴリーのスラッグを日本語のままにしていて、
category-{slug}.phpのファイル名と一致しない。 - 似た内容のテンプレートを何枚も作り、修正のたびに全部を直す羽目になる。部品化で減らす。
テンプレート階層のチェックリスト
- [ ]
index.phpがある - [ ] 見た目を分けたいページの種類と、対応するファイル名を表で確認した
- [ ] ファイル名のつづりとスラッグを確認した
- [ ] 共通部分は部品ファイルに分けた
- [ ] 表示設定(トップページ)とフロントページ用ファイルの関係を確認した
テンプレート階層のFAQ(よくある質問)
Q. どのテンプレートが使われているか、画面で確かめる方法はありますか?
A. 開発中なら、テンプレートの先頭に一時的にファイル名を出力する、またはデバッグ用のプラグインを使う方法があります。本番では表示しないようにします。
Q. singular.php と single.php のどちらを作ればよいですか?
A. 個別投稿と固定ページを同じ見た目にするなら singular.php 1枚、分けるなら single.php と page.php を作ります。
Q. ブロックテーマでも同じ考え方ですか?
A. 探す順番は同じです。ファイルが templates/ フォルダの .html になる点が違います。
筆者の見解(テンプレート階層)
テンプレート階層は、表で見ると複雑ですが、「具体的な名前ほど優先、最後は index.php」という1つの規則に尽きると考えます。テーマ作りで迷子になる原因は、どのファイルが使われているかを把握しないまま作り込むことなので、ファイルを1枚足すたびに表示を確かめる進め方が確実です。最初から細かいファイルを並べず、必要になってから足すのが、保守しやすいテーマへの近道だと私は思います。
テンプレート階層の関連項目
- WordPressのループとは|have_posts と the_post の基本と注意点
- get_template_part() の使い方|説明・引数・注意点
- is_front_page と is_home の違い|静的フロントページ設定での判定表
- 子テーマの作り方と functions.php|親テーマCSSの正しい読み込み
- locate_template() の使い方|説明・引数・注意点

