カテゴリー一覧、タグ一覧、カスタムタクソノミー一覧、カスタム投稿タイプ一覧、作成者別一覧、日付別アーカイブなど、WordPressには多彩な一覧ページが存在します。
「すべてのアーカイブで共通のレイアウトを使いたい」「特定のカテゴリーだけ専用のデザインに切り替えたい」「カスタム投稿タイプ専用の一覧ページを設けたい」といった要件を実現するには、WordPressがテンプレートファイルを検索する順番(優先順位)を正しく理解しておくことが欠かせません。
本記事では、各アーカイブページの優先順位、ファイルの命名規則、実践的なPHPテンプレートコード(汎用ループ・専用タイトルの出力)、そしてテーマ制作時によくある注意点まで分かりやすく徹底解説します。
アーカイブページ(一覧画面)の種類と役割
WordPressにおける「アーカイブ(Archive)」とは、複数の投稿やコンテンツを一覧でまとめて表示するページ全般を指します。
Webサイトを訪れたユーザーが特定の切り口で記事を探すための導線として機能します。
WordPressには標準で以下のアーカイブページが用意されています。
- カテゴリーアーカイブ(Category Archive): 指定されたカテゴリーに属する投稿一覧
- タグアーカイブ(Tag Archive): 指定されたタグが付与された投稿一覧
- カスタムタクソノミーアーカイブ(Taxonomy Archive): 自作したカスタム分類に属する投稿一覧
- カスタム投稿タイプアーカイブ(Custom Post Type Archive): お知らせや実績など、独自の投稿タイプ一覧
- 投稿者アーカイブ(Author Archive): 特定の執筆者・ユーザーが書いた投稿一覧
- 日付アーカイブ(Date Archive): 年別・月別・日別で絞り込んだ投稿一覧
テンプレート階層(Template Hierarchy)の基本原則
WordPressは、ブラウザからアクセスされたURLやクエリ情報をもとに、「最も具体的・個別的なテンプレートファイル」から順にテーマ内を探し、見つからなければ「より汎用的なテンプレートファイル」へ自動的に後退(フォールバック)する仕組みを持っています。
これを「テンプレート階層(Template Hierarchy)」と呼びます。
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/)を表示する際の優先順位です。
- category-{slug}.php: カテゴリースラッグを指定(例:
category-news.php) - category-{id}.php: カテゴリーIDを指定(例:
category-4.php) - category.php: すべてのカテゴリー共通のテンプレート
- archive.php: すべてのアーカイブ共通のテンプレート
- index.php: 最終的なフォールバック
※ 実務では、環境移行(ローカル開発環境から本番環境への移行など)でIDが変わるリスクを防ぐため、ID指定ではなくスラッグ指定(category-slug.php)を用いるのが標準的です。
タグアーカイブの優先順位
タグ一覧ページ(例: https://example.com/tag/wordpress/)を表示する際の優先順位です。
- tag-{slug}.php: タグスラッグを指定(例:
tag-wordpress.php) - tag-{id}.php: タグIDを指定(例:
tag-12.php) - tag.php: すべてのタグ共通のテンプレート
- archive.php: アーカイブ共通テンプレート
- index.php: 最終的なフォールバック
カスタムタクソノミーアーカイブの優先順位
カスタム投稿タイプなどに紐付けた独自分類(タクソノミー)の一覧ページを表示する際の優先順位です。
例えば、タクソノミー名が genre、ターム名(項目スラッグ)が action の場合:
- taxonomy-{taxonomy}-{term}.php: タクソノミーとタームの両方を指定(例:
taxonomy-genre-action.php) - taxonomy-{taxonomy}.php: タクソノミー全体を指定(例:
taxonomy-genre.php) - taxonomy.php: すべてのカスタムタクソノミー共通のテンプレート
- archive.php: アーカイブ共通テンプレート
- index.php: 最終的なフォールバック
カスタム投稿タイプアーカイブの優先順位
独自に定義したカスタム投稿タイプ(例: event, product, news など)の一覧ページを表示する際の優先順位です。
- archive-{post_type}.php: 投稿タイプ名を指定(例:
archive-event.php,archive-product.php) - archive.php: アーカイブ共通テンプレート
- index.php: 最終的なフォールバック
カスタム投稿タイプの一覧ページを表示するには、
register_post_type() 関数で投稿タイプを登録する際に、引数 'has_archive' => true(またはアーカイブ用スラッグ名)を設定しておく必要があります。
投稿者(Author)アーカイブの優先順位
特定のユーザーが投稿した記事一覧(例: https://example.com/author/taro/)を表示する際の優先順位です。
- author-{nicename}.php: ユーザーの表示名/スラッグを指定(例:
author-taro.php) - author-{id}.php: ユーザーIDを指定(例:
author-1.php) - author.php: 投稿者共通のテンプレート
- archive.php: アーカイブ共通テンプレート
- index.php: 最終的なフォールバック
日付別アーカイブの優先順位
年別(/2026/)、月別(/2026/08/)、日別(/2026/08/16/)の日付アーカイブを表示する際の優先順位です。
- date.php: 日付アーカイブ専用テンプレート
- archive.php: アーカイブ共通テンプレート
- index.php: 最終的なフォールバック
自作テーマにおける実践的なアーカイブ設計パターン
基本方針:まずは archive.php を基盤にして共通化する
自作テーマ開発では、最初から category.php や tag.php、author.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' => '« 前へ',
'next_text' => '次へ »',
'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.phpのpre_get_postsアクションフックを使用するのがWordPressの鉄則です。 - the_archive_title() のプレフィックスを消したい場合: デフォルトでは「カテゴリー: お知らせ」のように接頭辞が付きます。接頭辞を除去したい場合は
functions.phpでget_the_archive_titleフィルターフックを利用してカスタマイズできます。
まとめ
WordPress自作テーマ制作におけるアーカイブページの優先順位とテンプレート階層のポイントをまとめます。
- WordPressは「具体的・個別的なファイル名」から探し、無ければ「汎用ファイル(archive.php / index.php)」へフォールバックする。
- カテゴリーは
category-slug.php→category.php→archive.phpの順で検索される。 - カスタムタクソノミーは
taxonomy-tax-term.php→taxonomy-tax.php→taxonomy.phpの順。 - カスタム投稿タイプ一覧は
archive-post_type.phpを配置し、has_archive => trueを設定する。 - まずは汎用的な
archive.phpを作り、専用デザインが必要なページのみ個別ファイルを足していくのが効率的。
テンプレート階層を正確に把握することで、無駄なコードの重複を防ぎ、拡張性とメンテナンス性に優れたWordPressテーマを構築できるようになります。
ぜひ実際のテーマ制作で活用してみてください。
