はじめに
以下の質問に回答します。
「アーカイブ」ウィジェットは、その年月に投稿された記事の一覧を表示する機能です。
たとえその月に投稿が1件しかなくても、デフォルトでは一覧表示が行われ、該当の投稿は直接開かれません。
そこで、この仕様を変更し、月を選択した際に、該当する月の最新投稿が直接表示されるようにします。
複数の投稿が存在する場合でも、最新投稿を自動的に開きます。
この記事では、この方法について説明します。
実装手順
以下の手順で実装します。
add_action('template_redirect', function () {
global $wp_query;
if (!is_month() || empty($wp_query->posts[0])) {
return;
}
// 最新の投稿URLを取得
$url = get_permalink($wp_query->posts[0]);
// 最新の投稿へリダイレクト
if ($url) {
wp_redirect($url);
exit;
}
});
補足
月アーカイブページのとき、デフォルトの年月一覧ページではなく、該当する月の最新投稿ページにリダイレクトさせます。
参考:独自のショートコードを用いる方法
使用方法
以下にショートコードを示します。
[my_archive_dropdown]
実装手順
以下のコードをfunctions.phpに追加します。
add_shortcode('my_archive_dropdown', function () {
$query = new WP_Query([
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'date',
'order' => 'DESC',
]);
if (!$query->have_posts()) {
return '<p>アーカイブがありません。</p>';
}
$archives = [];
while ($query->have_posts()) {
$query->the_post();
// 投稿の年と月を取得
$year = get_the_date('Y');
$month = get_the_date('m');
// 未登録の年月に投稿URLを登録
if (!isset($archives["$year-$month"])) {
$archives["$year-$month"] = get_permalink();
}
}
wp_reset_postdata();
ob_start();
?>
<form action="" method="get" id="month-archive-dropdown">
<select name="archive-dropdown" onchange="if (this.value) window.location.href=this.value;">
<option value="">月を選択</option>
<?php foreach ($archives as $year_month => $url) : ?>
<?php list($year, $month) = explode('-', $year_month); ?>
<option value="<?= esc_url($url); ?>">
<?= esc_html("{$year}年{$month}月"); ?>
</option>
<?php endforeach; ?>
</select>
</form>
<?php
return ob_get_clean();
});
さいごに
今回紹介した方法を使えば、「アーカイブ」ウィジェットを、年月別の投稿記事一覧を表示するのではなく、該当する月の最新の投稿ページを表示するように変更できます。
この変更により、その月に投稿が1件しかない場合でも、効率よく最新の投稿ページにアクセスできるようになります。

