カスタム投稿タイプを導入した際、サイドバーなどで特定のカテゴリー(カスタムタクソノミー)の一覧をどのように表示させるのか、迷うことはありませんか?
実は、標準のカテゴリーリスト表示関数であるwp_list_categories()に引数を一つ追加するだけで、この課題は簡単に解決できます。
カスタム投稿タイプに紐づいたカテゴリーリストを出力する最も簡単な方法
wp_list_categories()関数を使用し、taxonomy 引数で対象のスラッグを指定することです。WordPressの内部処理において、
wp_list_categories()は元々標準カテゴリー (category)だけでなく、あらゆるタクソノミーのターム(項目)リストを表示するために設計されています。この関数の第二引数として渡す連想配列に、’taxonomy’ => ‘カスタムタクソノミーのスラッグ’を追加することで、標準カテゴリーを無視し、指定したカスタムタクソノミーのタームのみを抽出できます。これにより、テーマファイルの記述がシンプルになりますし、将来的なメンテナンスコストも抑えられるでしょう。カスタムタクソノミーを指定した具体的なテンプレートコード例
たとえば、カスタム投稿タイプ「work」に対して、カスタムタクソノミー「work_cat」を設定していると仮定しましょう。この「work_cat」に属する全ターム(カテゴリー)を、投稿数(カウント)付きでリスト表示させるためのコードは以下の通りです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 制作実績(work_cat)のカテゴリーリストを出力するテンプレートコード <?php wp_list_categories( array( // リストのタイトル(デフォルトでは「Categories」など)を出力しない 'title_li' => '', // ★重要: 出力したいカスタムタクソノミーのスラッグを指定 'taxonomy' => 'work_cat', // タームに含まれる投稿数を表示 (1:表示, 0:非表示) 'show_count' => 1, // 投稿がないタームを非表示にする(任意) 'hide_empty' => 1 ) ); ?> |
wp_list_categories()関数の主要引数と応用
wp_list_categories()はカスタムタクソノミーのリスト表示において、非常にフレキシブルな制御が可能なのが特長です。覚えておくと便利な主要引数を一覧でまとめてみました。リストの見た目をサクッと変えたいときに、きっと役立ちますよ
タクソノミーの表示を制御する引数
| 引数名 | 設定値の例 | 効果・機能 |
|---|---|---|
taxonomy |
'work_cat' |
必須。表示したいカスタムタクソノミーのスラッグを指定します。 |
include |
'3, 5, 8' |
特定のタームIDのみをカンマ区切りで指定し、リストに含めます。 |
exclude |
'1, 2' |
特定のタームIDをリストから除外します。 |
depth |
1 |
階層表示の深さを指定します(0または1でトップレベルのみを表示)。 |
リストの表示形式を制御する引数
| 引数名 | 設定値の例 | 効果・機能 |
|---|---|---|
orderby |
'count' / 'name' |
タームを投稿数または名前でソートします。 |
order |
'DESC' / 'ASC' |
ソート順を降順または昇順に設定できます。 |
style |
'list' / 'none' |
listで<ul><li>形式、noneで<li>タグなしの表示になります。 |
これらの引数を組み合わせることで、例えば「投稿数の多い順に上位5件だけ表示する」といった、一歩進んだ動的なリスト表示も実現可能でしょう。
リストの表示結果をさらにカスタマイズしたいなら
wp_list_categories()は便利ですが、生成されるHTML構造は ul と li を基調とした決まった形になってしまいます。より自由度の高いHTMLでリストを構成したいWEBデザイナーの方もいるはずです。
その場合は、
get_terms()関数を利用して、直接データベースからタームの情報を取得し、その後はPHPの foreach ループを使ってマークアップを組み立てる方法がおすすめです。|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// get_terms()でターム情報を取得し、自由なマークアップで出力する例 <?php // 取得するタームの条件を指定 $args = array( 'taxonomy' => 'work_cat', 'orderby' => 'name', 'hide_empty' => true // 投稿がないタームは非表示 ); // ターム情報を取得 $terms = get_terms( $args ); // タームが存在する場合に処理 if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { echo '<div class="custom-term-list">'; // 取得したタームを一つずつ処理(ループ) foreach ( $terms as $term ) { // タームのスラッグとリンクURLを取得 $term_link = get_term_link( $term ); // 自由なHTML構造で出力 echo '<a href="' . esc_url( $term_link ) . '" class="term-item">'; echo '<span>' . esc_html( $term->name ) . '</span>'; echo '<span class="count">(' . esc_html( $term->count ) . ')</span>'; echo '</a>'; } echo '</div>'; } ?> |
get_terms() を使えば、リンクを div で囲んだり、リストではなくカード形式にしたりと、デザインの自由度がグンと向上するんです。
【まとめ】カスタムタクソノミーリストは怖くない!
カスタム投稿タイプのカテゴリーリスト表示は、wp_list_categories()関数のtaxonomy引数にスラッグを指定するだけで、ほとんどのケースで対応可能です。| 課題 | 最適な関数と引数 | 特徴 |
|---|---|---|
| シンプルにリスト表示したい | wp_list_categories( array('taxonomy' => 'スラッグ') ) |
簡単。HTML構造は固定されるが、投稿数の表示なども容易です。 |
| 複雑なデザイン・HTML構造にしたい | get_terms( array('taxonomy' => 'スラッグ') ) + foreach |
自由度が高い。全ての情報(ID、名前、スラッグなど)を取得できます。 |
まずはお手軽な
wp_list_categories()から試してみて、もしデザイン上の制約が出てきたらget_terms()へ移行するのが良い戦略でしょう。WordPressでのサイト構築が、少しでも楽になれば嬉しいです!


コメント