2025年07月27日[日曜日]

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

  • 2025/07/26
  • BASICS
  • WordPressの基礎
  • 0comments
  • 29views
  • 約12分で読めます
  • 32

前回の記事では、WordPressのタグ機能を使って投稿をさらに細かく分類する方法を学習しました。

今回は、投稿を日付別で表示する方法について詳しく解説します。カテゴリーやタグに加えて、日付による分類機能を実装することで、時系列でのコンテンツ管理がより使いやすくなります。

お知らせサイトでは「今月の投稿」や「去年の同時期の投稿」など、時期による情報の整理が重要になることが多く、日付アーカイブ機能は非常に実用的です。

今回の目標

  • WordPressの日付アーカイブの仕組みを理解する
  • date.phpテンプレートの役割を学ぶ
  • 年別・月別・日別による投稿の分類方法を習得する

事前準備

日付別がわかりやすいように、投稿の日付を以下のように設定して動作を確認していきます。

投稿日カテゴリータイトルタグ
2025年07月15日新店舗新店舗オープンのお知らせ新店舗
2025年07月14日WEB/SNSSNS総フォロワー100人を達成しましたSNS
2025年06月13日イベントWordPress講習会開催のお知らせWordPress,講習会
2025年05月12日休業夏季休暇のお知らせ長期休暇
2025年05月12日WEB/SNSWebサイト開設のお知らせよろしく,ホームページ
2024年07月11日未分類Hello world!よろしく

パーマリンクの設定を変更

日付別アーカイブを正しく動作させるために、パーマリンクの設定を変更します。

現状

現状は、サイトのURL(http://sample.com)+固定文字「news」+投稿ID(%post_id%)になっています。

/news/%post_id%

例)http://sample.local/news/123

変更後

日付で区別するためにサイトのURL(http://sample.com)+固定文字「news」+年(%year%)+月(%monthnum%)+日(%day%)+投稿ID(%post_id%)にします。

%month%ではなく %monthnum%にする点にご注意ください。

/news/%year%/%monthnum%/%day%/%post_id%

例)http://sample.local/news/2025/07/11/1234

WordPress管理画面の設定パーマリンクからカスタム構造を上記に変更し、変更を保存をクリックします。

動作確認

お知らせページを開いて、個別投稿のURLに日付が入っていることを確認しましょう。

月別一覧を表示

お知らせページ(page-news.php)に月別一覧を表示します。 日付一覧の表示にはwp_get_archives関数を使用します。

wp_get_archives<a>タグを含んだ<li>タグを出力するため、<ul>タグは自分で記述する必要があります。

月別表示のコード

echo '<ul>'.PHP_EOL;
wp_get_archives([
    'type' => 'monthly',
    'format' => 'html',    // 省略可
    'echo' => true,        // 省略可
]);
echo '</ul>'.PHP_EOL;

これで以下のようなHTMLが出力されます。

<ul>
<li><a href="http://sample.local/news/2024/07">2024年07月</a></li>
<li><a href="http://sample.local/news/2025/05">2025年05月</a></li>
<li><a href="http://sample.local/news/2025/06">2025年06月</a></li>
<li><a href="http://sample.local/news/2025/07">2025年07月</a></li>
</ul>

コードの解説

‘type’ => ‘monthly’

typeは、年別(yearly)、月別(monthy)、日別(Daily)、週別(weekly)を指定できます。デフォルト(省略時)は「monthly」です。

今回は月別なのでmonthlyを指定します。

‘format’ => ‘html’

formatは主にhtmlまはたoptionのどちらかを指定します。デフォルト(省略時)は「html」です。

  • htmlを指定すると<a>タグを含んだ<li>タグを出力します。
  • optionを指定する<select>タグ用に<option>タグ形式で出力します。

‘echo’ => true

echo は即表示(true)または変数代入(false)を指定します。デフォルト(省略時)は「true」です。

page-news.phpの更新

それでは既存のpage-news.phpに月別一覧を追加してみましょう。

<?php get_header();?>

<?php the_content(); ?>

<?php
// カテゴリー一覧を取得
$categories = get_categories([
    'hide_empty' => true, // 投稿がないカテゴリーは除外
    'orderby' => 'term_order', // 管理画面と同じ並び順
    'order' => 'asc',
]);

echo '<h2>カテゴリー</h2>' . PHP_EOL;
echo '<ul class="category-list">' . PHP_EOL;

foreach ($categories as $category) {
    echo '<li><a href="'.get_term_link($category->term_id).'">'.$category->name.'</a></li>'.PHP_EOL;
}

