WordPress 年別・年度別記事一覧の表示方法

WordPress 年別・年度別記事一覧の表示方法

WordPress で年別・年度別記事一覧の表示方法を紹介します。
例えば、企業や学校で年度別の、沿革やリリース情報を表示したいときに便利な方法です。

  1. 年別の月別記事一覧を表示
    1. 新着記事に New マークを表示
  2. 年度別記事一覧を表示

年別の月別記事一覧を表示

まずは年別の月別記事一覧を表示する方法を紹介します。
例えば、カスタム投稿タイプのスラッグが campaign の場合に、年別の月別アーカイブを表示するには、次のコードを archive.php などに追加してください。
投稿の配列には「投稿日」「URL」「タイトル」「ID」を加えています。そのほかに必要な項目があれば、24行目あたりの配列の項目の記述に、任意の項目を追加してください。

<?php // 投稿の取得
foreach((get_post()) as $date) { // 最新記事の年を取得
$postsYear = date('Y',get_post_time());
break ;
}
$myPosts = get_posts( array(
'post_type' => 'campaign', // 任意のポストタイプを指定
'posts_per_page' => -1, // 最大投稿数の指定
'date_query' => array(
array(
'year' => $postsYear,
),
),
));
$monthlyPosts = array(); // 初期設定用の配列(月別の連想配列を入れる)
?>
<?php if( !empty( $myPosts )): // 投稿があれば表示 ?>
<?php
foreach( $myPosts as $post ):
setup_postdata( $post );
$date = get_post_time('m月'); // この値が月の表示
// 既に年月用の配列はあるので、該当する月の配列に入れていく
$monthlyPosts[$date][get_the_ID()] = array(
'time' => get_post_time('Y.m.d'), // 記事の時間
'url' => esc_url( apply_filters('the_permalink',get_permalink())), // 記事のURL
'title' => esc_html( get_the_title()), // 記事のタイトル
'id' => esc_html( get_the_ID()), // 記事のID
);
$monthlyPlus = array('12月'=>array(),'11月'=>array(),'10月'=>array(),'09月'=>array(),'08月'=>array(),'07月'=>array(),'06月'=>array(),'05月'=>array(),'04月'=>array(),'03月'=>array(),'02月'=>array(),'01月'=>array());
endforeach;
?>
<?php $monthlyPosts = $monthlyPosts + $monthlyPlus; ?>
<?php krsort($monthlyPosts); // 配列をキーで逆順にソートする ?>
年別リンク
<ul>
<?php wp_get_archives('type=yearly&post_type=campaign'); ?>
</ul>
月別ページ内リンク
<ul>
<?php $x=1; foreach( $monthlyPosts as $title => $monthlyPost ): // 月別ページ内リンクを表示 ?>
<?php if(!empty($monthlyPost)): ?>
<li><a href="#monthly<?php echo $x; ?>"><?php echo $title; ?></a></h3>
<?php else: ?>
<li><?php echo $title; ?></h3>
<?php endif; ?>
<?php $x++; endforeach; ?>
</ul>
月別記事一覧
<ul>
<?php $x=1; foreach( $monthlyPosts as $title => $monthlyPost ): //月別記事一覧を表示 ?>
<?php if(!empty($monthlyPost)): ?>
<li id="monthly<?php echo $x; ?>"><h3><?php echo $title; ?></h3>
<ul>
<?php foreach( $monthlyPost as $list ) : ?>
<li><?php echo $list['time']; ?>
<a href="<?php echo $list['url']; ?>">
<?php // サムネイルを表示
echo $thumb = get_the_post_thumbnail( $list['id'], 'thumbnail' );
?>
<?php echo $list['title']; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</li>
<?php endif; ?>
<?php $x++; endforeach; ?>
</ul>
<?php else: // 該当する年度に投稿がない場合 ?>
本年度の記事はありません
<?php endif; ?>

投稿タイプを変更するにはコード内の post_type を任意のポストタイプに変更してください。
年別リンクの表示には wp_get_archives を使用していますが、ここでも投稿タイプの指定をしているため、投稿タイプを変更するときは合わせてこの部分も変更してください。

新着記事に New マークを表示

