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_archivesがpost_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をそのまま使わせていただきました。
ありがとうございます。