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>
このテンプレートタグの出力結果は上記のようになります。デフォルトの出力結果について簡単にまとめると次のようになります。
- すべてのカテゴリをリンク付きで出力
- カテゴリは昇順でソート順
- 投稿数は非表示
- 投稿のあるカテゴリだけ表示
- 親、子のすべてのカテゴリを表示
- リストタイトルに
Categories(カテゴリー)
と表示
パラメータ
$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);
'child_of'
…カテゴリーのIDを指定することで、対象の子カテゴリ一覧が出力'current_category'
…カテゴリー一覧ページを表示しているときに<li>
に"current-cat"
というクラスが付与される。不要な場合値を1
とする'depth'
…カテゴリー階層(親>子>孫)レベルの設定が可能。0
(初期値)すべてのカテゴリを出力。1
親カテゴリのみ。2
親と子までのカテゴリを出力。'echo'
…出力するかしないかの設定。0
は非表示'include'
…カテゴリーIDを指定することで対象のカテゴリーのみ表示します(複数可)。'exclude'
…カテゴリーIDを指定することで対象のカテゴリーを非表示にする(複数可)。自動的に直下の子カテゴリーも非表示になる。'exclude_tree'
…'exclude'
と同じ仕様。'feed'
…フィードリンクに使用するテキストを指定できます。'feed_image'
…フィードリンクに使用する画像のURLを入力します。'feed_type'
…フィードタイプの指定。'hide_empty'
…記事がないカテゴリーの表示0
、非表示1
を設定'hierarchical'
…子カテゴリを表示するかしないか。false
非表示'order'
…ソート順の設定。昇順ASC
、降順DESC
'orderby'
…ソート順の項目設定。name
,slug
,count
,term_group
'separator'
…<a>
タグ間の区切りタグやテキストの設定が可能'show_count'
…投稿数を表示するかしないか。表示したい場合は1
'show_option_all'
…文字列を埋めることでトップページへのアクセスリンクが出力される'style'
…<a>
タグ要素を囲む要素を指定。デフォルト'list'
。不要な場合'none'
'taxonomy'
…取得するカテゴリーを設定できます。通常メイン投稿のカテゴリを取得。カスタム投稿などのカテゴリーを取得したい場合register_taxonomy()
で登録しているタクソノミー名を入力。'title_li'
…カテゴリー一覧の見出しの設定。不要な場合''
'use_desc_for_title'
…カテゴリー説明をtitle属性に埋め込む設定。
カスタマイズ例
見出しを非表示または変更
見出しを変更したい場合'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);