【WordPress】自作テーマ作成:アーカイブページの優先順位とテンプレート階層の完全解説

WordPressでオリジナルの自作テーマを作成する際、必ずマスターしておきたい重要な仕組みが「アーカイブページ(一覧画面)のテンプレート優先順位(Template Hierarchy)」です。
カテゴリー一覧、タグ一覧、カスタムタクソノミー一覧、カスタム投稿タイプ一覧、作成者別一覧、日付別アーカイブなど、WordPressには多彩な一覧ページが存在します。
「すべてのアーカイブで共通のレイアウトを使いたい」「特定のカテゴリーだけ専用のデザインに切り替えたい」「カスタム投稿タイプ専用の一覧ページを設けたい」といった要件を実現するには、WordPressがテンプレートファイルを検索する順番(優先順位)を正しく理解しておくことが欠かせません。
本記事では、各アーカイブページの優先順位、ファイルの命名規則、実践的なPHPテンプレートコード(汎用ループ・専用タイトルの出力)、そしてテーマ制作時によくある注意点まで分かりやすく徹底解説します。

アーカイブページ(一覧画面)の種類と役割

WordPressにおける「アーカイブ(Archive)」とは、複数の投稿やコンテンツを一覧でまとめて表示するページ全般を指します。
Webサイトを訪れたユーザーが特定の切り口で記事を探すための導線として機能します。

WordPressには標準で以下のアーカイブページが用意されています。

WordPressの主なアーカイブ一覧:

  • カテゴリーアーカイブ(Category Archive): 指定されたカテゴリーに属する投稿一覧
  • タグアーカイブ(Tag Archive): 指定されたタグが付与された投稿一覧
  • カスタムタクソノミーアーカイブ(Taxonomy Archive): 自作したカスタム分類に属する投稿一覧
  • カスタム投稿タイプアーカイブ(Custom Post Type Archive): お知らせや実績など、独自の投稿タイプ一覧
  • 投稿者アーカイブ(Author Archive): 特定の執筆者・ユーザーが書いた投稿一覧
  • 日付アーカイブ(Date Archive): 年別・月別・日別で絞り込んだ投稿一覧

テンプレート階層(Template Hierarchy)の基本原則

WordPressは、ブラウザからアクセスされたURLやクエリ情報をもとに、「最も具体的・個別的なテンプレートファイル」から順にテーマ内を探し、見つからなければ「より汎用的なテンプレートファイル」へ自動的に後退(フォールバック)する仕組みを持っています。
これを「テンプレート階層(Template Hierarchy)」と呼びます。

WordPress アーカイブ テンプレート階層 フォールバック フローチャート

WordPressにおけるアーカイブテンプレートのフォールバックの流れ

たとえば、カテゴリーアーカイブを表示する際、専用の category-news.php がテーマ内に存在すればそれが適用されます。
存在しない場合は category.php を探し、それも無ければ archive.php、最終的に index.php が呼び出されます。

この優先順位を理解しておけば、「最小限のファイル数で共通化しつつ、必要な部分だけピンポイントで個別デザインを適用する」という効率的でメンテナンス性の高いテーマ設計が可能になります。

アーカイブテンプレート優先順位の早見表

各アーカイブページにおけるファイルの読み込み優先順位(左から右へ順に検索)を一覧表にまとめました。

アーカイブ種別 優先度1(最優先) 優先度2 優先度3(種別共通) 優先度4(全体共通) 優先度5(最終代替)
カテゴリー 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-{tax}-{term}.php taxonomy-{tax}.php taxonomy.php archive.php index.php
カスタム投稿タイプ archive-{post_type}.php archive.php index.php
投稿者(Author) author-{nicename}.php author-{id}.php author.php archive.php index.php
日付(年・月・日) date.php archive.php index.php

各アーカイブの優先順位とファイル命名規則

カテゴリーアーカイブの優先順位

