2026年5月20日
2026年5月20日
WordPressのテンプレート階層とは?表示に使われるファイルの決まり方
WordPress は、開かれたページが投稿なのか、固定ページなのか、カテゴリーのアーカイブなのかを判断し、その種類に応じてテーマの中のテンプレートファイルを決まった順番で探します。この順番を「テンプレート階層(Template Hierarchy)」と呼びます。見つかった最初のファイルが使われ、どれも無ければ最後に index.php が使われます。
この順番を知っていると、「この固定ページだけデザインを変えたい」「カテゴリーごとに一覧の見た目を変えたい」といった変更を、ファイルを1つ足すだけで実現できます。この記事の一覧は、WordPress の公式ドキュメント(Theme Handbook の Template Hierarchy)に沿っています。
主なページの種類と探す順番
表の左から順に探し、最初に見つかったファイルが使われます。{slug} はスラッグ、{id} は ID、{post-type} は投稿タイプ名に置き換わります。
| ページの種類 | 探す順番 |
|---|---|
| 固定ページ | 割り当てたページテンプレート → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php |
| 投稿・カスタム投稿の個別ページ | (割り当てたテンプレート)→ single-{post-type}-{slug}.php → single-{post-type}.php → single.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 |
| カスタムタクソノミーのアーカイブ | taxonomy-{taxonomy}-{term}.php → taxonomy-{taxonomy}.php → taxonomy.php → archive.php → index.php |
| カスタム投稿タイプのアーカイブ | archive-{post_type}.php → archive.php → index.php |
| 投稿者のアーカイブ | author-{nicename}.php → author-{id}.php → author.php → archive.php → index.php |
| 日付のアーカイブ | date.php → archive.php → index.php |
| 検索結果 | search.php → index.php |
| 404 ページ | 404.php → index.php |
通常の投稿(投稿タイプ post)の場合、single-{post-type}.php は single-post.php になります。
トップページと投稿一覧ページ
トップページ(サイトのフロントページ)は、front-page.php があれば常にそれが使われます。無い場合は、「設定」→「表示設定」の「ホームページの表示」によって変わります。
- 「最新の投稿」を表示する場合:
home.php→index.php - 「固定ページ」を表示する場合: 固定ページと同じ順番(
page.phpなど)
「投稿ページ」に指定した固定ページ(ブログの一覧)には、home.php → index.php の順で使われます。page.php は使われません。
プライバシーポリシーページ
「設定」→「プライバシー」で指定したページには、固定ページの順番の前に privacy-policy.php が探されます。
日本語のスラッグの場合
スラッグに日本語などの ASCII 以外の文字が入っている場合、WordPress 4.7 以降は、そのままの文字のファイル名と、URL エンコードしたファイル名の両方を、この順番で探します。たとえばスラッグが「会社概要」の固定ページでは、page-会社概要.php、page-%e4%bc%9a%e7%a4%be%e6%a6%82%e8%a6%81.php、page-{id}.php の順です。サーバーによっては日本語のファイル名の扱いが面倒になるため、スラッグを英数字にするか、ID 別のテンプレートを使うほうが扱いやすくなります。
使われているテンプレートを確かめる
Query Monitor プラグインで確かめる
プラグイン「Query Monitor」を入れると、ログイン中に管理バーから、今のページで使われているテンプレートファイルと、WordPress が探した候補の一覧(テンプレート階層)を確認できます。
自分で表示する
開発中だけ、ページの右下にテンプレートのファイル名を出すこともできます。WordPress は使うテンプレートのパスをグローバル変数 $template に入れています。子テーマの functions.php に次を追加します。確認が終わったら削除します。
<?php
// 管理者がログインしているときだけ、使われているテンプレート名を右下に表示する
add_action( 'wp_footer', function () {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
global $template;
printf(
'<div style="position:fixed;bottom:0;right:0;z-index:9999;padding:6px 10px;background:#1d2327;color:#fff;font-size:12px;">%s</div>',
esc_html( basename( $template ) )
);
} );
スラッグ別・ID 別のテンプレートを作る
特定の固定ページだけ見た目を変えたいときは、そのページのスラッグか ID を名前に入れたファイルをテーマに置きます。
- スラッグが
aboutの固定ページ:page-about.php - ID が 42 の固定ページ:
page-42.php - 投稿タイプ
newsのスラッグfirst-newsの投稿:single-news-first-news.php
page-about.php の例です。元にする page.php をコピーして書き換えると、ヘッダーやフッターの呼び出しをそろえやすくなります。
<?php
// page-about.php: スラッグが about の固定ページ用
get_header();
?>
<main id="main" class="site-main page-about">
<?php while ( have_posts() ) : the_post(); ?>
<section class="about-hero">
<h1><?php the_title(); ?></h1>
</section>
<section class="about-content">
<?php the_content(); ?>
</section>
<?php endwhile; ?>
</main>
<?php
get_footer();
スラッグは後から変えられるため、スラッグを変えると page-{slug}.php が使われなくなります。ID は変わりませんが、別の環境(本番とテスト環境など)では ID が違うことがあります。
カスタムページテンプレートを作る
編集画面でページごとに選べるテンプレートを作るには、ファイルの冒頭のコメントに Template Name: を書きます。ファイル名は自由ですが、page- で始めると前の節の「スラッグ別のテンプレート」と見分けにくくなるため、別の名前にします。
<?php
/**
* Template Name: フルワイド
* Template Post Type: page, post
*/
get_header();
?>
<main id="main" class="site-main full-width-layout">
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<h1 class="entry-title"><?php the_title(); ?></h1>
</header>
<div class="entry-content">
<?php the_content(); ?>
</div>
</article>
<?php endwhile; ?>
</main>
<?php
get_footer();
Template Name:に書いた名前が、編集画面の「テンプレート」の選択肢に表示されます。Template Post Type:を書くと、固定ページ以外(この例では投稿)でも選べるようになります(WordPress 4.7 以降)。書かない場合は固定ページだけで選べます。- WordPress はファイルの先頭 8KB の中からこの見出しを読み取ります。ファイルの冒頭のコメントに書いておけば問題ありません。
- 置き場所はテーマのフォルダー直下か、1 階層下のフォルダー(例:
page-templates/full-width.php)です。それより深い場所に置いたファイルは選択肢に出ません。 - 親テーマを更新しても消えないよう、自作のテンプレートは子テーマに置きます。
条件に応じて PHP でテンプレートを切り替える
ファイル名の決まりでは表せない条件(カテゴリーやログイン状態など)でテンプレートを変えたいときは、template_include フィルターを使います。WordPress が選んだテンプレートのパスを受け取り、別のパスを返すとそちらが使われます。
<?php
// カテゴリー「premium」の投稿には single-premium.php を使う
add_filter( 'template_include', function ( $template ) {
if ( is_singular( 'post' ) && has_category( 'premium' ) ) {
$premium = locate_template( 'single-premium.php' );
if ( $premium ) {
return $premium;
}
}
return $template;
} );
locate_template() は、子テーマ、親テーマの順にファイルを探し、見つかればフルパスを、見つからなければ空の文字列を返します。ファイルが無いときに元の $template を返すようにしておくと、ファイルを消しても真っ白なページになりません。
ブロックテーマの場合
Twenty Twenty-Five のようなブロックテーマでも、探す順番は同じです。違うのは、テンプレートが PHP ではなく templates フォルダーの HTML ファイル(page.html、single.html、page-about.html など)である点です。
- 「外観」→「エディター」(サイトエディター)でテンプレートを編集すると、変更はデータベースに保存され、テーマの HTML ファイルより優先されます。ファイルを書き換えても表示が変わらないときは、サイトエディターでそのテンプレートの変更をリセットしていないか確認します。
- 編集画面で選べるテンプレートは、
theme.jsonのcustomTemplatesに登録します。
まとめ
- WordPress はページの種類ごとに決まった順番でテンプレートを探し、最初に見つかったものを使う。最後は
index.php - 使われているテンプレートは Query Monitor か、
$templateを表示して確かめる - 特定のページだけ変えるなら
page-{slug}.phpやpage-{id}.php、編集画面で選ばせるならTemplate Name:を書いたカスタムページテンプレートを使う - ファイル名で表せない条件は
template_includeフィルターとlocate_template()で切り替える - ブロックテーマでも順番は同じで、テンプレートは
templatesフォルダーの HTML ファイルになる