サイドバーやフッターに「カテゴリー一覧」をリンク付きで並べたいとき、WordPress では wp_list_categories() を使うと数行で実現できます。投稿数の表示、空カテゴリーの除外、並び順の指定なども引数だけで切り替えられるので、テンプレートを大きく書き換えずに見た目を整えられます。この記事では、wp_list_categories() の基本的な使い方から、よく使う引数の意味、デフォルトの見出しを消す書き方、サイドバーやテンプレートでの実用例までを、実際に動くコードで解説します。最後に get_categories() との違いにも軽く触れます。
目次
wp_list_categories で何ができるか
wp_list_categories() は、サイトに登録されているカテゴリーを、それぞれのカテゴリーアーカイブへのリンク付きで一覧出力するテンプレートタグです。出力は <li> 要素の並びで、各項目が <a> でカテゴリーページにリンクされます。デフォルトでは「カテゴリー」という見出しの <li> でラップされた入れ子リストとして出力されるため、<ul> で囲むだけでナビゲーションとして使えます。
カテゴリーは親子関係(階層)を持てますが、wp_list_categories() は標準でこの階層を入れ子のリストとして表現してくれます。投稿数の表示や並び順、特定カテゴリーの除外といった調整も、すべて引数で指定できるのが特徴です。HTMLを自分で組み立てる必要がなく、テーマのテンプレートに1回呼び出すだけでカテゴリーメニューが完成します。
基本の使い方
もっとも単純な使い方は、引数なしで wp_list_categories() を呼び出すことです。ただし、出力は <li> 要素の列なので、<ul> で囲って使います。次の例はサイドバー用テンプレート sidebar.php での記述です。
<ul>
<?php wp_list_categories(); ?>
</ul>
これだけで、次のような入れ子のリストが出力されます。デフォルトでは先頭に「カテゴリー」という見出しの <li> が付き、その中に各カテゴリーの <ul> がぶら下がる構造になります。
<ul>
<li class="categories">カテゴリー
<ul>
<li class="cat-item cat-item-3"><a href="https://example.com/category/news/">お知らせ</a></li>
<li class="cat-item cat-item-5"><a href="https://example.com/category/blog/">ブログ</a></li>
</ul>
</li>
</ul>
各 <li> には cat-item とカテゴリーIDを含むクラスが付くので、CSSでの装飾もしやすくなっています。先頭の「カテゴリー」という見出しが不要な場合は、後述する title_li 引数で消せます。
引数で表示をカスタマイズする
wp_list_categories() は、引数に連想配列を渡すことで表示を細かく調整できます。よく使う引数と、その意味・既定値を次の表にまとめました。
| 引数 | 既定値 | 説明 |
|---|---|---|
title_li | __( 'Categories' ) | リスト全体を囲む見出し <li> のテキスト。空文字 '' にすると見出しと外側の <li> を出力しない |
show_count | 0(false) | 1 にすると各カテゴリー名の後ろに投稿数を表示する |
hide_empty | 1(true) | 1 なら投稿が0件のカテゴリーを表示しない。0 で空のカテゴリーも表示する |
orderby | 'name' | 並び替えの基準。name(名前)・id・count(投稿数)・slug など |
order | 'ASC' | 並び順。ASC(昇順)または DESC(降順) |
exclude | なし | 表示しないカテゴリーのIDを指定する(カンマ区切りの文字列または配列) |
include | なし | 表示するカテゴリーのIDだけを指定する。指定すると exclude は無視される |
child_of | 0 | 指定したカテゴリーIDの子孫だけを表示する |
depth | 0 | 表示する階層の深さ。0 は無制限、1 はトップレベルのみ。負の値で階層を無視してフラット表示 |
hierarchical | 1(true) | 1 なら親子を入れ子で表示。0 なら階層を無視してフラットに並べる |
echo | 1(true) | 1 ならその場で出力。0 にすると出力せずHTML文字列を返す |
taxonomy | 'category' | 対象のタクソノミー。カスタムタクソノミーの一覧を出すときに指定する |
引数は連想配列のほか、'show_count=1&orderby=count' のようなクエリ文字列形式でも渡せますが、可読性の高い連想配列での指定をおすすめします。次の例は、投稿数を表示し、投稿数の多い順に並べる指定です。
<ul>
<?php
wp_list_categories( array(
'show_count' => 1, // カテゴリー名の後ろに投稿数を表示
'orderby' => 'count', // 投稿数を基準に並べる
'order' => 'DESC', // 多い順(降順)
) );
?>
</ul>
show_count => 1 を指定すると、「ブログ (12)」のように投稿数が括弧付きで添えられます。orderby と order を組み合わせることで、人気カテゴリーを上に出すといった並び替えも簡単に実現できます。
デフォルトの見出しを消す
引数なしで呼び出すと、先頭に「カテゴリー」という見出しの <li> が付きます。テーマ側ですでに「カテゴリー」という見出しを用意している場合など、この見出しが邪魔になることがあります。そんなときは title_li に空文字を渡すと、見出しと外側のラップ用 <li> がなくなり、各カテゴリーの <li> だけがフラットに出力されます。
<h2>カテゴリー</h2>
<ul>
<?php
// 見出しの li を出力しない
wp_list_categories( array(
'title_li' => '',
) );
?>
</ul>
これで <ul> の直下に各カテゴリーの <li> が並ぶ、すっきりしたリストになります。見出しは自分で <h2> などで用意できるので、マークアップの自由度が上がります。title_li に任意の文字列を渡せば、「記事カテゴリー」のように見出しのテキストを変えることもできます。
出力せずに文字列として受け取る
標準では wp_list_categories() はその場でHTMLを出力(echo)しますが、echo 引数を 0 にすると、出力せずにHTML文字列を返します。出力前に加工したい場合や、変数に入れて条件によって出し分けたい場合に便利です。
// echo を 0 にすると、出力せずに文字列が返る
$categories_html = wp_list_categories( array(
'title_li' => '',
'echo' => 0,
) );
// 受け取った文字列を使って自分で組み立てる
echo '<nav class="category-nav"><ul>' . $categories_html . '</ul></nav>';
返ってくるのは <li> の並びなので、ラップする <ul> やナビゲーション用の要素は自分で付けます。なお、カテゴリーが1件もないなどで出力が空になる場合があるため、返り値の有無をチェックしてから出力すると、空の <ul> が残るのを防げます。
特定のカテゴリーだけを表示・除外する
一覧から特定のカテゴリーを外したい、あるいは決まったカテゴリーだけを出したい、という場面では exclude と include を使います。どちらもカテゴリーのIDで指定します。次の例は、IDが 1 と 8 のカテゴリーを一覧から除外する書き方です。
<ul>
<?php
// ID 1(未分類)と 8 を一覧から外す
wp_list_categories( array(
'title_li' => '',
'exclude' => '1,8',
) );
?>
</ul>
逆に、決まったカテゴリーだけを表示したいときは include にIDを渡します。include を指定すると exclude は無視されるため、両方を同時に使う必要はありません。カテゴリーのIDは、管理画面の「投稿 > カテゴリー」で対象を編集する際のURLに含まれる tag_ID の値で確認できます。
表示する階層を絞る
親子関係のあるカテゴリーで、トップレベルだけを見せたい、あるいは特定のカテゴリーの子だけを出したい、ということもあります。階層の深さは depth で、表示の起点は child_of で指定します。次の例は、IDが 5 のカテゴリーに属する子カテゴリーだけを表示します。
<ul>
<?php
// ID 5 のカテゴリーの子だけを表示する
wp_list_categories( array(
'title_li' => '',
'child_of' => 5,
) );
?>
</ul>
トップレベルのカテゴリーだけを並べたい場合は、depth を 1 にします。depth => 1 なら一番上の階層だけが出力され、子カテゴリーは展開されません。hierarchical => 0 を指定すると、親子の入れ子をやめてすべてのカテゴリーを同列にフラット表示できます。これらを組み合わせると、メニューの見せ方を柔軟にコントロールできます。
カスタムタクソノミーの一覧を表示する
wp_list_categories() という名前ですが、taxonomy 引数を指定すれば、投稿カテゴリー以外のタクソノミー(独自に登録した分類)の一覧も同じ形式で出力できます。たとえば product_cat という階層型カスタムタクソノミーがある場合は、次のように書きます。
<ul>
<?php
// カスタムタクソノミー product_cat の一覧を表示
wp_list_categories( array(
'title_li' => '',
'taxonomy' => 'product_cat',
'show_count' => 1,
) );
?>
</ul>
このように、対象をカテゴリーからカスタムタクソノミーに切り替えるだけで、投稿数表示や並び替えといった他の引数はそのまま使えます。階層型のタクソノミーであれば、親子の入れ子表示も同じように機能します。
get_categories との違い
カテゴリーを扱う関数には get_categories() もあり、混同しやすいので違いを押さえておきましょう。wp_list_categories() が「リンク付きのHTMLリストを直接組み立てて出力する」関数なのに対して、get_categories() は「カテゴリーのデータ(オブジェクトの配列)を取得するだけ」の関数です。get_categories() はHTMLを一切出力しないので、取得した各カテゴリーの名前やリンクを使って、自分でマークアップを自由に組み立てたいときに向いています。
言い換えると、標準的なカテゴリーメニューをすぐに出したいなら wp_list_categories()、出力するHTMLを完全に自分で制御したいなら get_categories() でデータを取り出してループする、という使い分けになります。まずは wp_list_categories() の引数で要件を満たせないか検討し、それでも足りないときに get_categories() を検討すると、手間を抑えられます。
まとめ
wp_list_categories() は、カテゴリー一覧をリンク付きのリストとして手軽に出力できるテンプレートタグです。要点を振り返ります。
- 出力は
<li>の並びなので<ul>で囲って使う title_li => ''でデフォルトの「カテゴリー」見出しを消せるshow_count・orderby・orderで投稿数表示や並び替えを切り替えるexclude/includeでカテゴリーをIDで絞り込むecho => 0で出力せずHTML文字列として受け取れるtaxonomyでカスタムタクソノミーの一覧にも使える
引数を組み合わせれば、テンプレートを大きく書き換えずに表示を調整できます。まずは title_li と show_count あたりから試して、サイトに合ったカテゴリーメニューを作ってみてください。