広告

WordPressで年度別一覧を作ったらハマった

この記事は約7分で読めます。

WordPressで年別なら、下記の方法でアーカイブリスト(一覧)が作れます。

でも年度別はできません

<?php
$args = array(
  'type'            => 'yearly',
  'limit'           => '',
  'format'          => 'html',
  'before'          => '',
  'after'           => '',
  'show_post_count' => false,
  'echo'            => 1,
  'order'           => 'DESC',
  'post_type'       => 'news',
);
wp_get_archives( $args );

また、カスタム投稿の複数指定はできません

wp_get_archivespost_typeの配列を受け入れないので。

色々とテストしたけど、どれもダメ。。。

結果、カスタム投稿を辞めて、投稿+カテゴリにしました。

結論:固定ページを使う

通常アーカイブで使うテンプレート archive.php date.php などではダメ。

4月切り替えの年度で、2020年4月~12月までの記事がなく、2021年1月~3月までの記事のみある場合、404エラーになるから。

まず、本文なしの固定ページ(スラッグnews)を作って、固定ページ用のテンプレートを作ります。

page.php やら index.php ですね。

そこに、下記をぶち込みます。

// 表示中の年を入れる.
$years = null;

// URLのgetから呼び出す年度をget.
if ( isset( $_GET['ye'] ) ) {
  $years = intval( $_GET['ye'] );
} else {
  // 今日の年を整数にして入れる.
  $years       = intval( date_i18n( 'Y' ) );
  // 今日の月を整数にして入れる.
  $today_month = intval( date_i18n( 'm' ) );
  // 3月までは前年に戻す
  if ( 4 > $today_month ) {
    $years = ( $years - 1);
  }
}

echo '<div>' . esc_html( $years ) . '年度</div>';

// 翌年を定義.
$next_y = ( $years + 1 );

$args = array(
  'post_type'      => 'post',
  // 公開されたものだけ表示.
  'post_status'    => array( 'publish' ),
  // 1ページに含める投稿数(-1を指定すると全投稿を表示)
  'posts_per_page' => -1,
  // 昇順'ASC'、降順'DESC'.
  'order'          => 'DESC',
  // 投稿順に表示.
  'orderby'        => 'date',
  'date_query'     => array(
    array(
      'after'     => array(
        // その年の4/1から.
        'year'  => $years,
        'month' => 4,
        'day'   => 1,
      ),
      'before'    => array(
        // 翌年の3/31まで.
        'year'  => $next_y,
        'month' => 3,
        'day'   => 31,
      ),
      'inclusive' => true,
      'compare'   => 'BETWEEN',
    ),
  ),
);
// クエリ定義.
$the_query = new WP_Query( $args );
// ループ.
if ( $the_query->have_posts() ) {
  while ( $the_query->have_posts() ) {
    $the_query->the_post();
    // ループ内記述 この例では別ファイルを用意して読み込み.
    include __DIR__ . '/card/card-news.php';
  }
} else {
  echo '<p>お知らせはありません。</p>';
}
// ループ終わり.
// 投稿データのリセット.
wp_reset_postdata();

// ここから年度別一覧.
<ul>
<?php
$archives = get_archives_by_fiscal_year();
foreach ( $archives as $archive ) {
  // https://aw1.jp/wordps/news/?ye=表示年 というようなリンクをつくります
  ?>
<li><a href="<?php echo esc_url( get_home_url( null, '/news' ) ) . '/?ye=' . esc_html( $archive->year ); ?>"><img src="<?php echo esc_url( get_home_url( null, '/img/menu_o.svg' ) ); ?>"><?php echo esc_html( $archive->year ); ?>年度</a></li>
  <?php
}
?>

</ul>

注意!

WordPressのGETパラメータに引っかかるので、リンクを~~/?year=2021 のようにすると、エラーになります。

なので~~/?ye=2021にしました。

function.php に入れ込むもの

上のコードにある

get_archives_by_fiscal_year

これの定義をfunction.phpでします。

/**
 * 年度別アーカイブリスト
 *
 *  @param string $args .
 */
function get_archives_by_fiscal_year( $args = '' ) {
  global $wpdb, $wp_locale;
  $defaults = array (
    'post_type'       => 'post',
    'limit'           => '',
    'format'          => 'html',
    'before'          => '',
    'after'           => '',
    'show_post_count' => false,
    'echo'            => 1,
  );
  $rrr      = wp_parse_args( $args, $defaults );
  extract ( $rrr, EXTR_SKIP );
  if ( '' !== $limit ) {
      $limit = absint( $limit );
      $limit = ' LIMIT ' . $limit;
  }
  $arcresults = (array) $wpdb->get_results(
    "SELECT YEAR(ADDDATE(post_date, INTERVAL -3 MONTH)) AS `year`, COUNT(ID) AS `posts`
    FROM $wpdb->posts
    WHERE post_type = '$post_type' AND post_status = 'publish'
    GROUP BY YEAR(ADDDATE(post_date, INTERVAL -3 MONTH))
    ORDER BY post_date DESC
    $limit"
  );
  return $arcresults;
}

これはhttps://www.webopixel.net/wordpress/871.htmlをそのまま使わせていただきました。

ありがとうございます。