WordPress 年別アーカイブリストの表示方法

WordPress 年別アーカイブリストの表示方法

WordPress で年別アーカイブリストを表示する方法を紹介します。
例えば、企業や学校のお知らせページで、年別アーカイブリストを表示したい時に便利な方法です。

  1. 年別のアーカイブリストの表示方法
  2. 投稿のカスタムフィールド値を元に年別リストを表示する方法

年別のアーカイブリストの表示方法

年別アーカイブリストの表示には wp_get_archives() を使うのが一般的ですが、
出力される HTML タグを細かくカスタマイズしたい時もあると思います。
wp_get_archives() を使った出力方法は WordPress 月別アーカイブ一覧の表示方法 を参照してください。

そこで、WP_Query を使った、ちょっと強引な年別アーカイブリストを作成する方法を紹介します。
次のコードは、カスタム投稿のスラッグが news の場合の年別アーカイブリストの表示方法です。

<?php // 年別アーカイブリストを表示
$year=NULL; // 年の初期化
$args = array( // クエリの作成
'post_type' => 'news', // 投稿タイプの指定
'orderby' => 'date', // 日付順で表示
'posts_per_page' => -1 // すべての投稿を表示
);
$the_query = new WP_Query($args); if($the_query->have_posts()){ // 投稿があれば表示
echo '<ul class="year-list">';
while ($the_query->have_posts()): $the_query->the_post(); // ループの開始
if ($year != get_the_date('Y')){ // 同じ年でなければ表示
$year = get_the_date('Y'); // 年の取得
echo '<li><a href="'.home_url( '/', 'http' ).'news/'.$year.'">'.$year.'年</a></li>'; // 年別アーカイブリストの表示
}
endwhile; // ループの終了
echo '</ul>';
wp_reset_postdata(); // クエリのリセット
}
?>

ループ中のif文の中で年を取得しているので、ループ中は同じ年を飛ばして次の年を取得します。

投稿タイプを変更する場合は 'post_type' => 'news',newspost や任意の投稿タイプに変更してください。
年の取得には非公開記事も含まれるため、非公開記事を除外したい場合はクエリの作成で post_status を追加して publish を指定しましょう。

メリット

・表示をカスタマイズできる
・リンクを調整できる

この方法のメリットは、表示をカスタマイズできる点にあります。HTML をリスト形式以外で出力したい時にも適しています。

デメリット

・指定の投稿タイプを全て確認するため余計な処理が走る
・順番並び替え系プラグインを使っているとうまく表示できない場合がある

例えば、投稿の順番を並び替えるプラグインを使用している場合には注意が必要です。
順番を投稿年でソートしていない場合、例えば各投稿の投稿年が2019年・2018年・2020年のように並ぶと、その順番通りの表示になってしまい、紹介したている方法ではうまく表示されません。

こういった場合はプラグインを無効化するか、WordPress プラグインの Intuitive Custom Post Order を使って、任意の投稿タイプだけを並び替えが有効になるようにしてください。
もしくは、次に紹介しているカスタムフィールド値で表示するほうほうで使用している、値を配列に入れて照合する方法を組み込んでみてください。

投稿のカスタムフィールド値を元に年別リストを表示する方法

イレギュラーなケースですが、カスタムフィールドに入力された日付の値を見て、年別一覧を表示する方法を紹介します。
例えば、投稿タイプが news で、投稿にカスタムフィールド値「公開日」が設定されている場合の表示方法です。

<?php // 投稿のカスタムフィールド値を元に年別リストを表示する方法
$year = NULL; // 年の初期化
$args = array( // クエリの作成
'post_type' => 'news', // 投稿タイプの指定
'orderby' => 'date', // 日付順で表示
'posts_per_page' => -1 // すべての投稿を表示
);
$the_query = new WP_Query($args); if($the_query->have_posts()){ // 投稿があれば表示
while ($the_query->have_posts()): $the_query->the_post(); // ループの開始
$date = get_field('公開日', false, false); // カスタムフィールド値の取得
$date = new DateTime($date); // 日付オブジェクトの作成
$date = $date->format('Y'); // 日付の表示
if (!in_array($date, $year)){ // 配列内に同じ年がなければ表示
echo '<li><a href="'.home_url( '/', 'http' ).'xxx">'.$date.'年度一覧</a></li>'; // 年別アーカイブリストの表示
}
$year[] = $date; // 配列に年を追加
endwhile; // ループの終了
wp_reset_postdata(); // クエリのリセット
}
?>

紹介しているコードはカスタムフィールドプラグイン ACF を使用している場合の取得方法です。
ACFを使用していない場合は get_field() の部分を get_post_meta() などに変更してください。

各投稿に入力されたカスタムフィールドの値が次のような 2018,2017,2018,2017 交互に値が入っている場合に対応するため、年度を配列に入れて、投稿の年度と比較して一覧を表示します。

年度のリンク部分はサイトよって形式が違う場合がありますので、自身のサイトに合わせて適宜調整を加えてください。

まとめ

WordPress で年別アーカイブリストを表示する方法を紹介しました。