2025年07月27日[日曜日]

WordPressアーカイブページの統合管理!archive.phpで効率的なテンプレート設計

  • 2025/07/27
  • BASICS
  • WordPressの基礎
  • 0comments
  • 17views
  • 約7分で読めます
  • 33

前回の記事では、WordPressの日付別アーカイブ機能を使って、時系列での投稿管理を学習しました。

これまでの学習で、カテゴリー用にcategory.php、タグ用にtag.php、日付用にdate.phpと個別のテンプレートファイルを作成してきました。しかし、これらのファイルを見比べてみると、コードの内容がほぼ同じであることに気づくはずです。

今回は、重複するコードを整理し、WordPressのテンプレート階層を活用してより効率的なアーカイブページ管理を実装します。

今回の目標

  • WordPressのテンプレート階層を理解する
  • 重複コードを解消するarchive.phpの実装
  • 既存テンプレートファイルの整理方法

アーカイブページとは

これまでの学習で作成してきた「カテゴリーページ」「タグページ」「日付ページ」を、WordPressでは総称してアーカイブページと呼びます。

アーカイブページとは、複数の投稿を一覧表示するページのことです。具体的には以下のようなページが該当します:

  • カテゴリーページ: 特定のカテゴリーに属する投稿の一覧
  • タグページ: 特定のタグが付いた投稿の一覧
  • 日付ページ: 特定の期間(年・月・日)の投稿の一覧

テンプレート階層の理解

WordPressでは、各アーカイブページに適用されるテンプレートファイルの優先順位が決まっています。

カテゴリーページのテンプレート階層

  1. category-スラッグ.php
  2. category-ID.php
  3. category.php
  4. archive.php

タグページのテンプレート階層

  1. tag-スラッグ.php
  2. tag-ID.php
  3. tag.php
  4. archive.php

日付ページのテンプレート階層

  1. date.php
  2. archive.php

注目していただきたいのは、すべてのアーカイブページで最終的にarchive.phpが共通して使われることです。

つまり、専用のテンプレートファイル(category.phptag.phpdate.php)が存在しない場合、WordPressは自動的にarchive.phpを使用してページを表示します。

既存コードの重複確認

これまで作成した各テンプレートファイルのコードを確認してみましょう。

category.phpの主要部分
$args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'category__in' => [$category->term_id],
    'orderby' => 'title',
    'order' => 'asc',
];
tag.phpの主要部分
$args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'tag__in' => [$tag->term_id],
    'orderby' => 'title',
    'order' => 'asc',
];
date.phpの主要部分
$args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'title',
    'order' => 'asc',
];

ご覧の通り、基本的な構造は同じで、検索条件の部分だけが異なります。投稿一覧の表示ロジックも全く同じです。

条件分岐関数の理解

archive.phpを実装する前に、どのアーカイブページが表示されているかを判定する条件分岐関数を理解しましょう。

ページタイプ判定関数

WordPressでは、現在表示されているページがどの種類のアーカイブページかを判定する関数が用意されています。

if (is_category()) {
    // カテゴリーページでのみ実行される処理
} elseif (is_tag()) {
    // タグページでのみ実行される処理
} elseif (is_date()) {
    // 日付ページでのみ実行される処理
}

日付ページの詳細判定

日付ページでは、さらに細かい単位での条件分岐が可能です。

if (is_year()) {
    // 年別ページ(例:2025年)
} elseif (is_month()) {
    // 月別ページ(例:2025年7月)
} elseif (is_day()) {
    // 日別ページ(例:2025年7月15日)
}

これらの関数を組み合わせることで、1つのテンプレートファイル内で異なるページタイプに対応できます。

既存ファイルの整理

まず、これまで作成したテンプレートファイルを削除せずに残しておくため、ファイル名を変更します。

ファイル名変更

  1. category.phpold_category.php
  2. tag.phpold_tag.php
  3. date.phpold_date.php

せっかく作成したファイルなので、学習の記録として残しておきましょう。

archive.phpの実装

統合されたアーカイブテンプレートを作成します。

<?php get_header();?>

<?php
// 共通部の条件指定
$args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'title',
    'order' => 'asc',
];

// ページの種類に応じて抽出条件を追加
if (is_category()) {
    // カテゴリーページの場合
    $category = get_queried_object();
    $args['category__in'] = [$category->term_id];
} elseif (is_tag()) {
    // タグページの場合
    $tag = get_queried_object();
    $args['tag__in'] = [$tag->term_id];
} elseif (is_date()) {
    // 日付ページの場合
    if (is_year()) {
        // 年の場合
        $args['date_query'] = [
            [
                'year' => (int)get_query_var('year'),
            ]
        ];
    } elseif (is_month()) {
        // 年月の場合
        $args['date_query'] = [
            [
                'year' => (int)get_query_var('year'),
                'month' => (int)get_query_var('monthnum'),
            ]
        ];
    } elseif (is_day()) {
        // 年月日の場合
        $args['date_query'] = [
            [
                'year' => (int)get_query_var('year'),
                'month' => (int)get_query_var('monthnum'),
                'day' => (int)get_query_var('day'),
            ]
        ];
    }
}

