年度別アーカイブリスト
「・2014年度・2013年度・・・」のリンクの表示ですね。
最初に「functions.php」に下記を追加して。
functions.php
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 ); $r = wp_parse_args( $args, $defaults ); extract ( $r, 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; }
あとは「sidebar.php」とか表示したい部分に下記を追加します。
sidebar.php
<ul> <?php $archives = get_archives_by_fiscal_year(); foreach($archives as $archive): ?> <li><a href="<?php echo home_url() ?>/date/<?php echo esc_html($archive->year) ?>"><?php echo esc_html($archive->year) ?>年度</a></li> <?php endforeach; ?> </ul>
この部分は下記サイトを参考(というかそのままです)にさせていただきました。
[WordPress] 年度別(4月から始まる)アーカイブリストを表示する | 制作メモ | 560DESIGNS
年度別記事一覧
先ほどのアーカイブリストのリンク先は「/date/2013」という感じになっいて、アクセスすると2013年4月から2014年3月までの投稿を表示するようにしてみます。
とりあえず「archive.php」に下記を記述します。
archive.php
<?php $year = get_query_var('year'); $args = array( 'post_status' => 'publish' ); if ($year) { $start_date = $year.'/4/1'; $end_date = ($year+1).'/3/31 23:59:59'; $args += array('date_query' => array ( 'compare' => 'BETWEEN', 'after' => $start_date, 'before' => $end_date, 'inclusive' => true )); } $query = new WP_Query($args); echo '<table>'; if ($query->have_posts()) : while ($query->have_posts() ) : $query->the_post(); ?> <tr> <th><span><?php echo get_the_date('Y.m.d'); ?></span></th> <td><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></td> </tr> <?php endwhile; endif; echo '</table>'; wp_reset_query(); ?>
これで基本的には表示できるのですが、「archive.php」で作成すると問題があります。
たとえば「2012年2月」は「/date/2011」に表示されますが、「2011年」の記事がない場合、本来の年の処理が優先されて「404.php」や「index.php」などが優先して読み込まれます。
フックとかを使えば対応できそうな気がしますが、独立したPHPファイルを作成して、$yearの部分をURLから引っ張ってきた方が早いかもしれません。
$year = if (isset($_GET['year'])) intval($_GET['year']);
リンク部分
<li><a href="<?php echo home_url() ?>/hoge.php?year=<?php echo esc_html($archive->year) ?>"><?php echo esc_html($archive->year) ?>年度</a></li>