「アーカイブ」ウィジェットで選択した月の最新投稿ページを表示する方法

Cocoonカスタマイズ集
この記事は約4分で読めます。
記事内に広告が含まれています。

はじめに

以下の質問に回答します。

「アーカイブ」ウィジェットは、その年月に投稿された記事の一覧を表示する機能です。
たとえその月に投稿が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件しかない場合でも、効率よく最新の投稿ページにアクセスできるようになります。

タイトルとURLをコピーしました