wp_list_categories()をカスタマイズする

カテゴリー一覧を出力するときよく使用するのがwp_list_categories()。ループ外であればどこでも使用できカスタマイズもそれなりに可能なテンプレートタグとなっているのでパラメータさえ押さえていればカスタマイズも可能です。

ただ使いやすい反面欠点でもあるのですが、出力方法が定まってしまうという点です。もし高度なカスタマイズを希望しているのであればget_categories()またはget_terms()を調べてみるといいでしょう。

基本的な使用方法

デフォルトの出力wp_list_categories()を使用したい場合下記のように使用します。

<?php wp_list_categories(); ?>

出力結果

<li class="categories">カテゴリー
    <ul>
        <li class="cat-item cat-item-29"><a href="http://sample.com/category/aaa/">aaa</a></li>
        <li class="cat-item cat-item-12"><a href="http://sample.com/category/bbb/">bbb</a></li>
        <li class="cat-item cat-item-10"><a href="http://sample.com/category/ccc/">ccc</a></li>
        <li class="cat-item cat-item-42"><a href="http://sample.com/category/ddd/">ddd</a></li>
        <li class="cat-item cat-item-37"><a href="http://sample.com/category/eee/">eee</a></li>
        <!-- 親カテゴリーを設定している場合の出力 -->
        <li class="cat-item cat-item-13"><a href="http://sample.com/category/notes/">Notes</a>
            <ul class="children">
                <li class="cat-item cat-item-78"><a href="http://sample.com/category/notes/sample-notes/">Sample</a></li>
            </ul>
        </li>
    </ul>
</li>

このテンプレートタグの出力結果は上記のようになります。デフォルトの出力結果について簡単にまとめると次のようになります。

パラメータ

$defaults = array(
    'child_of'            => 0,
    'current_category'    => 0,
    'depth'               => 0,
    'echo'                => 1,
    'include'             => '',
    'exclude'             => '',
    'exclude_tree'        => '',
    'feed'                => '',
    'feed_image'          => '',
    'feed_type'           => '',
    'hide_empty'          => 1,
    'hide_title_if_empty' => false,
    'hierarchical'        => true,
    'order'               => 'ASC',
    'orderby'             => 'name',
    'separator'           => '<br />',
    'show_count'          => 0,
    'show_option_all'     => '',
    'show_option_none'    => __( 'No categories' ),
    'style'               => 'list',
    'taxonomy'            => 'category',
    'title_li'            => __( 'Categories' ),
    'use_desc_for_title'  => 0,
);
wp_list_categories($defaults);

カスタマイズ例

見出しを非表示または変更

見出しを変更したい場合'title_li'に変更を加えます。見出しを非表示にしたい場合は次のコードのように値を空に設定してあげます。

$rslt = array(
    'title_li' => '',
);
wp_list_categories($rslt);

ただ出力が<li>タグの入れ子になるので注意が必要になります。

<li>のクラス名を削除する

wp_list_categories()は自動的にclassが付与されます。この吐き出しが不要な場合フィルターフックを使うことで削除することが可能です。下記のコードは<li>からclass="cat-item-..."を削除し出力します。

下記のコードはfunctions.phpに記述をしてください。

function wp_list_categories_custom($output) {
    $output = preg_replace('/class="cat-item.*?"/', '', $output);
    return $output;
}
add_filter('wp_list_categories', 'wp_list_categories_custom');

特定のカテゴリーだけ出力

特定のカテゴリーのみ出力させたい場合'include'を使用しカテゴリーIDを配列に記述します。

$rslt = array(
    'include' => [29, 12],
);
wp_list_categories($rslt);

特定のカテゴリーを非表示

特定のカテゴリーを非表示にしたい場合出力させたい場合'exclude'を使用しカテゴリーIDを配列に記述します。

$rslt = array(
    'exclude' => [9, 21],
);
wp_list_categories($rslt);

カテゴリー数を表示

カテゴリー数を表示させたい場合'show_count'を使用します。

$rslt = array(
    'show_count' => 1, // or ture
);
wp_list_categories($rslt);

カスタムタ投稿のカテゴリーを表示

wp_list_categories()でもカスタム投稿タイプのカテゴリーを出力することが可能です。出力させたい場合taxonomyの値にregister_taxonomy()で登録しているタクソノミー名を記述します。

$rslt = array(
    'taxonomy' => 'news-category',
);
wp_list_categories($rslt);

カスタム投稿のタグのみを出力することもできます。その場合もregister_taxonomy()で登録しているタグのタクソノミー名を記述しください。

親カテゴリーのみ表示

親カテゴリーのみを出力させたい場合は下記のように記述してあげます。

$rslt = array(
    'depth' => 1,
);
wp_list_categories($rslt);

投稿数が多いカテゴリー順に表示

投稿数が多いカテゴリー順に表示させたい場合は下記のように記述します。

$rslt = array(
    'order' => 'DESC',
    'orderby' => 'count',
);
wp_list_categories($rslt);

参考文献