WordPressテンプレート階層はスラッグ別ファイルの優先順位が重要

前回は、WordPressのオリジナルテーマで使う基本のテンプレートファイルとして、front-page.php、page.php、archive.php、single.phpなどを確認しました。今回はその続きとして、ファイル名によって、より具体的なテンプレートが優先して読み込まれる仕組みを解説します。
たとえば固定ページのスラッグがcontactの場合、テーマ内にpage-contact.phpを作ると、通常のpage.phpよりも先にそのファイルが読み込まれます。これは、HTMLでabout.htmlやcontact.htmlを分けて管理する感覚に近く、ページごとの役割を把握しやすくなります。
また固定ページでは、ファイルの先頭にTemplate Nameを書くことで、管理画面から選択できるテンプレートとして扱うこともできます。この記事では、ループの詳しい書き方ではなく、どのファイル名にすると、どのページで優先されるのかという考え方に絞って説明します。
目次
テンプレート階層は具体的なファイルを優先する
WordPressには、表示するページに応じてテンプレートファイルを探す順番があります。この順番のことをテンプレート階層といいます。
大切なのは、より具体的な条件に合うファイルがあれば、汎用的なファイルよりも先に読み込まれるという点です。
固定ページの優先順位
固定ページでは、スラッグやIDに対応したファイルがあるかを先に確認します。スラッグとは、URLの一部になる英数字の名前です。たとえば/contact/のcontactがスラッグです。
page-{slug}.php
↓
page-{id}.php
↓
page.php
↓
singular.php
↓
index.php上の順番を見ると、page.phpよりもpage-{slug}.phpが先にあることがわかります。つまり、固定ページのスラッグがcontactなら、page-contact.phpが優先されます。
この仕組みを使うと、すべての固定ページをpage.phpにまとめず、特定のページだけ専用ファイルに分けることができます。
page-contact.phpで固定ページを専用化する
page-contact.phpは、固定ページのスラッグがcontactのときに優先して読み込まれるテンプレートファイルです。お問い合わせページのように、通常の固定ページとは構造が違うページで使いやすい考え方です。
お問い合わせページを専用ファイルにする
次のコードは、page-contact.phpというファイルを作り、お問い合わせページ専用のHTML構造を管理する例です。フォーム部分はショートコードを使う想定にしています。
<?php
// page-contact.php
// 固定ページのスラッグが contact のときに優先して読み込まれる
get_header();
?>
<main class="contact-page">
<section class="contact-hero">
<h1>お問い合わせ</h1>
<p>制作のご相談やご質問はこちらからお問い合わせください。</p>
</section>
<section class="contact-form">
<?php echo do_shortcode('[contact-form-7 id="123" title="お問い合わせフォーム"]'); ?>
</section>
</main>
<?php get_footer(); ?>重要なのは、ファイル名がpage-contact.phpになっている点です。固定ページのスラッグがcontactであれば、WordPressはこのファイルを優先して読み込みます。
HTMLでcontact.htmlを作るような感覚で、WordPressでもお問い合わせページ専用のPHPファイルとして管理できます。
page-contact.phpではなくcontact.phpにすることで、
通常のHTMLファイルを作成する感覚に近い形で構築でき、
WordPressのテンプレート構造も理解しやすくなります。
Template Nameを使うと管理画面から選べる

固定ページでは、スラッグに合わせたpage-contact.phpだけでなく、ファイルの先頭にコメントを書いてテンプレートとして登録する方法もあります。
この方法を使うと、ファイル名をcontact.phpやtemplate-contact.phpのように自由にできます。管理画面の「テンプレート」から選択して使うイメージです。
Template Nameを書く例
次のコードは、固定ページテンプレートとして管理画面から選べるようにする例です。ファイル名はcontact.phpでも問題ありません。
<?php
/*
Template Name: お問い合わせページ
*/
get_header();
?>
<main class="contact-page">
<h1>お問い合わせ</h1>
<?php echo do_shortcode('[contact-form-7 id="123" title="お問い合わせフォーム"]'); ?>
</main>
<?php get_footer(); ?>一番上のコメントにあるTemplate Name: お問い合わせページが重要です。これを書くことで、WordPressの固定ページ編集画面からこのテンプレートを選べるようになります。
page-contact.phpとの違い
page-contact.phpは、スラッグがcontactの固定ページに自動で反応します。一方、Template Nameは、管理画面でそのテンプレートを選択して使います。
page-contact.php
スラッグ contact の固定ページに自動で反応する
contact.php + Template Name
管理画面でテンプレートを選択して使うURLやページ名とファイルを強く結びつけたい場合はpage-{slug}.php、管理画面から選んで使いたい場合はTemplate Nameと覚えるとわかりやすいです。
アーカイブとシングルもファイル名で分けられる
ファイル名で優先順位を変える考え方は、固定ページだけではありません。カスタム投稿タイプを使っている場合、一覧ページや詳細ページもファイル名で分けられます。
投稿タイプごとのテンプレート
たとえばカスタム投稿タイプのスラッグがnewsの場合、一覧ページはarchive-news.php、詳細ページはsingle-news.phpのように分けられます。
news の一覧ページ
archive-news.php
↓
archive.php
↓
index.php
news の詳細ページ
single-news.php
↓
single.php
↓
index.phpここでも考え方は同じです。archive.phpやsingle.phpよりも、投稿タイプ名が入った具体的なファイルが優先されます。
ループの書き方や記事の出力方法は別の記事で詳しく扱うとして、まずはarchive-{post_type}.phpとsingle-{post_type}.phpというファイル名の意味を押さえておきましょう。
ファイル名で分けると管理しやすい
テンプレートファイルを分ける目的は、単にページごとの見た目を変えることだけではありません。どのページをどのファイルが担当しているのかを明確にできることが大きなメリットです。
HTMLファイルのように役割で分ける
静的なHTMLサイトでは、会社概要ならabout.html、お問い合わせならcontact.htmlのようにファイルを分けます。WordPressでも、テンプレート階層を理解するとそれに近い感覚で管理できます。
about ページを専用化したい
page-about.php
contact ページを専用化したい
page-contact.php
管理画面から選べるテンプレートにしたい
Template Name を書いた contact.php
news の一覧を専用化したい
archive-news.php
news の詳細を専用化したい
single-news.phpすべてをpage.phpやsingle.phpに詰め込むと、後から条件分岐が増えて管理しづらくなります。最初から役割ごとにテンプレートを分けると、修正するファイルを見つけやすくなります。
今回の記事で一番伝えたいのは、WordPressはファイル名のルールに従って、より具体的なテンプレートを優先して読み込むという点です。この考え方がわかると、オリジナルテーマの構成がかなり整理しやすくなります。
まとめ
- WordPressは、汎用的なテンプレートよりも具体的なテンプレートを優先して読み込む
page-contact.phpのように書くと、スラッグがcontactの固定ページで優先されるTemplate Nameを書くと、固定ページ編集画面からテンプレートを選択できるarchive-news.phpやsingle-news.phpのように、投稿タイプごとにも分けられる- HTMLの
about.htmlやcontact.htmlのように、役割ごとにファイルを分けると管理しやすい




