成果物をまとめて確認する
[成果物]WordPressで日付別アーカイブを実装!時系列での投稿管理テクニック
【WordPressで日付別アーカイブを実装!時系列での投稿管理テクニック】の成果物です。投稿の学びを終えた時点の構成を一覧でご確認いただけます。
前回の記事では、WordPressのタグ機能を使って投稿をさらに細かく分類する方法を学習しました。
今回は、投稿を日付別で表示する方法について詳しく解説します。カテゴリーやタグに加えて、日付による分類機能を実装することで、時系列でのコンテンツ管理がより使いやすくなります。
お知らせサイトでは「今月の投稿」や「去年の同時期の投稿」など、時期による情報の整理が重要になることが多く、日付アーカイブ機能は非常に実用的です。
今回の目標
date.phpテンプレートの役割を学ぶ目次
日付別がわかりやすいように、投稿の日付を以下のように設定して動作を確認していきます。
| 投稿日 | カテゴリー | タイトル | タグ |
|---|---|---|---|
| 2025年07月15日 | 新店舗 | 新店舗オープンのお知らせ | 新店舗 |
| 2025年07月14日 | WEB/SNS | SNS総フォロワー100人を達成しました | SNS |
| 2025年06月13日 | イベント | WordPress講習会開催のお知らせ | WordPress,講習会 |
| 2025年05月12日 | 休業 | 夏季休暇のお知らせ | 長期休暇 |
| 2025年05月12日 | WEB/SNS | Webサイト開設のお知らせ | よろしく,ホームページ |
| 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
お知らせページ(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;PHPこれで以下のような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>HTMLtypeは、年別(yearly)、月別(monthy)、日別(Daily)、週別(weekly)を指定できます。デフォルト(省略時)は「monthly」です。
今回は月別なのでmonthlyを指定します。
formatは主にhtmlまはたoptionのどちらかを指定します。デフォルト(省略時)は「html」です。
htmlを指定すると<a>タグを含んだ<li>タグを出力します。optionを指定する<select>タグ用に<option>タグ形式で出力します。echo は即表示(true)または変数代入(false)を指定します。デフォルト(省略時)は「true」です。
それでは既存の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();?>PHPwp_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>HTMLこのような表示形式はwp_get_archivesでは実現できません。
より柔軟なカスタマイズが必要な場合は、以下のような方法が実際の現場では使われます。
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() ) {
// 年月日の場合
}PHPis_yearは年が指定されているかの判定、is_monthは年月が指定されているかの判定、is_dayは年月日が指定されているかの判定を行います。
ポイント
is_year() = true, is_month() = false, is_day() = falseis_year() = false, is_month() = true, is_day() = falseis_year() =false, is_month() = false, is_day() = trueis_year、is_month、is_day のいずれか1つだけがtrueになります。
これらの判定を利用してデータの抽出を行います。
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'asc',
];PHPif ( 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'),
]
];
}PHPこのように抽出条件を共通部と年月日に分けることで、コードの重複を防ぐことができます。
ポイント
get_query_var()は文字列を取得する関数です。 一方、date_queryの指定は数値が必要です。(int)をつけて文字列を数値に変換しています。
<?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();?>PHPお知らせページに月別一覧を表示しましたが、年別や日別に変えて日付別一覧(date.php)が正しく機能するか確認してみましょう。
wp_get_archives([
'type' => 'yearly', // monthlyからyearlyに変更
'format' => 'html',
'echo' => true,
]);PHPwp_get_archives([
'type' => 'daily', // monthlyからdailyに変更
'format' => 'html',
'echo' => true,
]);PHPそれぞれの表示形式で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;
}
?>PHP今回の記事では、WordPressの日付アーカイブ機能を活用した実装方法を学習しました。
date.phpテンプレート: 日付別投稿一覧を表示する専用テンプレートis_year(), is_month(), is_day(): どの単位の日付ページかを判定date_query: 年月日による投稿の絞り込み方法get_query_var(): URLから年月日の情報を取得する方法WordPressの日付アーカイブ機能を理解することで、カテゴリーやタグとは異なる時系列での情報整理が可能になります。この概念を理解しておくことで、より複雑なサイト構築にも応用できるようになります。
| 機能 | カテゴリー | タグ | 日付 |
|---|---|---|---|
| 一覧取得 | get_categories() | get_tags() | wp_get_archives() |
| テンプレート | category.php | tag.php | date.php |
| WP_Query | category__in | tag__in | date_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.php、tag.php、date.phpと個別のテンプレートを作成してきましたが、実はこれらの機能はarchives.php一箇所で管理することができます!
次回は、複数のアーカイブページを統合管理する効率的な方法をお楽しみに!
この記事で作成した成果物は、以下のページでまとめて確認することができます。
BASICS WordPressのタグ機能を使った投稿分類システムの実装テクニックを詳しく解説。タグ一覧の表示方法、タグ別投稿一覧ページの作成、カテゴリーとの使い分け方法まで、実践的なコード例とともに学べる内容です。
BASICS WordPressのテンプレート階層を活用して、カテゴリー、タグ、日付のアーカイブページを一つのファイルで統合管理する方法を解説します。重複するコードを整理し、保守性の高い効率的なテンプレート設計を実現するテクニックを学習できます。
WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。
学習ストーリー第40話まで掲載中