PHPのテンプレートとは
PHPのテンプレートとは、HTMLの構造をもとに、PHPで用意したデータを差し込んでWebページを生成するためのファイルや仕組みのことです。
通常のHTMLファイルは、あらかじめ書かれた内容をそのまま表示します。
一方、PHPテンプレートでは、HTMLの中にPHPコードを埋め込むことで、ページごとに表示内容を変えられます。
たとえば、ブログの記事ページであれば、記事タイトル、本文、投稿日、カテゴリー、アイキャッチ画像などをデータベースから取得し、それらをHTMLの決まった場所に表示します。
このように、固定されたデザインの中に変化するデータを差し込む役割を持つのがPHPテンプレートです。
PHPテンプレートの基本的な役割
PHPテンプレートの主な役割は、データをHTMLとして表示することです。
Webページを作るときには、大きく分けて「データを用意する処理」と「データを表示する処理」があります。PHPテンプレートは、主に後者の表示部分を担当します。
たとえば、以下のようなコードがPHPテンプレートの基本形です。
<h1><?= h($title) ?></h1>
<p><?= h($description) ?></p>
この例では、$title や $description に入っている値が、HTMLの見出しや本文として表示されます。
つまりPHPテンプレートは、同じHTML構造を使いながら、表示する内容だけを動的に変えるための仕組みです。
PHPテンプレートが使われる場面
PHPテンプレートは、さまざまなWebサイトやWebアプリケーションで使われます。
代表的な例としては、ブログの記事一覧ページ、記事詳細ページ、ECサイトの商品ページ、会員マイページ、お問い合わせフォームの確認画面、管理画面、メール本文のテンプレートなどがあります。
また、WordPressのテーマファイルもPHPテンプレートの一種です。WordPressテーマ内にある index.php、single.php、page.php、archive.php、header.php、footer.php などは、ページを表示するためのテンプレートファイルとして機能します。
PHPテンプレートの基本構文
PHPテンプレートでは、HTMLの中にPHPの構文を組み込んで使います。
特によく使うのは、変数の出力、条件分岐、繰り返し処理、ファイルの読み込みです。
変数を出力する
PHPで変数の値をHTMLに表示する場合は、echo を使います。
<?php echo $title; ?>
テンプレート内では、短縮形として以下のように書くこともできます。
<?= $title ?>
これは、以下と同じ意味です。
<?php echo $title; ?>
ただし、実務では変数をそのまま出力するのではなく、基本的にエスケープ処理を行います。
<h1><?= h($title) ?></h1>
エスケープ処理を行うことで、HTMLとして解釈される文字を安全な形に変換できます。
条件分岐を使う
PHPテンプレートでは、条件によって表示内容を変えることがあります。
たとえば、ログインしているユーザーと、ログインしていないユーザーで表示する内容を変える場合は、以下のように書きます。
<?php if ($isLoggedIn): ?>
<p>ログイン中です。</p>
<a href="/mypage">マイページへ</a>
<?php else: ?>
<p>ログインしていません。</p>
<a href="/login">ログインする</a>
<?php endif; ?>
テンプレート内では、if (...) { } のような波括弧を使う書き方よりも、if: endif; のような代替構文が使われることがあります。
HTMLとPHPが混在する場合、この書き方の方が構造を把握しやすくなります。
繰り返し処理を使う
記事一覧や商品一覧など、複数のデータを表示する場合は、foreach を使います。
<ul>
<?php foreach ($posts as $post): ?>
<li>
<a href="<?= h($post['url']) ?>">
<?= h($post['title']) ?>
</a>
</li>
<?php endforeach; ?>
</ul>
この例では、$posts という配列に入っている記事データを1件ずつ取り出し、リストとして表示しています。
ブログの記事一覧、ニュース一覧、商品一覧、施工事例一覧など、同じデザインで複数のデータを並べたい場面でよく使われる書き方です。
PHPテンプレートで重要なエスケープ処理
PHPテンプレートで特に重要なのが、エスケープ処理です。
エスケープ処理とは、HTMLとして特別な意味を持つ文字を安全な形に変換する処理のことです。
ユーザーが入力した内容や外部データをそのままHTMLに出力すると、悪意のあるコードが実行される危険があります。
このような攻撃は、XSSと呼ばれます。
htmlspecialcharsを使う
PHPでHTMLに文字列を出力する場合は、htmlspecialchars() を使うのが基本です。
<p><?= htmlspecialchars($comment, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></p>
毎回このように書くと長くなるため、実務ではエスケープ用の関数を用意しておくことがあります。
<?php
function h($str) {
return htmlspecialchars((string) $str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
この関数を用意しておけば、テンプレート内では以下のように簡潔に書けます。
<p><?= h($comment) ?></p>
出力場所によって処理を使い分ける
エスケープ処理は、すべて同じ方法で対応すればよいわけではありません。
どこに出力するかによって、適切な処理が変わります。
HTML本文に出力する場合は、htmlspecialchars() が基本です。
<p><?= h($text) ?></p>
HTML属性に出力する場合も、属性値が壊れないようにエスケープします。
<img src="<?= h($imageUrl) ?>" alt="<?= h($imageAlt) ?>">
ただし、URLの場合はHTMLエスケープだけでは不十分なことがあります。
たとえば、javascript: のような危険な値が入っている場合、HTMLエスケープをしてもURLとして安全とは限りません。
そのため、URLを出力する場合は、http、https、相対パスなど、許可する形式かどうかを事前に確認することが大切です。
エスケープしない出力には注意する
HTMLを含むデータをそのまま表示したい場合、エスケープしない出力を使うことがあります。
しかし、ユーザーが入力した内容や信頼できない外部データをエスケープせずに出力するのは危険です。
たとえば、以下のような書き方は注意が必要です。
<div><?= $html ?></div>
$html の中身が完全に信頼できる場合は別ですが、外部から入ってきた値であれば、XSSの原因になる可能性があります。
PHPテンプレートでは、「表示する値は基本的にエスケープする」という意識が重要です。
PHPテンプレートを分割する方法
Webサイトでは、ヘッダー、フッター、ナビゲーション、サイドバーなど、複数のページで共通して使う部分があります。
これらを各ページに直接書いてしまうと、修正が必要になったときにすべてのファイルを変更しなければなりません。
そこで、PHPでは include や require を使って、共通パーツを別ファイルとして読み込むことができます。
header.phpやfooter.phpを読み込む
たとえば、以下のようにファイルを分けます。
index.php
header.php
footer.php
sidebar.php
index.php では、以下のように読み込みます。
<?php require __DIR__ . '/header.php'; ?>
<main>
<h1><?= h($title) ?></h1>
<p><?= h($content) ?></p>
</main>
<?php require __DIR__ . '/footer.php'; ?>
このようにすれば、ヘッダーやフッターを複数ページで共通化できます。
たとえば、ナビゲーションメニューを変更したい場合でも、header.php を修正するだけで済みます。
includeとrequireの違い
include と require は、どちらも外部ファイルを読み込むための構文です。
大きな違いは、読み込みに失敗したときの動作です。
include は、ファイルの読み込みに失敗しても警告を出して処理を続行します。
一方、require は、読み込みに失敗すると処理を継続できないエラーになります。
そのため、ページ表示に必須のファイルには require を使うことが多いです。
<?php require __DIR__ . '/header.php'; ?>
同じファイルを重複して読み込みたくない場合は、require_once や include_once を使います。
<?php require_once __DIR__ . '/functions.php'; ?>
設定ファイルや共通関数ファイルなど、1回だけ読み込めばよいものには require_once がよく使われます。
PHPテンプレートのディレクトリ構成例
PHPテンプレートを使う場合は、ファイルの役割ごとにディレクトリを分けると管理しやすくなります。
小規模なサイトであれば、以下のような構成が考えられます。
project/
├── public/
│ └── index.php
├── templates/
│ ├── layout.php
│ ├── header.php
│ ├── footer.php
│ └── home.php
├── includes/
│ └── functions.php
└── data/
└── posts.php
publicディレクトリ
public は、Web上に公開されるファイルを置く場所です。
たとえば、トップページとしてアクセスされる index.php を配置します。
CSS、JavaScript、画像などを置く場合もあります。
templatesディレクトリ
templates は、表示用のテンプレートファイルをまとめる場所です。
ヘッダー、フッター、レイアウト、記事一覧、記事詳細など、HTML表示に関係するファイルを置きます。
includesディレクトリ
includes は、共通関数や設定ファイルなどを置く場所です。
たとえば、エスケープ用の h() 関数や、日付を整形する関数、設定値などをまとめておくと便利です。
PHPテンプレートで避けたい書き方
PHPテンプレートは便利ですが、書き方を間違えると、保守しにくいコードや危険なコードになってしまいます。
特に注意したいのは、エスケープ不足、複雑な処理の書きすぎ、テンプレート内でのデータベース処理です。
エスケープせずに出力する
以下のように、ユーザー入力をそのまま出力する書き方は危険です。
<?= $_GET['name'] ?>
このような書き方をすると、悪意のあるHTMLやJavaScriptが実行される可能性があります。
安全に書くなら、以下のようにします。
<?= h($_GET['name'] ?? '') ?>
ユーザー入力や外部データは、信頼できないものとして扱うのが基本です。
テンプレート内に複雑な処理を書きすぎる
テンプレート内には、できるだけ表示に必要な処理だけを書くのが理想です。
たとえば、以下のような複雑な条件式をHTML内に直接書くと、読みづらくなります。
<?php if ($user['rank'] === 'gold' && $user['points'] > 1000 && $campaign['active'] && !$user['used_coupon']): ?>
このような場合は、事前に分かりやすい変数にまとめるとよいです。
<?php if ($canShowCoupon): ?>
テンプレートでは、「何を表示するか」が分かりやすい状態にしておくことが大切です。
テンプレート内でSQLを書きすぎる
小さな練習用のコードであれば、テンプレート内にデータ取得処理を書くこともあります。
しかし、実務ではテンプレート内にデータベース接続やSQLを直接書きすぎない方がよいです。
<?php
$db = new PDO(...);
$stmt = $db->query('SELECT * FROM posts');
$posts = $stmt->fetchAll();
?>
このような処理は、別ファイルやコントローラー側で行い、テンプレートには表示に必要なデータだけを渡す方が管理しやすくなります。
PHPテンプレートとWordPressテンプレート
PHPテンプレートという言葉は、WordPressのテーマファイルを指して使われることもあります。
WordPressテーマはPHPで作られており、ページの種類ごとに読み込まれるテンプレートファイルが変わります。
WordPressで使われる主なテンプレートファイル
WordPressでは、以下のようなテンプレートファイルが使われます。
index.php
front-page.php
home.php
single.php
page.php
archive.php
category.php
search.php
404.php
header.php
footer.php
sidebar.php
functions.php
index.php は、最終的なフォールバックとして使われる重要なテンプレートです。
single.php は投稿詳細ページ、page.php は固定ページ、archive.php は一覧ページ、search.php は検索結果ページ、404.php は404ページで使われます。
WordPressのテンプレート階層
WordPressには、テンプレート階層という仕組みがあります。
これは、表示するページの種類に応じて、WordPressがどのテンプレートファイルを読み込むかを決めるルールです。
たとえば、投稿詳細ページでは、投稿タイプ専用のテンプレートがあればそれを優先し、なければ single.php、さらにそれもなければ index.php にフォールバックします。
主な例は以下の通りです。
| 表示するページ | 主に使われるテンプレート |
|---|---|
| サイトのフロントページ | front-page.php / home.php または page.php / index.php |
| 投稿一覧ページ | home.php / index.php |
| 固定ページ | page-{slug}.php / page-{id}.php / page.php / index.php |
| 投稿詳細ページ | single-{post_type}.php / single.php / singular.php / index.php |
| カテゴリー一覧 | category-{slug}.php / category-{id}.php / category.php / archive.php / index.php |
| 検索結果ページ | search.php / index.php |
| 404ページ | 404.php / index.php |
WordPressテーマをカスタマイズする場合、このテンプレート階層を理解しておくと、どのファイルを編集すればよいか判断しやすくなります。
WordPressテンプレートの基本例
WordPressの投稿詳細ページで使う single.php は、以下のような構成になります。
<?php get_header(); ?>
<main>
<?php if (have_posts()): ?>
<?php while (have_posts()): the_post(); ?>
<article>
<h1><?php the_title(); ?></h1>
<div>
<?php the_content(); ?>
</div>
</article>
<?php endwhile; ?>
<?php endif; ?>
</main>
<?php get_footer(); ?>
WordPressでは、通常のPHP構文に加えて、WordPress専用のテンプレートタグを使います。
代表的なものには、以下があります。
get_header()
get_footer()
have_posts()
the_post()
the_title()
the_content()
the_permalink()
これらの関数を使うことで、投稿データやページ情報を簡単に表示できます。
WordPressでは専用のエスケープ関数を使う
PHP一般では htmlspecialchars() を使いますが、WordPressでは専用のエスケープ関数を使うのが基本です。
代表的な関数は以下の通りです。
esc_html()
esc_attr()
esc_url()
wp_kses_post()
通常のテキストを出力する場合は、esc_html() を使います。
<h1><?php echo esc_html(get_the_title()); ?></h1>
HTML属性に出力する場合は、esc_attr() を使います。
<img src="<?php echo esc_url($image_url); ?>" alt="<?php echo esc_attr($image_alt); ?>">
URLを出力する場合は、esc_url() を使います。
<a href="<?php echo esc_url($url); ?>">詳しく見る</a>
本文のように、一部のHTMLタグを許可したい場合は、wp_kses_post() を使うことがあります。
<div class="content">
<?php echo wp_kses_post($content); ?>
</div>
WordPressでは、出力する場所に応じて適切なエスケープ関数を使い分けることが大切です。
PHPテンプレートとテンプレートエンジン
PHPでは、PHPファイルそのものをテンプレートとして使う方法のほかに、テンプレートエンジンを使う方法もあります。
テンプレートエンジンとは、HTMLとプログラムの記述をより分かりやすく分離するための仕組みです。
代表的なものには、Blade、Twig、Smartyなどがあります。
Blade
Bladeは、Laravelで使われるテンプレートエンジンです。
通常のPHPよりも簡潔に書けるのが特徴です。
<h1>{{ $title }}</h1>
@if ($isLoggedIn)
<p>ログイン中です。</p>
@endif
Bladeの {{ $value }} は、エスケープ付きの出力です。そのため、ユーザー入力を表示する場合にもXSS対策をしやすくなっています。
一方、以下のような書き方はエスケープせずにHTMLを出力します。
{!! $html !!}
この書き方は、信頼できるHTMLを表示したい場合には便利ですが、ユーザー入力や外部データには使わないように注意が必要です。
Twig
Twigは、Symfonyなどで使われるテンプレートエンジンです。
<h1>{{ title }}</h1>
{% if isLoggedIn %}
<p>ログイン中です。</p>
{% endif %}
Twigでは、PHPコードを直接テンプレート内に書くのではなく、テンプレート専用の記法で表示を制御します。
通常は自動エスケープが有効になっており、HTML出力時の安全性を高めやすい仕組みになっています。
ただし、設定によって挙動が変わる場合もあるため、プロジェクトの設定を確認することが大切です。
Smarty
Smartyは、以前から使われているPHP向けのテンプレートエンジンです。
<h1>{$title}</h1>
既存システムでは現在も使われていることがあります。
一方、新規開発ではLaravelのBladeやSymfonyのTwigなど、フレームワーク標準のテンプレートエンジンが選ばれることも多くなっています。
PHPテンプレートを使うメリット
PHPテンプレートを使うと、HTMLだけでは実現しにくい動的なWebページを作れるようになります。
表示内容を動的に変えられる
PHPテンプレートでは、データベースの内容、フォーム入力、ログイン状態、ユーザー情報、日付、カテゴリーなどに応じて表示内容を変えられます。
たとえば、会員名を表示したり、商品情報を一覧表示したり、在庫状況に応じてボタンの表示を変えたりできます。
静的なHTMLではページごとに手作業で内容を変える必要がありますが、PHPテンプレートを使えば、データを差し替えるだけでページを生成できます。
共通パーツを管理しやすい
ヘッダー、フッター、ナビゲーション、サイドバー、CTA、パンくずリストなどを共通パーツとして分割できます。
これにより、同じHTMLを何度も書く必要がなくなります。
たとえば、サイト全体のナビゲーションを変更したい場合でも、共通のヘッダーファイルを修正するだけで済みます。
WordPress制作で役立つ
WordPressのテーマはPHPテンプレートで構成されています。
そのため、WordPressサイトのカスタマイズ、オリジナルテーマ制作、投稿タイプごとの表示変更、一覧ページのレイアウト調整などを行う場合、PHPテンプレートの理解は非常に重要です。
PHPテンプレートで構造化データを出力する場合
PHPテンプレートでは、JSON-LD形式の構造化データを出力することもあります。
構造化データは、検索エンジンにページ内容を伝えるための補助的な情報です。
記事ページ、商品ページ、FAQページ、レビュー、パンくずリストなどで使われることがあります。
json_encodeを使って出力する
JSON-LDを出力する場合は、HTML用の htmlspecialchars() ではなく、json_encode() を使うのが基本です。
<script type="application/ld+json">
<?= json_encode(
$structuredData,
JSON_UNESCAPED_UNICODE
| JSON_UNESCAPED_SLASHES
| JSON_HEX_TAG
| JSON_HEX_AMP
| JSON_HEX_APOS
| JSON_HEX_QUOT
) ?>
</script>
JSON_UNESCAPED_UNICODE を使うと、日本語が読みやすい形で出力されます。
JSON_UNESCAPED_SLASHES を使うと、URL内のスラッシュが過度にエスケープされるのを防げます。
さらに、JSON_HEX_TAG などのオプションを加えることで、<script> 内で問題になりやすい文字を安全な形に変換できます。
HTML出力とは考え方が違う
構造化データはJSONとして出力するため、通常のHTML本文とはエスケープの考え方が異なります。
HTML本文では htmlspecialchars() が基本ですが、JSON-LDでは json_encode() を使って、JSONとして正しい形で出力する必要があります。
このように、PHPテンプレートでは「どこに出力するか」によって、使う関数を変えることが重要です。
PHPテンプレートとCSS・JavaScriptの関係
PHPテンプレートは、最終的にHTMLを生成します。
CSSはそのHTMLの見た目を整え、JavaScriptはブラウザ上で動きを加える役割を持ちます。
PHPはサーバー側で動く
PHPは、サーバー側で実行されます。
ユーザーがページにアクセスすると、サーバー上でPHPが処理され、最終的にHTMLがブラウザへ送られます。
ブラウザに届く時点では、PHPコードそのものは見えません。
JavaScriptはブラウザ側で動く
JavaScriptは、主にブラウザ側で動作します。
PHPテンプレートで生成されたHTMLに対して、ボタンのクリック処理、メニューの開閉、フォームのバリデーション、非同期通信などを行います。
たとえば、PHPテンプレートで以下のようなHTMLを出力できます。
<button data-id="<?= h($post['id']) ?>">
詳細を見る
</button>
その後、JavaScript側で data-id の値を読み取り、必要な処理を実行できます。
PHPテンプレートを学ぶ順番
PHPテンプレートを学ぶ場合は、いきなり複雑なフレームワークに進むよりも、まずはPHPとHTMLの基本的な組み合わせ方を理解することが大切です。
HTMLとCSSの基本を理解する
PHPテンプレートは、最終的にHTMLを出力する仕組みです。
そのため、まずはHTMLの構造やCSSの基本を理解しておく必要があります。
見出し、段落、リンク、画像、リスト、フォームなどの基本的なHTMLを理解しておくと、PHPテンプレートの学習も進めやすくなります。
PHPの基本構文を覚える
PHPテンプレートで最低限必要になるのは、以下のような構文です。
変数
配列
if文
foreach文
関数
include / require
htmlspecialchars
特に、配列と foreach はよく使います。
記事一覧や商品一覧など、複数のデータを表示する場面で必須になるからです。
HTMLにPHPを埋め込む練習をする
最初は、PHPで用意した変数をHTMLに表示するところから始めるとよいです。
<?php
$title = 'PHPテンプレートの基本';
?>
<h1><?= h($title) ?></h1>
このように、PHPで用意した値をHTMLに差し込む感覚を身につけることが大切です。
配列データを一覧表示する
次に、複数のデータを foreach で表示する練習をします。
<?php foreach ($items as $item): ?>
<p><?= h($item['name']) ?></p>
<?php endforeach; ?>
これが理解できると、記事一覧、商品一覧、施工事例一覧、スタッフ紹介など、さまざまなページに応用できます。
テンプレートを分割する
PHPに慣れてきたら、ヘッダーやフッターを別ファイルに分ける練習をします。
<?php require __DIR__ . '/header.php'; ?>
<?php require __DIR__ . '/footer.php'; ?>
共通パーツを分けることで、Webサイトの保守性が高くなります。
WordPressやLaravelに進む
PHPテンプレートの基本が分かってきたら、WordPressテーマやLaravelのBladeに進むと、実務に近い形で学べます。
WordPressではテンプレート階層、テンプレートタグ、専用のエスケープ関数を理解することが重要です。
Laravelでは、Bladeテンプレート、ルーティング、コントローラー、ビューの関係を学ぶとよいでしょう。
PHPテンプレートのポイントまとめ
PHPテンプレートとは、HTMLの構造にPHPで用意したデータを差し込み、動的なWebページを生成するための仕組みです。
記事一覧、商品ページ、会員ページ、フォーム画面、WordPressテーマなど、さまざまな場面で使われます。
PHPテンプレートでは、変数の出力、条件分岐、繰り返し処理、ファイルの読み込みがよく使われます。
また、実務ではエスケープ処理が非常に重要です。
ユーザー入力や外部データをそのまま出力するとXSSの危険があるため、HTML本文や属性値には htmlspecialchars() を使い、URLやJSON-LDなどは出力場所に応じた適切な処理を行う必要があります。
WordPressの場合は、esc_html()、esc_attr()、esc_url()、wp_kses_post() などの専用関数を使い分けます。
PHPテンプレートを理解すると、静的なHTMLだけではなく、データに応じて内容が変わるWebサイトを作れるようになります。
特に、WordPressのカスタマイズ、オリジナルテーマ制作、ブログやメディアサイト制作、ECサイトの商品ページ制作では、PHPテンプレートの知識が大きく役立ちます。
以上、PHPのテンプレートについてでした。
最後までお読みいただき、ありがとうございました。










