【WordPress】カスタム投稿タイプごとに異なるテンプレートを適用する方法

【WordPress】カスタム投稿タイプごとに異なるテンプレートを適用する方法 WordPress

WordPressでは、カスタム投稿タイプ(CPT)を使うことで、投稿とは異なる独自のコンテンツ構造を作成できます。
しかし、投稿タイプに応じてテンプレートを出し分けたい場合は、それに応じたファイル設計が必要です。

この記事では、カスタム投稿タイプごとにテンプレートを分ける方法を、基本から応用まで解説します。

基本:テンプレート階層のルールを理解する

WordPressにはテンプレート階層という仕組みがあり、カスタム投稿タイプの場合も次のような順番でテンプレートが読み込まれます。

例:投稿タイプが movie の場合

表示画面 優先されるテンプレートファイル
一覧ページ archive-movie.phparchive.phpindex.php
詳細ページ single-movie.phpsingle.phpsingular.phpindex.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 を正しく使うことで、簡潔かつメンテナンスしやすい構成が実現できます。

投稿タイプの設計段階からテンプレート分離を意識しておくと、テーマ開発や運用がよりスムーズになります。