1. ホーム
  2. WordPress

【WordPress】wp_list_categories でカテゴリー一覧を表示する方法|引数で表示をカスタマイズする

Share

サイドバーやフッターに「カテゴリー一覧」をリンク付きで並べたいとき、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 での記述です。

sidebar.php
<ul>
    <?php wp_list_categories(); ?>
</ul>

これだけで、次のような入れ子のリストが出力されます。デフォルトでは先頭に「カテゴリー」という見出しの <li> が付き、その中に各カテゴリーの <ul> がぶら下がる構造になります。

出力されるHTML
<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_count0(false)1 にすると各カテゴリー名の後ろに投稿数を表示する
hide_empty1(true)1 なら投稿が0件のカテゴリーを表示しない。0 で空のカテゴリーも表示する
orderby'name'並び替えの基準。name(名前)・idcount(投稿数)・slug など
order'ASC'並び順。ASC(昇順)または DESC(降順)
excludeなし表示しないカテゴリーのIDを指定する(カンマ区切りの文字列または配列)
includeなし表示するカテゴリーのIDだけを指定する。指定すると exclude は無視される
child_of0指定したカテゴリーIDの子孫だけを表示する
depth0表示する階層の深さ。0 は無制限、1 はトップレベルのみ。負の値で階層を無視してフラット表示
hierarchical1(true)1 なら親子を入れ子で表示。0 なら階層を無視してフラットに並べる
echo1(true)1 ならその場で出力。0 にすると出力せずHTML文字列を返す
taxonomy'category'対象のタクソノミー。カスタムタクソノミーの一覧を出すときに指定する

引数は連想配列のほか、'show_count=1&orderby=count' のようなクエリ文字列形式でも渡せますが、可読性の高い連想配列での指定をおすすめします。次の例は、投稿数を表示し、投稿数の多い順に並べる指定です。

sidebar.php
<ul>
    <?php
    wp_list_categories( array(
        'show_count' => 1,        // カテゴリー名の後ろに投稿数を表示
        'orderby'    => 'count',  // 投稿数を基準に並べる
        'order'      => 'DESC',   // 多い順(降順)
    ) );
    ?>
</ul>

show_count => 1 を指定すると、「ブログ (12)」のように投稿数が括弧付きで添えられます。orderbyorder を組み合わせることで、人気カテゴリーを上に出すといった並び替えも簡単に実現できます。

デフォルトの見出しを消す

引数なしで呼び出すと、先頭に「カテゴリー」という見出しの <li> が付きます。テーマ側ですでに「カテゴリー」という見出しを用意している場合など、この見出しが邪魔になることがあります。そんなときは title_li に空文字を渡すと、見出しと外側のラップ用 <li> がなくなり、各カテゴリーの <li> だけがフラットに出力されます。

sidebar.php
<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文字列を返します。出力前に加工したい場合や、変数に入れて条件によって出し分けたい場合に便利です。

functions.php
// 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> が残るのを防げます。

特定のカテゴリーだけを表示・除外する

一覧から特定のカテゴリーを外したい、あるいは決まったカテゴリーだけを出したい、という場面では excludeinclude を使います。どちらもカテゴリーのIDで指定します。次の例は、IDが 18 のカテゴリーを一覧から除外する書き方です。

sidebar.php
<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 のカテゴリーに属する子カテゴリーだけを表示します。

sidebar.php
<ul>
    <?php
    // ID 5 のカテゴリーの子だけを表示する
    wp_list_categories( array(
        'title_li' => '',
        'child_of' => 5,
    ) );
    ?>
</ul>

トップレベルのカテゴリーだけを並べたい場合は、depth1 にします。depth => 1 なら一番上の階層だけが出力され、子カテゴリーは展開されません。hierarchical => 0 を指定すると、親子の入れ子をやめてすべてのカテゴリーを同列にフラット表示できます。これらを組み合わせると、メニューの見せ方を柔軟にコントロールできます。

カスタムタクソノミーの一覧を表示する

wp_list_categories() という名前ですが、taxonomy 引数を指定すれば、投稿カテゴリー以外のタクソノミー(独自に登録した分類)の一覧も同じ形式で出力できます。たとえば product_cat という階層型カスタムタクソノミーがある場合は、次のように書きます。

sidebar.php
<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_countorderbyorder で投稿数表示や並び替えを切り替える
  • exclude / include でカテゴリーをIDで絞り込む
  • echo => 0 で出力せずHTML文字列として受け取れる
  • taxonomy でカスタムタクソノミーの一覧にも使える

引数を組み合わせれば、テンプレートを大きく書き換えずに表示を調整できます。まずは title_lishow_count あたりから試して、サイトに合ったカテゴリーメニューを作ってみてください。

参考ページ