WordPressでは、カスタム投稿タイプ(CPT)を使うことで、投稿とは異なる独自のコンテンツ構造を作成できます。
しかし、投稿タイプに応じてテンプレートを出し分けたい場合は、それに応じたファイル設計が必要です。
この記事では、カスタム投稿タイプごとにテンプレートを分ける方法を、基本から応用まで解説します。
基本:テンプレート階層のルールを理解する
WordPressにはテンプレート階層という仕組みがあり、カスタム投稿タイプの場合も次のような順番でテンプレートが読み込まれます。
例:投稿タイプが movie の場合
表示画面 | 優先されるテンプレートファイル |
---|---|
一覧ページ | archive-movie.php → archive.php → index.php |
詳細ページ | single-movie.php → single.php → singular.php → index.php |
これらのルールに従い、テンプレートファイルを命名するだけで自動的に適用されます。
カスタム投稿タイプの一覧ページにテンプレートを適用する
たとえば、bookという投稿タイプを登録している場合
// テーマディレクトリに以下のファイルを作成
archive-book.php
このファイルにHTMLやループを記述すれば、https://example.com/book/ にアクセスした際にこのテンプレートが読み込まれます。
詳細ページ用テンプレートの適用
個別の投稿ページ(シングルページ)には、single-投稿タイプ名.php を使います。
// 例:投稿タイプ「event」の詳細ページテンプレート
single-event.php
これにより、各イベントの詳細表示に専用のテンプレートが適用されます。
すべてのカスタム投稿タイプを1ファイルで処理したい場合
複数のカスタム投稿タイプを一括で処理したい場合は、singular.php や archive.php を使って共通テンプレートを作成する方法もあります。
ただし、投稿タイプの分岐処理が必要になるため、以下のように条件分岐を使います。
<?php
$post_type = get_post_type();
if ($post_type === 'book') {
// book用のレイアウト
} elseif ($post_type === 'event') {
// event用のレイアウト
} else {
// デフォルト
}
?>
functions.php でテンプレートを動的に指定する(上級者向け)
function my_custom_template_include($template) {
if (is_singular('movie')) {
return get_template_directory() . '/single-movie.php';
}
return $template;
}
add_filter('template_include', 'my_custom_template_include');
この方法は、テンプレートファイルの柔軟な切り替えに便利です。
まとめ
カスタム投稿タイプを導入するだけでなく、それぞれに合ったテンプレートを適用することはユーザー体験の向上につながります。
テンプレート階層を理解し、archive-○○.php や single-○○.php を正しく使うことで、簡潔かつメンテナンスしやすい構成が実現できます。
投稿タイプの設計段階からテンプレート分離を意識しておくと、テーマ開発や運用がよりスムーズになります。