WordPressでWebサイトを構築する際、投稿記事とは異なる役割を持つのが「固定ページ」です。
会社概要、お問い合わせ、プライバシーポリシーなど、独立したコンテンツを管理するために不可欠な機能ですが、その表示を制御しているのがpage.phpというテンプレートファイルです。
本記事では、WordPressテーマ開発におけるpage.phpの基本的な作り方から、テンプレート階層の優先順位、さらには特定のページ専用のカスタムテンプレートを作成する方法について詳しく説明します。
2026年現在のモダンな開発手法を意識しつつ、PHPベースのテンプレート管理をマスターしましょう。
WordPressにおける固定ページテンプレートの役割
固定ページは、ブログ投稿のように時系列で並ぶものではなく、サイト構造において恒久的な場所を占めるコンテンツに使用されます。
これらを表示するための共通の雛形となるのがpage.phpです。
テーマ内にpage.phpが存在しない場合、WordPressはsingular.phpやindex.phpを代替として使用しますが、デザインの柔軟性を確保するためには専用のテンプレートを用意することが一般的です。
固定ページは投稿ページと異なり、カテゴリーやタグを持たない代わりに、親子関係による階層構造を持つという特徴があります。
この構造を理解することが、効率的なサイト設計の第一歩となります。
理解しておくべきテンプレート階層の仕組み
WordPressには、どのテンプレートファイルを使用してページを表示するかを決定する「テンプレート階層」という厳格なルールがあります。
固定ページが表示される際の優先順位は以下の通りです。
| 優先順位 | ファイル名 | 説明 |
|---|---|---|
| 1 | カスタムテンプレートファイル | 管理画面で選択した任意のファイル(例:template-contact.php) |
| 2 | page-{slug}.php | 固定ページのスラッグ名が含まれるファイル |
| 3 | page-{id}.php | 固定ページのIDが含まれるファイル |
| 4 | page.php | 全ての固定ページに適用される標準ファイル |
| 5 | singular.php | 固定ページと投稿ページの両方に適用されるファイル |
| 6 | index.php | 上記のいずれも見つからない場合の最終的なフォールバック |
例えば、スラッグがcompanyである固定ページを表示する場合、WordPressはまずpage-company.phpを探します。
もし存在しなければpage.phpを使用します。
このように、特定のページだけデザインを変えたい場合は、スラッグやIDを用いたファイル作成が有効です。
基本的なpage.phpの構成コード
もっとも標準的なpage.phpの構成を確認しましょう。
WordPressの基本である「ループ」処理を用いて、管理画面で入力したタイトルと本文を動的に出力します。
<?php
/**
* The template for displaying all pages
*
* @package WordPress
* @subpackage Your_Theme_Name
*/
get_header(); // header.phpを読み込む
?>
<main id="primary" class="site-main">
<?php
// WordPress ループの開始
while ( have_posts() ) :
the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); // ページのタイトルを出力 ?>
</header>
<div class="entry-content">
<?php
the_content(); // ページの本文を出力
// ページ分割がある場合のリンク表示
wp_link_pages(
array(
'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'your-theme' ),
'after' => '</div>',
)
);
?>
</div>
</article>
<?php
// コメント欄が表示設定になっている場合に読み込む
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
endwhile; // ループの終了
?>
</main>
<?php
get_sidebar(); // sidebar.phpを読み込む
get_footer(); // footer.phpを読み込む
コードの重要ポイント
- get_header() / get_footer(): サイト共通のヘッダーとフッターを呼び出します。
- have_posts() / the_post(): 現在表示している固定ページのデータをセットアップします。
- the_title(): 管理画面で設定したタイトルをHTMLタグ付きで出力します。
- the_content(): ブロックエディタなどで作成したメインコンテンツを表示します。2026年現在のブロックテーマやハイブリッドテーマでも、この関数がコンテンツ出力の中核を担います。
特定のページ専用のカスタムテンプレートを作成する
サイト制作では「お問い合わせページだけサイドバーを消したい」「ランディングページ専用のレイアウトにしたい」といった要望が頻繁に発生します。
これに対応するのがカスタムページテンプレートです。
カスタムテンプレートの作成手順
まず、テーマディレクトリ内に任意の名前のPHPファイルを作成します(例:page-fullwidth.php)。
ファイルの先頭に以下のコメントアウトを記述することが必須条件です。
<?php
/**
* Template Name: フルサイズテンプレート
* Description: サイドバーを表示しない全幅レイアウト用のテンプレートです。
*/
get_header();
?>
<div class="full-width-container">
<?php
while ( have_posts() ) :
the_post();
the_content();
endwhile;
?>
</div>
<?php get_footer(); ?>
このコメントを記述することで、WordPress管理画面の「固定ページ属性」セクションにある「テンプレート」ドロップダウンメニューから、「フルサイズテンプレート」を選択できるようになります。
サブディレクトリでの管理
テンプレートファイルが増えてくると、テーマのルートディレクトリが煩雑になります。
その場合は、page-templatesといったフォルダを作成し、その中にファイルを移動してもWordPressは正しく認識してくれます。
条件分岐タグによるカスタマイズの効率化
新しいファイルを作るまでもない軽微な変更(特定のページだけ特定のバナーを表示するなど)には、条件分岐タグis_page()を活用します。
<?php if ( is_page( 'contact' ) ) : ?>
<p>お問い合わせはこちらのフォームからお気軽にご連絡ください。</p>
<?php elseif ( is_page( array( 'about', 'history' ) ) ) : ?>
<p>私たちの会社について紹介します。</p>
<?php endif; ?>
is_page()関数には、ID、スラッグ、またはタイトルを指定できます。
また、配列(array)を渡すことで、複数のページのいずれかに合致する場合という条件指定も可能です。
テンプレートファイルを増やしすぎると管理コストが上がるため、共通化できる部分は条件分岐で処理するのがプロのテクニックです。
固定ページの親子関係を活用したテンプレート設計
固定ページには「親ページ」を設定する機能があります。
例えば「サービス紹介(親)」の下に「Web制作(子)」「アプリ開発(子)」といった構造を持たせることが可能です。
特定の親ページを持つ子ページだけに共通のデザインを適用したい場合、単純なテンプレート階層だけでは対応できません。
その場合は、以下のようなロジックをpage.php内に記述します。
<?php
// 親ページのIDを取得
$parent_id = $post->post_parent;
if ( $parent_id === 10 ) { // 親ページのIDが10の場合
get_template_part( 'template-parts/content', 'service' );
} else {
get_template_part( 'template-parts/content', 'default' );
}
?>
get_template_part()を活用することで、page.php自体のコードをスリムに保ちながら、パーツごとにメンテナンス性を高めることができます。
セキュリティとパフォーマンスへの配慮
2026年のWordPress開発において、セキュリティ対策は欠かせません。
テンプレート内で動的な値を出力する際は、常に適切なエスケープ処理を行いましょう。
安全な出力の例
esc_html(): HTML要素として出力する場合に使用。esc_attr(): HTML属性(classやidなど)として出力する場合に使用。esc_url(): URLを出力する場合に使用。
<h1 class="<?php echo esc_attr( get_post_meta( get_the_ID(), 'custom_class', true ) ); ?>">
<?php echo esc_html( get_the_title() ); ?>
</h1>
また、固定ページでカスタムフィールドを多用する場合、データベースへのクエリ回数が増え、パフォーマンスが低下する恐れがあります。
get_post_meta()で取得したデータは変数に格納して再利用するなど、効率的なコーディングを心がけてください。
現代のWordPress(2026年)におけるpage.phpの立ち位置
近年、WordPressはフルサイト編集(FSE)へと大きくシフトしました。
ブロックテーマではpage.htmlというHTMLベースのテンプレートが主流となっていますが、それでもなおPHPベースのpage.phpが必要とされる場面は多く存在します。
特に、複雑な動的処理を伴うコーポレートサイトや、既存のPHP資産を活用したハイブリッドテーマの開発においては、page.phpによる制御が最も柔軟で確実な手法です。
ブロックエディタの利便性と、PHPテンプレートの制御力をバランスよく組み合わせることが、現代のエンジニアに求められるスキルといえるでしょう。
まとめ
WordPressの固定ページテンプレートpage.phpは、サイトの静的コンテンツを支える重要なコンポーネントです。
テンプレート階層の優先順位を正しく理解し、スラッグごとのファイル作成やカスタムテンプレート、条件分岐タグを使い分けることで、あらゆるデザイン要求に応えることが可能になります。
制作の際は、単に表示させるだけでなく、メンテナンス性やセキュリティにも配慮したコードを書くように意識しましょう。
今回解説した基本構造と応用テクニックを駆使して、ユーザーにとって使いやすく、開発者にとって管理しやすいWordPressサイトを実現してください。
