WordPressには、デフォルトで「アーカイブ」というウィジェットが用意されていますが、アーカイブウィジェットでは月別のアーカイブが表示されます。
更新頻度がそんなに高くなく、月別ではなく年別でアーカイブのリストを表示したいこともあるかと思います。そんな時のために、年別アーカイブのリストを表示させる方法をご紹介したいと思います。
WordPressで年別アーカイブのリストを表示する方法
まず、functions.phpに以下を追加します。
function get_archives_by_year( $args = '' ) {
global $wpdb, $wp_locale;
$defaults = array (
'post_type' => 'post', //投稿タイプ
'limit' => '',
'format' => 'html',
'before' => '',
'after' => '',
'show_post_count' => false,
'echo' => 1
);
$parse = wp_parse_args( $args, $defaults );
extract ( $parse, EXTR_SKIP );
if ( '' != $limit ) {
$limit = absint( $limit );
$limit = ' LIMIT ' . $limit;
}
$arcresults = (array) $wpdb->get_results(
"SELECT YEAR(ADDDATE(post_date, INTERVAL -3 MONTH)) AS `year`, COUNT(ID) AS `posts`
FROM $wpdb->posts
WHERE post_type = '$post_type' AND post_status = 'publish'
GROUP BY YEAR(ADDDATE(post_date, INTERVAL -3 MONTH))
ORDER BY post_date DESC
$limit"
);
return $arcresults;
}
「post_type」で表示したい投稿タイプを指定します。
年別アーカイブを表示させたい箇所に、以下コードを記述します。
<ul class="year-archives-list"> <?php $archives = get_archives_by_year(); foreach($archives as $archive): ?> <li> <a href="<?php echo home_url() ?>/archives/date/<?php echo esc_html($archive->year) ?>"><?php echo esc_html($archive->year) ?>年</a> </li> <?php endforeach; ?> </ul>
「/archives/date/」のところは、パーマリンク設定に合わせて変更してください。上記は、パーマリンク設定を「/archives/%post_id%」にしている場合の例です。
あとがき
あまり需要ないかもですが、標準の月別アーカイブではなく年別のアーカイブリストを表示させたい場合は、ぜひ参考にしてください。


はじめまして。
参考させていただいています!
素朴な質問ですが、URLに、date をはずしてはいけないでしょうか。
はずしたら動かなくなりました。。
コメントありがとうございます。
年別(月別も)アーカイブページのURLは、パーマリンク設定によって変わります。
パーマリンク設定が”数字ベース”になっている場合は、年別アーカイブページのURLは「/archives/date/2019」のようになります。パーマリンク設定が”基本”だった場合は「/?m=2019」、その他は単純に「/2019」のように年数のみになります。
URLの指定でdateを外したら動かなくなったということは、dateがあれば動くということでしょうか。そうであれば、パーマリンク設定が数字ベースになっていると思います。
こんばんは。コピーさせていただきました、ありがとうございます。
年別のアーカイブを作成できたのですが、投稿の作成年が今年だけなので、2021年の表示だけ出ていますが、2020年など2つ以上の年が存在した場合どのように表示されますでしょうか?
自分はコンボボックスのような形で表示させたいので、気になりました。
よろしくお願い致します。
記事内で紹介しているのはulリストでリンクを表示する方法です。
コンボボックス/セレクトボックスでの表示をされたいということでしたら、コードのカスタマイズが必要ですね。
こちらの記事が参考になるかと思います。