「年度別アーカイブ」を表示する方法

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

はじめに

WordPressの標準機能には「月別」や「年(1月〜12月)」のアーカイブは存在しますが、日本のビジネスや学校で広く使われる「年度(4月〜翌年3月)」区切りのアーカイブリストは用意されていません。

そこで、独自に年度別アーカイブと年度別投稿一覧を表示可能とします。

この記事では、この方法について説明します。

完成イメージ

使用方法

以下にショートコードを示します。

[my_fiscal_year_archives]

実装手順

以下のコードをfunctions.phpに追加します。
dynamic_sidebar_paramsフィルターを用いてクラスを付与し、Cocoonのアーカイブウィジェットと同じCSSを適用可能とします。

// ショートコードを追加
add_shortcode('my_fiscal_year_archives', function () {
  global $wpdb;

  // 投稿日の月をもとに年度を判定し、年度ごとの投稿数を集計
  $query = "
    SELECT 
      CASE 
        WHEN MONTH(post_date) IN (1, 2, 3) THEN YEAR(post_date) - 1
        ELSE YEAR(post_date)
      END AS fiscal_year,
      COUNT(ID) AS post_count
    FROM {$wpdb->posts}
    WHERE post_type = 'post' AND post_status = 'publish'
    GROUP BY fiscal_year
    ORDER BY fiscal_year DESC
  ";

  // 年度ごとの投稿数を取得
  $results = $wpdb->get_results($query);

  if (!$results) {
    return '<p>投稿がありません。</p>';
  }

  ob_start();
  ?>
  <div class="widget_archive">
    <ul>
      <?php foreach ($results as $row): ?>
        <?php
        $fy    = intval($row->fiscal_year);
        $count = intval($row->post_count);
        $url   = esc_url(add_query_arg('fiscal_year', $fy, home_url('/')));
        ?>
        <li>
          <a href="<?= $url; ?>">
            <span class="list-item-caption"><?= $fy; ?>年度</span>
            <span class="post-count"><?= $count; ?></span>
          </a>
        </li>
      <?php endforeach; ?>
    </ul>
  </div>
  <?php
  return ob_get_clean();
});


// 年度(fiscal_year)クエリ変数を登録
add_filter('query_vars', function ($vars) {
  $vars[] = 'fiscal_year';
  return $vars;
});


// 投稿クエリの取得条件を変更
add_action('pre_get_posts', function ($query) {
  if (is_admin() || !$query->is_main_query()) {
    return;
  }

  // URLパラメータから指定された年度を取得
  $fiscal_year = get_query_var('fiscal_year');

  // 年度が指定されていない場合は処理対象外
  if (!$fiscal_year) {
    return;
  }

  $fy = intval($fiscal_year);

  // 指定年度の4月1日から翌年3月31日までの期間を設定
  $date_query = [
    [
      'after'     => [
        'year'  => $fy,
        'month' => 4,
        'day'   => 1,
      ],
      'before'    => [
        'year'  => $fy + 1,
        'month' => 3,
        'day'   => 31,
      ],
      'inclusive' => true,
    ],
  ];

  // メインクエリに年度による日付の絞り込み条件を設定
  $query->set('date_query', $date_query);

  // WordPress標準の日付アーカイブ条件をクリア
  $query->set('year', '');
  $query->set('monthnum', '');

  // 年度アーカイブとして判定されるようクエリフラグを設定
  $query->is_archive = true;
  $query->is_date    = true;
  $query->is_year    = true;
  $query->is_home    = false;
});


// アーカイブタイトルを変更
add_filter('get_archive_chapter_title', function ($chapter_title) {
  $fiscal_year = get_query_var('fiscal_year');

  // 年度が指定されている場合はアーカイブタイトルを変更
  if ($fiscal_year) {
    $icon_font = '<span class="fa fa-calendar" aria-hidden="true"></span>';
    $chapter_title = $icon_font . esc_html($fiscal_year) . '年度';
  }

  return $chapter_title;
});

さいごに

今回紹介した方法を使えば、標準機能にはない「4月〜翌年3月」の年度区切りアーカイブを、システムへの負荷を最小限に抑えながら美しく実装することができます。
テーマ固有のCSSクラス(widget_archiveなど)をそのまま引き継じて外観を統一したい場合には非常に有効なアプローチです。

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