年度アーカイブのリンクを出力する方法【WordPress】
※本記事のコードは参考用です。使用前にご自身で動作確認をお願いします。
はじめに
WordPressで「年度(会計年度など)」ごとのアーカイブリンクを作成したい場合、単純に西暦年(1月〜12月)で分類するだけでは要件を満たせないことがあります。
特に、日本のように「4月始まりの年度区切り」で投稿をまとめたいケースは多く見られます。
しかし、WordPressのアーカイブリンクを取得する関数 wp_get_archives
で 'type' => 'yearly'
を指定すると、暦年(1月〜12月)ベースのアーカイブリンクしか出力されません。
たとえば、2024年3月1日に公開した記事は「2023年度(2023年4月〜2024年3月)」に含めたいところですが、wp_get_archives
はこれを「2024年の投稿」として扱うため、2023年度としてリンクが出力されないという問題が発生します。(特にその年度に1件しか投稿がない場合、アーカイブリンク自体が出力されません)
それでは、どうすれば「4月始まりの年度」でアーカイブリンクを正しく出力できるのか?
この記事では、年度単位のアーカイブリンクを動的に出力する方法を、実際のコードとあわせて丁寧に解説します。
年度アーカイブについて
年度アーカイブリンクの出力の前に、まず「年別アーカイブ」を「年度アーカイブ」に修正する必要があります。
例えば「2023年度 = 2023年4月1日〜2024年3月31日」など、暦年ではなく会計年度や学校年度の区切りで投稿をグループ化する方法です。
WordPressのデフォルトの年別アーカイブは暦年ベースなので、カスタマイズが必要です。
実際に年別アーカイブを年度アーカイブに修正するコードはここでは割愛させていただきます。pre_get_posts
を利用してループ前に年度の範囲を修正するというやり方で可能で、以下の記事を参考にさせていただきました。
WordPress の年別アーカイブを年度別(4月はじまり)にカスタマイズする方法。
実装のポイント
それでは、年度アーカイブリンクの出力方法について解説していきます。
投稿を全件取得して年度ごとに分類する方法も考えられますが、年単位のアーカイブを出力したいということは、ある程度記事数が多いケースが想定されます。
そのため、パフォーマンスへの影響を最小限に抑えるために、ここでは 各年度ごとに「投稿が1件でも存在するか」をチェックするだけの方法を採用します。
この方法なら、各年度に対して軽量なクエリを1回ずつ実行するだけで済むため、全件取得に比べて負荷を抑えつつ、必要な年度リンクだけを表示することができます。
1. 最古の投稿年を自動取得する
まず、年度リンクを作る際にどの年から表示すれば良いかを決める必要があります。
たとえば「2020年度」からリンクを出したいのに、その年に投稿が1件もなければリンクを出しても意味がありません。
そこで、WordPressの投稿の中で一番古い投稿が作成された年を調べます。
$oldest_post = get_posts(array(
'post_type' => '投稿またはカスタム投稿タイプ',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'ASC',
'fields' => 'ids',
));
if (!empty($oldest_post)) {
$start_year = (int)get_the_date('Y', $oldest_post[0]); // 投稿の公開年を数字で取得
} else {
return; // 投稿がなければ処理を終了
}
2. 年度ごとに投稿の存在をチェックしてリンクを出力する
次に、現在の年(例:2025年)から最古の投稿年までの間で、「その年度に投稿が1件でもあるかどうか」を調べていきます。
年度の区切りは「4月1日〜翌年3月31日」として、1年間を指定します。その範囲内で投稿が存在すればリンクを作成します。
$current_year = (int)date('Y');
echo '<ul class="year-list">';
for ($y = $current_year; $y >= $start_year; $y--) { // 現在の年から最古の投稿年まで、年度を1つずつ調べる
$after = "$y-04-01";
$before = ($y + 1) . "-03-31 23:59:59";
$query = new WP_Query(array(
'post_type' => '投稿またはカスタム投稿タイプ',
'posts_per_page' => 1,
'date_query' => array(array(
'after' => $after,
'before' => $before,
'inclusive' => true,
)),
'fields' => 'ids',
));
if ($query->have_posts()) {
echo '<li><a href="' . home_url('/投稿または投稿タイプのURLに合わせる/' . $y) . '">' . $y . '年度</a></li>';
}
wp_reset_postdata();
}
echo '</ul>';
ポイント
WP_Query
で年度の期間内に投稿が存在するかどうか確認。posts_per_page
を1にして、存在チェックだけに限定し負荷を軽減。- 投稿があれば年度リンクを出力。
- 投稿がなければ何も表示しない。
まとめ
- 年度別アーカイブは暦年アーカイブと違い、区切り期間をカスタマイズ可能
- 投稿の存在する年度のみリンクを表示できる
- 最古投稿年を自動取得し、柔軟かつ将来の投稿にも対応可能
- 各年1件ずつidのみを取得するため、パフォーマンス的にも◯
参考コードまとめ
<?php
$oldest_post = get_posts(array(
'post_type' => '投稿またはカスタム投稿タイプ',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'ASC',
'fields' => 'ids',
));
if (!empty($oldest_post)) {
$start_year = (int)get_the_date('Y', $oldest_post[0]);
} else {
return;
}
$current_year = (int)date('Y');
echo '<ul class="year-list">';
for ($y = $current_year; $y >= $start_year; $y--) {
$after = "$y-04-01";
$before = ($y + 1) . "-03-31 23:59:59";
$query = new WP_Query(array(
'post_type' => '投稿またはカスタム投稿タイプ',
'posts_per_page' => 1,
'date_query' => array(array(
'after' => $after,
'before' => $before,
'inclusive' => true,
)),
'fields' => 'ids',
));
if ($query->have_posts()) {
echo '<li><a href="' . home_url('/投稿または投稿タイプのURLに合わせる/' . $y) . '">' . $y . '年度</a></li>';
}
wp_reset_postdata();
}
echo '</ul>';
?>
参考
WordPress の年別アーカイブを年度別(4月はじまり)にカスタマイズする方法。
WordPress 年別アーカイブリストの表示方法 - by Takumi Hirashima
wp_get_archives() – Function | Developer.WordPress.org