新着記事に NEW マークを付与したい場合、当サイトが紹介しているWordPress 新着記事に New マークを表示する方法だと、日付の型が一部違うため表示がうまくいきません。そのため、紹介したソースコードの二箇所に以下のコードを追加して対応します。

紹介コード23行目に「NEW用の比較時間を取得」を追加します。

-- 省略 --
$monthlyPosts[$date][get_the_ID()] = array(
'time' => get_post_time('Y.m.d'), // 記事の時間
// ↓1行を追加
'new' => get_post_time('U'), // NEW用の比較時間を取得
// ↑1行を追加
'url' => esc_url( apply_filters('the_permalink',get_permalink())), // 記事のURL
'title' => esc_html( get_the_title()), // 記事のタイトル
);
-- 省略 --

次に、紹介コード57行目の投稿の一覧の出力箇所に、次のコードの必要な部分を追加してください。

-- 省略 --
<li>
<?php echo $list['time']; ?>
<?php // 新着記事に New マークを表示
$days = 30; // New を表示させたい期間の日数
$today = date_i18n('U'); // 現在の日付を取得
$entry = $list['new']; // 現在の投稿の時刻を取得
$total = date('U',($today - $entry)) / 86400 ; // 秒数指定 86400 は1日
if( $days > $total ){
echo 'New'; // Newを表示
}
?>
<a href="<?php echo $list['url']; ?>"><?php echo $list['title']; ?></a>
</li>
-- 省略 --

現在の投稿の時刻を取得を最初に追加したコードから取得。その値を元にNEWの表示を行います。

年度別記事一覧を表示

最初に紹介した方法は「年別」でしたが、学校サイトなどでは「年度別」で表示させたい場合もあるかと思います。
そこで「年別」を「年度別」に変更するためには date_query を使って、取得したい期間(4月から翌年の3月など)を細かく指定して、年度別記事一覧を表示します。
次のコードを、最初に紹介したコードの $myPosts の部分と差し替えます。

...省略...
$myPosts = get_posts( array(
'post_type' => 'post', // 任意のポストタイプを指定
'posts_per_page' => -1, // 最大投稿数の指定
'date_query' => array(
array(
'after' => array(
'year' => $postsYear-1, // 去年の年
'month' => 4,
'day' => 1,
),
'before' => array(
'year' => $postsYear, // 現在の年
'month' => 3,
'day' => 31,
),
'inclusive' => true,
),
),
));
...省略...

紹介してコードはこのままだと、1〜3月と4〜12月で表示内容が異なってしまいます。
そこで、現在の日付を基準にて取得内容を切り替える必要があります。
次のコードを、最初に紹介したコードの投稿の取得部分と差し替えてください。


<?php // 投稿の取得
foreach((get_post()) as $date) { // 最新記事の年月日を取得
$postsYear = date('Y',get_post_time()); // 最新記事の年を取得
$postsDate = date('Ymd',get_post_time()); // 最新記事の月を取得
break ;
}
$base_time = $postsYear.'0401'; // 比較用の年月
if( $base_time <= $postsDate || is_year() ) { // 4月以降なら 又は 年別アーカイブページなら
$myPosts = get_posts( array(
'post_type' => 'post', // 任意のポストタイプを指定
'posts_per_page' => -1,
'date_query' => array(
array(
'after' => array(
'year' => $postsYear, // 現在の年
'month' => 4,
'day' => 1,
),
'before' => array(
'year' => $postsYear + 1, // 来年の年
'month' => 3,
'day' => 31,
),
'inclusive' => true,
),
),
));
} else { // 4月以前なら
$myPosts = get_posts( array(
'post_type' => 'post', // 任意のポストタイプを指定
'posts_per_page' => -1,
'date_query' => array(
array(
'after' => array(
'year' => $postsYear - 1, // 去年の年
'month' => 4,
'day' => 1,
),
'before' => array(
'year' => $postsYear, // 現在の年
'month' => 3,
'day' => 31,
),
'inclusive' => true,
),
),
));
$postsYear = $postsYear - 1; // 見出しように年度を取得
}
$monthlyPosts = array(); // 初期設定用の配列(月別の連想配列を入れる)
?>
...以下省略...

年別アーカイブページでも archive.php を使う場合には、日付による分岐が不要になるので、日付の分岐部分にis_year() を加えています。

まとめ

WordPress で年別の月別記事一覧を表示する方法を紹介しました。