WordPress カスタム投稿タイプで日付別アーカイブページが表示されない時の対処方法

WordPress カスタム投稿タイプで年別や月別の日付別アーカイブページが表示されない時の対処方法を紹介します。
例えば、カスタム投稿タイプのパーマリンク設定を「/%post_id%」にしている時に便利な方法です。

  1. カスタム投稿タイプで月別アーカイブが表示されない原因
  2. カスタム投稿タイプで月別アーカイブを表示する方法

カスタム投稿タイプで年別アーカイブが表示されない原因

カスタム投稿タイプのパーマリンク設定を「/%post_id%」にしていると、日付アーカイブページが表示されない場合があります。
原因は、「/%post_id%」指定で記事を作ると、記事URLが「例)example.com/news/1980」となり、日付別アーカイブと投稿ページとの判別できなくなるため、アーカイブページが表示されません。

カスタム投稿タイプで年別アーカイブを表示する方法

原因がわかったところで、カスタム投稿タイプのパーマリンク設定を「/%post_id%」のままでアーカイブページを表示するために、アーカイブページのURLを「example.com/news/2022」から「example.com/news/date/2022」と間に date を追加して対応します。
ただ、wp_get_archives 関数をこのようにカスタマイズするのは面倒なので、少し強引ですが専用のサブループを作って、年別アーカイブ一覧を作成します。
次のコードは、投稿タイプのスラッグが「news」の年別アーカイブ一覧の表示方法です。

<?php // 年別アーカイブリストを表示
$year=NULL; // 年の初期化
$args = array( // クエリの作成
'post_type' => 'news', // 投稿タイプの指定
'orderby' => 'date', // 日付順で表示
'posts_per_page' => -1 // すべての投稿を表示
);
$the_query = new WP_Query($args); if($the_query->have_posts()){ // 投稿があれば表示
while ($the_query->have_posts()): $the_query->the_post(); // ループの開始
if ($year != get_the_date('Y')){ // 同じ年でなければ表示
$year = get_the_date('Y'); // 年の取得
echo '<a href"'.home_url( '/', 'http' ).'news/date/'.$year.'">'.$year.'年</a>'; // 年別アーカイブリストの表示
}
endwhile; // ループの終了
wp_reset_postdata(); // クエリのリセット
}
?>

投稿タイプ「news」とリンクのURLの「news」を任意のスラッグに変更してください。

まとめ

WordPress カスタム投稿タイプで日付別アーカイブが表示されない時の対処方法を紹介しました。