学校等のサイトを構築する際に必要になることがある年度別アーカイブ。Movable Type では FiscalYearlyArchives というプラグインを使って簡単に作成できましたが、今回 WordPress で作成する必要があり、いくつかの記事を参考にさせていただきながら構築できました。

まずは、年度別アーカイブリストの出力です。これはこちらの記事を参考にさせていただきました。
[WordPress] 年度別(4月から始まる)アーカイブリストを表示する | 制作メモ | 560DESIGNS

この記事で紹介されているコードを functions.php に記述しておき、<?php my_get_archives_by_fiscal_year(); ?> で年度別アーカイブリストを出力します。

続いて、年度別アーカイブページの作成。こちらは、サポートフォーラムの以下のトピックを参考にさせていただきました。
トピック: 年度別アーカイブは可能でしょうか? «  サポートフォーラム — WordPress

年別アーカイブは不要なので、年毎の表示を年度毎にそっくり入れ替えるこの方法で、年度別アーカイブページが生成できました。

そしてここからは、出力されたアーカイブタイトルなどの調整です。

まず、日付アーカイブページのタイトル。このままでは、年度別アーカイブが“2016”とだ表示されますので、2016年なのか2016年度なのかわかりませんので、これを“2016年度”と表示されるようにします。ついでに、月別アーカイブが“2017 3月”、日別アーカイブが“2017 3月 08”と表示されますので、これも“2017年3月”、“2017年3月8日”と表示されるようにします。

functions.php に以下を記述します。

function jp_date_wp_title( $title, $sep, $seplocation ) {
  if ( is_date() ) {
    $m = get_query_var('m');
    if ( $m ) {
      $year = substr($m, 0, 4);
      $month = intval(substr($m, 4, 2));
      $day = intval(substr($m, 6, 2));
    } else {
      $year = get_query_var('year');
      $month = get_query_var('monthnum');
      $day = get_query_var('day');
    }

    $title = ($seplocation != 'right' ? " $sep " : '').
      ($year ? $year . '年' : '').
      ($month ? $month . '月' : '').
      ($day ? $day . '日' : '').
      ($seplocation == 'right' ? " $sep " : '');
  }
  return $title;
 }
 add_filter( 'wp_title', 'jp_date_wp_title', 10, 3 );

そして、archive.php のタイトル出力部分を次のように記述します。

echo trim(wp_title('',false));
 if ( is_year() ){
  echo '度';
 }

次に、パンくずリスト。これはサイト全体で Breadcrumb NavXT プラグインを利用していますが、“2017年 > 3月 > 8日”のように、上位に年別、月別アーカイブのリンクが生成されます。1月から3月のアーカイブページの場合、年別のリンク先が翌年度になっていますので、4月以降の投稿がない場合、Not Found となってしまいます。

そこで、いっそのこと年別、月別のリンクを外して、年別アーカイブでは“2016年度”、月別アーカイブでは“2017年3月”、日別アーカイブでは“2017年3月8日”と表示されるようにしました。
(Breadcrumb NavXT の設定で、現在のページは <em>〜</em> で囲むようにしています)

if ( is_year() ){
  $fiscal_year = '<em>'. trim(wp_title('',false)). ‘度</em>';
  echo preg_replace('/<em>(.+)<\/em>/', $fiscal_year, bcn_display(true));
} elseif ( is_month() ){
  echo preg_replace('/<a[ -~]+date-year[ -~]+>(\d{4}年)<\/a> &gt; <em>(.+)<\/em>/', '<em>$1$2</em>', bcn_display(true));
} elseif ( is_day() ){
  echo preg_replace('/<a[ -~]+date-year[ -~]+>(\d{4}年)<\/a> &gt; <a[ -~]+date-month[ -~]+>(\d{1,2}月)<\/a> &gt; <em>(.+)<\/em>/', '<em>$1$2$3</em>', bcn_display(true));
} else {
  bcn_display();
}

これでほぼ思い通りの年度別アーカイブを作ることができました。