こんにちは!今回、対応するにあたって年別一覧表示についていろいろ調べたので、備忘録としてブログに書こうと思います!
例えばターム別一覧などはよく出てくるのですが、年別は想像より複雑、最新の参考記事は少ない事を知りました。
①サブループで該当の記事の投稿年の一覧を取得
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仕様変わるなどして①~③のコードでは無理な場合も今後あるかもしれませんので、参考程度として記載し、振り返れるようにしておきたいと思います。
最後までお読みいただきありがとうございました!