投稿カテゴリーの一覧ページ(例: https://example.com/category/news/)を表示する際の優先順位です。

  1. category-{slug}.php: カテゴリースラッグを指定(例: category-news.php
  2. category-{id}.php: カテゴリーIDを指定(例: category-4.php
  3. category.php: すべてのカテゴリー共通のテンプレート
  4. archive.php: すべてのアーカイブ共通のテンプレート
  5. index.php: 最終的なフォールバック

※ 実務では、環境移行(ローカル開発環境から本番環境への移行など)でIDが変わるリスクを防ぐため、ID指定ではなくスラッグ指定(category-slug.phpを用いるのが標準的です。

タグアーカイブの優先順位

タグ一覧ページ(例: https://example.com/tag/wordpress/)を表示する際の優先順位です。

  1. tag-{slug}.php: タグスラッグを指定(例: tag-wordpress.php
  2. tag-{id}.php: タグIDを指定(例: tag-12.php
  3. tag.php: すべてのタグ共通のテンプレート
  4. archive.php: アーカイブ共通テンプレート
  5. index.php: 最終的なフォールバック

カスタムタクソノミーアーカイブの優先順位

カスタム投稿タイプなどに紐付けた独自分類(タクソノミー)の一覧ページを表示する際の優先順位です。
例えば、タクソノミー名が genre、ターム名(項目スラッグ)が action の場合:

  1. taxonomy-{taxonomy}-{term}.php: タクソノミーとタームの両方を指定(例: taxonomy-genre-action.php
  2. taxonomy-{taxonomy}.php: タクソノミー全体を指定(例: taxonomy-genre.php
  3. taxonomy.php: すべてのカスタムタクソノミー共通のテンプレート
  4. archive.php: アーカイブ共通テンプレート
  5. index.php: 最終的なフォールバック

カスタム投稿タイプアーカイブの優先順位

独自に定義したカスタム投稿タイプ(例: event, product, news など)の一覧ページを表示する際の優先順位です。

  1. archive-{post_type}.php: 投稿タイプ名を指定(例: archive-event.php, archive-product.php
  2. archive.php: アーカイブ共通テンプレート
  3. index.php: 最終的なフォールバック
注意:カスタム投稿タイプでアーカイブページを有効にする設定
カスタム投稿タイプの一覧ページを表示するには、register_post_type() 関数で投稿タイプを登録する際に、引数 'has_archive' => true(またはアーカイブ用スラッグ名)を設定しておく必要があります。

投稿者(Author)アーカイブの優先順位

特定のユーザーが投稿した記事一覧(例: https://example.com/author/taro/)を表示する際の優先順位です。

  1. author-{nicename}.php: ユーザーの表示名/スラッグを指定(例: author-taro.php
  2. author-{id}.php: ユーザーIDを指定(例: author-1.php
  3. author.php: 投稿者共通のテンプレート
  4. archive.php: アーカイブ共通テンプレート
  5. index.php: 最終的なフォールバック

日付別アーカイブの優先順位

年別(/2026/)、月別(/2026/08/)、日別(/2026/08/16/)の日付アーカイブを表示する際の優先順位です。

  1. date.php: 日付アーカイブ専用テンプレート
  2. archive.php: アーカイブ共通テンプレート
  3. index.php: 最終的なフォールバック

自作テーマにおける実践的なアーカイブ設計パターン

基本方針:まずは archive.php を基盤にして共通化する

自作テーマ開発では、最初から category.phptag.phpauthor.php などを個別に量産するのは推奨されません。
まずはベースとなる汎用的な archive.php を1つ作成し、共通のレイアウトを完成させるのがベストプラクティスです。

実践コード:汎用 archive.php の実装例

WordPress標準の the_archive_title()the_archive_description() を活用すると、現在表示しているのがカテゴリー・タグ・年月・著者のいずれであっても、適切な見出しと説明文を自動で出力してくれます。

<?php
/*
 * 汎用アーカイブテンプレート (archive.php)
 * カテゴリー、タグ、タクソノミー、日付、投稿者などの一覧を共通で処理します。
 */

get_header();
?>

<main id="primary" class="site-main site-container">

  <!-- アーカイブヘッダー(タイトルと説明文を自動出力) -->
  <header class="page-header" style="margin-bottom: 2rem;">
    <h1 class="page-title" style="font-size: 1.75rem; font-weight: bold;">
      <?php the_archive_title(); ?>
    </h1>
    <?php
    the_archive_description(
      '<div class="archive-description" style="color: #64748b; margin-top: 0.5rem;">',
      '</div>'
    );
    ?>
  </header>

  <!-- 記事一覧ループ -->
  <?php if ( have_posts() ) : ?>

    <div class="post-cards-grid" style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem;">
      <?php
      while ( have_posts() ) :
        the_post();
        // 記事カードパーツを読み込み
        get_template_part( 'template-parts/content', 'archive' );
      endwhile;
      ?>
    </div>

    <!-- ページネーション -->
    <nav class="pagination-wrapper" style="margin-top: 3rem; text-align: center;">
      <?php
      the_posts_pagination( array(
        'mid_size'           => 2,
        'prev_text'          => '&laquo; 前へ',
        'next_text'          => '次へ &raquo;',
        'screen_reader_text' => 'ページナビゲーション',
      ) );
      ?>
    </nav>

  <?php else : ?>

    <!-- 記事が存在しない場合のメッセージ -->
    <section class="no-results not-found" style="padding: 3rem 0; text-align: center;">
      <h2>記事が見つかりませんでした</h2>
      <p>お探しの条件に一致する投稿はまだありません。</p>
    </section>

  <?php endif; ?>

</main>

<?php
get_sidebar();
get_footer();

特定カテゴリー専用テンプレート(category-news.php)の実装例

「お知らせ(news)」カテゴリーだけはカード型グリッドではなく、日付とタイトルが並ぶシンプルなリスト形式(テーブル風)で表示したい場合の例です。
ファイル名を category-news.php としてテーマ直下に配置するだけで、自動的に優先適用されます。

<?php
/*
 * お知らせカテゴリー専用テンプレート (category-news.php)
 */

get_header();
?>

<main id="primary" class="site-main site-container">

  <header class="page-header" style="margin-bottom: 2rem; border-bottom: 2px solid #0284c7; padding-bottom: 1rem;">
    <h1 class="page-title" style="font-size: 1.75rem; font-weight: bold; color: #0f172a;">
      お知らせ一覧
    </h1>
  </header>

  <?php if ( have_posts() ) : ?>

    <ul class="news-list" style="list-style: none; padding: 0; margin: 0;">
      <?php while ( have_posts() ) : the_post(); ?>
        <li style="padding: 14px 0; border-bottom: 1px solid #e2e8f0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px;">
          <time datetime="<?php echo get_the_date( 'Y-m-d' ); ?>" style="color: #64748b; font-size: 0.9rem; width: 110px;">
            <?php echo get_the_date( 'Y.m.d' ); ?>
          </time>
          <a href="<?php the_permalink(); ?>" style="color: #0f172a; text-decoration: none; font-weight: 500;">
            <?php the_title(); ?>
          </a>
        </li>
      <?php endwhile; ?>
    </ul>

    <nav class="pagination-wrapper" style="margin-top: 2.5rem;">
      <?php the_posts_pagination(); ?>
    </nav>

  <?php else : ?>
    <p>現在お知らせはありません。</p>
  <?php endif; ?>

</main>

<?php
get_sidebar();
get_footer();

アーカイブ作成時によくあるトラブルと注意点

  • カスタム投稿タイプ一覧が404エラーになる: 新しくカスタム投稿タイプやアーカイブを追加した直後は、WordPress管理画面の「設定 > パーマリンク」を開いて「変更を保存」ボタンを押し、リライトルールを更新(フラッシュ)してください。
  • ID指定よりもスラッグ指定を優先する: category-4.php のようなID指定は、テスト環境から本番環境へ移行した際にID番号がずれて適用されなくなるトラブルの原因になります。可能な限り category-news.php のようにスラッグ名で作成しましょう。
  • アーカイブ内で query_posts() は絶対に使わない: メインループの記事取得条件を変更したい場合(表示件数や並び順の変更など)は、テンプレート内でサブクエリを発行せず、functions.phppre_get_posts アクションフックを使用するのがWordPressの鉄則です。
  • the_archive_title() のプレフィックスを消したい場合: デフォルトでは「カテゴリー: お知らせ」のように接頭辞が付きます。接頭辞を除去したい場合は functions.phpget_the_archive_title フィルターフックを利用してカスタマイズできます。

まとめ

WordPress自作テーマ制作におけるアーカイブページの優先順位とテンプレート階層のポイントをまとめます。

  • WordPressは「具体的・個別的なファイル名」から探し、無ければ「汎用ファイル(archive.php / index.php)」へフォールバックする。
  • カテゴリーは category-slug.phpcategory.phparchive.php の順で検索される。
  • カスタムタクソノミーは taxonomy-tax-term.phptaxonomy-tax.phptaxonomy.php の順。
  • カスタム投稿タイプ一覧は archive-post_type.php を配置し、has_archive => true を設定する。
  • まずは汎用的な archive.php を作り、専用デザインが必要なページのみ個別ファイルを足していくのが効率的。

テンプレート階層を正確に把握することで、無駄なコードの重複を防ぎ、拡張性とメンテナンス性に優れたWordPressテーマを構築できるようになります。
ぜひ実際のテーマ制作で活用してみてください。


eguchi.netをもっと見る

購読すると最新の投稿がメールで送信されます。