// 投稿を取得
$query = new WP_Query($args);

echo '<ul class="post-list">' . PHP_EOL;
while ($query->have_posts()) {
    $query->the_post();
    
    // 投稿のカテゴリーを取得
    $categories = get_the_category();
    $category_name = !empty($categories) ? $categories[0]->name : '';
    
    echo '<li>'.
        '<span class="date">'.get_the_date('Y年m月d日').'</span>'.
        '<span class="category">'.$category_name.'</span>'.
        '<a href="'.get_the_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'.
        '</li>'.PHP_EOL;
}
wp_reset_postdata(); // 投稿データをリセット
echo '</ul>' . PHP_EOL;
?>

<p>※このページは archive.php テンプレートで表示されています</p>

<?php get_footer();?>

archive.phpの利点

コードの統合管理

  • 3つのテンプレートファイルの内容を1つに統合
  • 修正が必要な時は1箇所を変更するだけで済む
  • コードの重複を防ぎ、保守性が向上

WordPressの設計思想に沿った実装

  • テンプレート階層を活用した効率的な設計
  • WordPressのベストプラクティスに準拠
  • 将来的な機能拡張にも対応しやすい

動作確認

archive.phpを作成後、以下のページにアクセスして正常に動作することを確認してください。

  • カテゴリーページ(例:http://sample.local/news/category/opening
  • タグページ(例:http://sample.local/news/tag/WordPress
  • 日付ページ(例:http://sample.local/news/2025/07

重要な確認ポイント

すべてのページで以下の表示がされていることを確認してください:

※このページは archive.php テンプレートで表示されています

これまでは各ページで異なる表示でした。

  • カテゴリーページ:「※このページは category.php テンプレートで表示されています」
  • タグページ:「※このページは tag.php テンプレートで表示されています」
  • 日付ページ:「※このページは date.php テンプレートで表示されています」

今回の実装により、すべてのアーカイブページで同じarchive.phpテンプレートが使用されることが確認できます。これこそが今回の学習の核心部分です。

各ページで適切な投稿一覧が表示され、かつすべてで「archive.php」の表示がされていれば、テンプレート統合が成功しています。

まとめ

今回の記事では、WordPressのテンプレート階層を活用してアーカイブページを統合管理する方法を学習しました。

重要なポイント

  • テンプレート階層: WordPressが自動的にテンプレートファイルを選択する仕組み
  • archive.php: すべてのアーカイブページで共通して使用される統合テンプレート
  • 条件分岐: is_category()is_tag()is_date()でページタイプを判定
  • コード統合: 重複コードを1箇所にまとめて保守性を向上

機能比較表

機能個別テンプレートarchive.php統合
ファイル数3個(category.phptag.phpdate.php1個(archive.php
コード重複ありなし
保守性低い(3箇所の修正が必要)高い(1箇所の修正で済む)
WordPressの設計思想部分的に準拠完全に準拠

次のステップ

archive.phpによる統合管理を理解することで、WordPressのテンプレート設計がより効率的になります。この「1つのファイルで複数の機能を管理する」という考え方は、WordPressサイト構築において非常に重要な概念です。

今後より複雑なサイトを作る際にも、この統合的なテンプレート設計の考え方が活用できます。

次回予告

これまでカテゴリーとタグの2つの分類方法を使ってきましたが、カテゴリーやタグとは別の切り口で投稿を分類したい場面が出てきます。

例えば、内容による分類(新店舗、イベント、休業など)」と「場所による分類(東京店、大阪店など)」や「部門による分類(営業部、技術部など)」といった全く異なる軸での分類が可能です。

次回は、独自の分類システム「タクソノミー」を使った新しい分類軸の作成方法をお楽しみに!

成果物

この記事で作成した成果物は、以下のページでまとめて確認することができます。

成果物をまとめて確認する

この記事の評価をお願いします

評価をすると「既読」となり、まだ読んでいない記事を区別できます。

この投稿をシェアする

コメントを残す

CAPTCHA



WordPressで日付別アーカイブを実装!時系列での投稿管理テクニック

WordPressで日付別アーカイブを実装!時系列での投稿管理テクニック  BASICS

WordPressで日付別アーカイブ機能を実装する方法を詳しく解説します。月別・年別・日別での投稿一覧表示、パーマリンク設定の変更、時系列による投稿の絞り込み方法など、お知らせサイトなどで重要な日付管理機能の構築テクニックを実践的に学べる内容です。

  • 2025/07/27
  • 0comments
  • 36views

STAY CONNECTED

wp-ch Admin

現役のフリーランスエンジニアがWordPressによるWebサイト構築を基礎から実践テクニックまで徹底解説します。

たくさんの方がフォローしてくれています。あなたもぜひ、情報を受け取ってください。

STORY|ストーリー

WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。

学習ストーリー第33話まで掲載中

全ストーリーを見る

TAGS|タグ