echo '</ul>' . PHP_EOL;

// タグ一覧を取得
$tags = get_tags([
    'hide_empty' => true, // 投稿がないタグは除外
    'orderby' => 'name',
    'order' => 'asc',
]);

echo '<h2>タグ</h2>' . PHP_EOL;
echo '<ul class="tag-list">' . PHP_EOL;

foreach ($tags as $tag) {
    echo '<li><a href="'.get_term_link($tag->term_id).'">'.$tag->name.'</a></li>'.PHP_EOL;
}

echo '</ul>' . PHP_EOL;

// 月別一覧を追加
echo '<h2>月別</h2>' . PHP_EOL;
echo '<ul>'.PHP_EOL;
wp_get_archives([
    'type' => 'monthly',
    'format' => 'html',
    'echo' => true,
]);
echo '</ul>'.PHP_EOL;
?>

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

<?php get_footer();?>

表示確認

お知らせページを開いて、月別一覧が表示されることを確認しましょう。

wp_get_archivesのデメリット

wp_get_archivesは便利な関数ですが、出力される書式が決まっていてカスタマイズが難しいのがデメリットです。

例えば、以下のように年別にグループ化した表示をしたい場合

<h3>2024年</h3>
<ul>
<li><a href="http://sample.local/news/2024/01">2024年01月</a></li>
<li><a href="http://sample.local/news/2024/02">2024年02月</a></li>
...
<li><a href="http://sample.local/news/2024/12">2024年12月</a></li>
</ul>
<h3>2025年</h3>
<ul>
<li><a href="http://sample.local/news/2025/01">2025年01月</a></li>
<li><a href="http://sample.local/news/2025/02">2025年02月</a></li>
...
<li><a href="http://sample.local/news/2025/12">2025年12月</a></li>
</ul>

このような表示形式はwp_get_archivesでは実現できません。

より柔軟なカスタマイズが必要な場合は、以下のような方法が実際の現場では使われます。

  1. SQLを直接書く: より効率的にデータを取得
  2. wp_get_archivesにフィルターを適用: 出力をカスタマイズ
  3. 正規表現でHTMLを書き換え: wp_get_archivesが生成したHTMLを後から変換

WP_Queryを使って全件取得してからHTMLを構築するのは、パフォーマンス上の問題があるため実際の現場ではほとんど行われません。今回は基本的な使い方としてwp_get_archivesを使用していますが、実際のサイト構築では用途に応じてより効率的な方法を選択することが重要です。

日付別一覧ページの作成

カテゴリーはcategory.php、タグはtag.phpでしたが、日付別のテンプレートはdate.phpになります。

日付情報の取得方法

カテゴリーとタグはget_queried_object()で現在表示中のタームを取得しましたが、日付別の場合は以下の関数を使用します。

  • get_query_var('year') – 年を取得
  • get_query_var('monthnum') – 月を取得
  • get_query_var('day') – 日を取得

年月日の判定

年、年月、年月日のどのパターンのパーマリンクかを以下の関数で判断できます。

if ( is_year() ) {
    // 年の場合
} elseif ( is_month() ) {
    // 年月の場合
} elseif ( is_day() ) {
    // 年月日の場合
}

is_yearは年が指定されているかの判定、is_monthは年月が指定されているかの判定、is_dayは年月日が指定されているかの判定を行います。

ポイント

  • http://sample.local/news/2025/ → 年のみ is_year() = true, is_month() = false, is_day() = false
  • http://sample.local/news/2025/07/ → 年月 is_year() = false, is_month() = true, is_day() = false
  • http://sample.local/news/2025/07/11/ → 年月日 is_year() =false, is_month() = false, is_day() = true

is_yearis_monthis_day のいずれか1つだけがtrueになります。

WP_Queryでの日付条件指定

これらの判定を利用してデータの抽出を行います。

共通部分の条件を指定
$args = [
    'post_type'      => 'post',
    'post_status'    => 'publish',
    'orderby'        => 'title',
    'order'          => 'asc',
];
年月日に応じて抽出条件を追加
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'),
        ]
    ];
}

このように抽出条件を共通部と年月日に分けることで、コードの重複を防ぐことができます。

ポイント

get_query_var()は文字列を取得する関数です。 一方、date_queryの指定は数値が必要です。(int)をつけて文字列を数値に変換しています。

date.phpのコード全体

<?php get_header();?>

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

