WordPress

WordPress 年別アーカイブリストを表示する方法

WordPress 年別アーカイブリストを表示する方法

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

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

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

通常は wp_get_archives() を使うのが一般的ですが、この方法では表示される HTML タグをカスタマイズしたい場合い向いていません。
そこで、ちょっと強引ですが 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(); // クエリのリセット
}
?>

投稿の場合は 'post_type' => 'news',newspost に変更してください。
ループ中のif文の中で年を取得しているので、ループ中は同じ年を飛ばして次の年を取得します。
年の取得には非公開記事も含まれるため、非公開記事を除外したい場合は 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(); // クエリのリセット
}
?>

各投稿に入力されたカスタムフィールドの値が次のような 2018,2017,2018,2017 交互に値が入っている場合に対応するため、年度を配列に入れて、投稿の年度と比較して一覧を表示します。
年度のリンクはサイトに合わせて調整を加えてください。

まとめ

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

この記事をシェアする

合わせて読みたい関連記事