カスタム投稿の話。
完成イメージ
<h2>category01</h2>
<dl>
<dt>title</dt>
<dd>detail</dd>
<dt>title</dt>
<dd>detail</dd>
⋮
</dl>
<h2>category02</h2>
<dl>
<dt>title</dt>
<dd>detail</dd>
<dt>title</dt>
<dd>detail</dd>
⋮
</dl>
<h2>category03</h2>
<dl>
<dt>title</dt>
<dd>detail</dd>
<dt>title</dt>
<dd>detail</dd>
⋮
</dl>
「よくある質問」とかで見かけるやつ。
こんな感じ
カスタム投稿を「example」、タクソノミーを「example_cat」だとする。
<?php
$termArray = array();
$terms = get_terms('example_cat');
foreach( $terms as $term ){ array_push($termArray, $term->name);}
foreach($termArray as $term):
$args = array(
'posts_per_page' => -1,
'post_type' => 'example',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'example_cat',
'field' => 'slug',
'terms' => $term,
'operator' => 'IN'
),
)
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) :
?>
<h2><?php echo $term; ?></h2>
<dl class="faq_list">
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<dt><span><?php the_title(); ?></span></dt>
<dd><?php the_content(); ?></dd>
<?php endwhile; ?>
</dl>
<?php endif; wp_reset_postdata(); ?>
<?php endforeach; ?>
内容としては以下のとおり。
- タクソノミー「example_cat」に登録されたタームを取得して配列に突っ込む
- 配列化しなくてもいいっちゃいいけど、格納したほうが個人的に安心
- 配列をforeachで展開して、ターム毎の記事一覧を出力する
- タームに対して該当記事があったときだけ出力、該当記事のない場合はその枠自体を出力させない
通常の記事一覧と違うのは出力のための階層が1つ増えてるのと「tax_query」を使ってることだけ。
物凄くシンプル。
注意点
書いてて気がついた。
タームの表示名とスラッグが一緒だったらこれでいいんだけど、それぞれを指定してた場合にはダメ。
OK
表示名 :釣り
スラッグ:釣り
NG
表示名 :釣り
スラッグ:fishing
WPの仕様を無視して全角でスラッグが作れるもんだから、後めんどくさいから、いつも一緒にしてた。
“スラッグ” は URL に適した形式の名前です。通常はすべて半角小文字で、英数字とハイフンのみが使われます。
注釈ついてる割にこの通りにしなくてもいいっていうね。
- 汎用性を考えるなら表示名とスラッグをセットにした配列を作って要所々々で使用する
- 配列化せずに$term->nameと$term->slugを活用する
- tax_queryのfieldを「slug」から「name」に変更する
このどれかで対応する感じですね。
なお3つ目のnameに変更する方法に関して、全角じゃ無理だとかいう10年ほど前の記事を見つけたけど2025年現在、試したら普通に使えてる。
並びについて
タクソノミーの並びはタクソノミーの追加順(新→旧)になる。
並び替えしたい場合はプラグインを使って入れ替えたらいい。

Intuitive Custom Post Order
ドラッグ & ドロップで並べ替え可能な JavaScript を使って、直感的に項目 (投稿、ページ、カスタム投稿タイプ、カスタムタクソノミー、サイト) の順序を変えることができます。
記事一覧の並び替えは出力時のorderがどうのとか気をつけるポイントがあるけど、タクソノミーに関してはそういう設定が不要。楽ですね。
コメント