年度別アーカイブリスト
「・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>