//年月日に応じて抽出条件を指定
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>※このページは date.php テンプレートで表示されています</p>

<?php get_footer();?>

表示の確認

お知らせページから月別リンクをクリックして、該当する年月の投稿が表示されているか確認しましょう。

実践練習

お知らせページに月別一覧を表示しましたが、年別や日別に変えて日付別一覧(date.php)が正しく機能するか確認してみましょう。

年別表示に変更

wp_get_archives([
    'type' => 'yearly',  // monthlyからyearlyに変更
    'format' => 'html',
    'echo' => true,
]);

日別表示に変更

wp_get_archives([
    'type' => 'daily',   // monthlyからdailyに変更
    'format' => 'html',
    'echo' => true,
]);

それぞれの表示形式でdate.phpが正しく動作することを確認してください。

タイトルの設定

カテゴリーやタグと同様に、日付別のタイトルも設定しましょう。 header.phpを以下のように変更します。

<?php
if (is_category()) {
    $category = get_queried_object();
    echo '<h1 class="page-title">'.$category->name.'のお知らせ</h1>'.PHP_EOL;
} elseif (is_tag()) {
    $tag = get_queried_object();
    echo '<h1 class="page-title">タグ「'.$tag->name.'」のお知らせ</h1>'.PHP_EOL;
} elseif ( is_date() ) {
    $title_date = '';
    if( get_query_var('year') ) {
        $title_date .= get_query_var('year').'年';
    }
    if( get_query_var('monthnum') ) {
        $title_date .= get_query_var('monthnum').'月';
    }
    if( get_query_var('day') ) {
        $title_date .= get_query_var('day').'日';
    }

    echo '<h1 class="page-title">'.$title_date.'のお知らせ</h1>'.PHP_EOL;
} elseif (!is_front_page()) {
    echo '<h1 class="page-title">'. get_the_title() .'</h1>'.PHP_EOL;
}
?>

表示確認

日付別ページを開いて、タイトルが正しく表示されるか確認しましょう。

まとめ

今回の記事では、WordPressの日付アーカイブ機能を活用した実装方法を学習しました。

主なポイント

  • 日付アーカイブの概念: WordPressでは投稿を年月日で自動的に分類できる
  • date.phpテンプレート: 日付別投稿一覧を表示する専用テンプレート
  • is_year(), is_month(), is_day(): どの単位の日付ページかを判定
  • date_query: 年月日による投稿の絞り込み方法
  • get_query_var(): URLから年月日の情報を取得する方法

WordPressの日付アーカイブ機能を理解することで、カテゴリーやタグとは異なる時系列での情報整理が可能になります。この概念を理解しておくことで、より複雑なサイト構築にも応用できるようになります。

機能比較表

機能カテゴリータグ日付
一覧取得get_categories()get_tags()wp_get_archives()
テンプレートcategory.phptag.phpdate.php
WP_Querycategory__intag__indate_query
条件分岐is_category()is_tag()is_year(), is_month(), is_day()
ターム情報取得get_queried_object()get_queried_object()get_query_var()

カテゴリー、タグ、日付の3つの分類方法を組み合わせることで、ユーザーが求める情報をより効率的に見つけられるWebサイトが構築できます。

次回予告

今回はdate.phpを使って年月日別の投稿一覧を表示する方法を学びました。

これまでcategory.phptag.phpdate.phpと個別のテンプレートを作成してきましたが、実はこれらの機能はarchives.php一箇所で管理することができます!

次回は、複数のアーカイブページを統合管理する効率的な方法をお楽しみに!

成果物

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

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

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

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

この投稿をシェアする

コメントを残す

CAPTCHA



WordPressでタグ機能を活用!投稿をさらに細かく分類する実装テクニック

WordPressでタグ機能を活用!投稿をさらに細かく分類する実装テクニック  BASICS

WordPressのタグ機能を使った投稿分類システムの実装テクニックを詳しく解説。タグ一覧の表示方法、タグ別投稿一覧ページの作成、カテゴリーとの使い分け方法まで、実践的なコード例とともに学べる内容です。

  • 2025/07/26
  • 0comments
  • 32views

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

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

WordPressのテンプレート階層を活用して、カテゴリー、タグ、日付のアーカイブページを一つのファイルで統合管理する方法を解説します。重複するコードを整理し、保守性の高い効率的なテンプレート設計を実現するテクニックを学習できます。

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

STAY CONNECTED

wp-ch Admin

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

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

STORY|ストーリー

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

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

全ストーリーを見る

TAGS|タグ