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

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

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

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

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

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

原因がわかったところで解決方法の紹介です。
カスタム投稿タイプのパーマリンク設定を「/%post_id%」のままでアーカイブページを表示するために、アーカイブページのURLを「example.com/news/2022」から「example.com/news/date/2022(dateを追加)」になるように調整します。

ただ、一般的にWordPress別アーカイブ一覧をする 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」を任意のスラッグに変更してください。

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

月別アーカイブ一覧を表示したい場合は、次のコードを追加します。
例えば、投稿タイプのスラッグが「news」の月別アーカイブ一覧の表示方法です。

<?php
// 月別アーカイブリストを表示
$post_type = 'news'; // ポストタイプを指定
$args = array(
'post_type' => $post_type,
'posts_per_page' => -1
);
$archive_query = new WP_Query( $args );
while ( $archive_query->have_posts() ) {
$archive_query->the_post();
$archive_list[ get_the_time( 'Y/n', $post->ID ) ][] = $post->post_title;
}
wp_reset_postdata();
if($archive_list):
?>
<ul>
<?php
foreach( $archive_list as $year_month => $archive ) :
$year_month_arr = explode( '/', $year_month );
?>
<li>
<a href="<?php echo home_url( '/', 'http' ).$post_type.'/date/'.$year_month; ?>">
<?php echo $year_month_arr[0].'年'.$year_month_arr[1].'月' ?> [<?php echo count( $archive ) ?>]</a>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>

まとめ

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