WordPress年別一覧表示について

こんにちは!今回、対応するにあたって年別一覧表示についていろいろ調べたので、備忘録としてブログに書こうと思います!

例えばターム別一覧などはよく出てくるのですが、年別は想像より複雑、最新の参考記事は少ない事を知りました。

①サブループで該当の記事の投稿年の一覧を取得

get_query_var()で値が取得できない?ページ種別ごとに有効な変数キーまとめ! | WEMO

上記の参考サイトのように「get_query_var(‘year’);」を使って、サブループで開いているページの年の投稿のみ取得できます。

例えば、下記ですと、drink-archive.phpに記載するとします。

drinkのすべての一覧のページです。

…/drink/

こちらでは、drinkで投稿した記事は2020年~2024年分あるとします。

…/drink/ですと、すべての年の投稿が表示されます。

        <?php
        $current_year = get_query_var('year');
        $args = array(
          'posts_per_page' => -1,
          'post_type' => 'drink',// カスタム投稿タイプの名称
          'post_status' => 'publish',
          'order' => 'DESC',
          'year' => $current_year, // 現在の年の投稿のみ取得
        );

        $post_query = new WP_Query($args);
        if ($post_query->have_posts()) :
          while ($post_query->have_posts()) : $post_query->the_post();
        ?>        
<?php
          endwhile;
        else :
          echo '投稿が見つかりませんでした。';
        endif;
        wp_reset_postdata();
        ?>

例えば、../drink/2024/のページでは、2024年に投稿した記事のみが表示されます。

②投稿した年の一覧

上記は投稿の一覧を表示させましたが、2020、2021、2022…と、投稿した年の一覧を表示させたい事もあります。年別にタブメニュー作成したり、サイドメニューに年別の一覧へのリンクを表示させるときに便利です。

<?php wp_get_archives(array('type' => 'yearly', 'post_type' => 'drink'));

下記に説明がわかりやすく掲載してありました。

【WordPress】カスタム投稿タイプの月別アーカイブまたは年別アーカイブが404になる場合の対応 | Code Memorandum (code-memorandum.com)

ただ、こちらで沼りまして。。

これが使えるのは調べた結果投稿タイプ別の一覧です。

ターム別ではこちら使えないようです。

参考サイトにも掲載されておりますが、URLの規則があることが原因と思います。

投稿タイプがdrinkの一覧表示は../drink/

2022年別一覧は../drink/2022

では、カスタム投稿drinkのタクソノミーcat-drinkのタームであるcolaでの年別一覧は?

../cat-drink/cola/がcolaの一覧ページです。

しかし、

../cat-drink/cola/2022はなく、404エラーとなります。

では、どうすればいいのでしょうか。

③ターム別で年別一覧を表示したいとき、年別の子ターム作成

もしかしたら、もっといい方法があるかもしれません。色々調べて実装しましたが、うまく表示されなかったのでタイトルの様にして実装しました。

ターム別の一覧表示は可能です。

そこで、colaタームを親として、子ターム2020、2021、2022…を作成。各投稿を2020年投稿ならcolaタームだけではなく、2020子タームにもチェックを入れました。

colaの子ターム2020年の一覧を表示することで、2020年の一覧を表示できました。

また、2025、2026と今後子タームを増やしたら、動的に一覧へ反映させるようにしたいと思いました。

taxonomy-cat-drink.phpに記載

2020、2021、2022…と、動的に投稿した年を取得し、一覧表示

つまり、今いるページのタームを取得(cola)

colaの子ターム名を取得(2020、2021、2022…)し、一覧表示

      <?php
      // 現在のタクソノミーページが "cat-drink" であるか確認
      if (is_tax('cat-drink')) {
        // 現在のタームを取得
        $current_term = get_queried_object();
        $termlink = get_term_link($current_term);
        // 現在のタームIDが○○であるか確認⇀IDを調べて○○へ入れてください
        if ($current_term->term_id == ○○) {
          // 子タームを取得
          $child_terms = get_terms(array(
            'taxonomy' => 'cat-drink', // カスタムタクソノミー名を指定
            'parent' => ○○, // 親タームIDを指定
          ));

          if (!empty($child_terms) && !is_wp_error($child_terms)) {
            // 配列を逆順に並べ替え
            $child_terms = array_reverse($child_terms);
            echo '<ul><li><a href="' . $termlink . '">すべて表示</a></li>';
            foreach ($child_terms as $term) {
              // タームのリンクを取得
              $term_link = get_term_link($term);

              if (!is_wp_error($term_link)) {
                // リンクを作成して表示
                echo '<li><a href="' . esc_url($term_link) . '">' . esc_html($term->name) . '</a></li>';
              } else {
                // リンク取得が失敗した場合は名前だけ表示
                echo '<li>' . esc_html($term->name) . '</li>';
              }
            }
            echo '</ul>';
          } else {
          }
        }
      }
      ?>

表示しているタームのページと同じ年に投稿した(2022年に投稿して、2022子タームにもチェックしているもの。つまりcolaの2022子タームの一覧)一覧を表示

        // 現在表示しているターム情報を取得
        $queried_object = get_queried_object();
        $term_slug = $queried_object->slug;

        $args = array(
          'posts_per_page' => -1,
          'post_type' => 'drink', // カスタム投稿タイプの名称
          'post_status' => 'publish',
          'order' => 'DESC',
          'tax_query' => array(
            array(
              'taxonomy' => 'cat-drink', // タクソノミースラッグを指定
              'field' => 'slug',
              'terms' => $term_slug, // 現在表示しているタームスラッグを指定
            )
          )
        );

        $post_query = new WP_Query($args);
        if ($post_query->have_posts()) :
          while ($post_query->have_posts()) : $post_query->the_post();
        ?>
            ループで表示したい内容記載
        <?php
          endwhile;
        else :
          echo '投稿が見つかりませんでした。';
        endif;
        wp_reset_postdata();
        ?>

(archive-drink.phpは①と②の方法を使い、カスタム投稿drinkでの年別一覧表示に使用します)

最後に

ChatGPTや、Colipotにも聞いて壁打ちして③の考えに至りました。

今備忘録としてまとめられてよかったです。言語化しようとすると、改めて複雑であることを把握しました。

もっといい方法もあるかもしれませんが、自身の備忘録として掲載しました。

もちろん、Wordpress仕様変わるなどして①~③のコードでは無理な場合も今後あるかもしれませんので、参考程度として記載し、振り返れるようにしておきたいと思います。

最後までお読みいただきありがとうございました!