親カテゴリに属する子カテゴリ一覧を表示する
カテゴリーアーカイブ(category.php)で、親カテゴリ・子カテゴリのどちらのアーカイブでも、子カテゴリの一覧を表示する方法。
category.php
<?php
//$catに最上位カテゴリの情報を入れる
$cat = get_category($cat);
while ( $cat->parent > 0 )
$cat = get_category( $cat->parent );
//親カテゴリIDを取得
$parentID = attribute_escape($cat->cat_ID);
//子カテゴリIDを全て取得し、配列に入れる
$catChildren = get_category_children($parentID);
$catIDs = explode('/',$catChildren);
array_shift($catIDs);
sort ($catIDs);
?>
<ul id="catChild">
<?php
//ループしてHTMLを作成
for($i=0; $i<count($catIDs); $i++) {
$cats=get_category($catIDs[$i]);
?>
<li>
<a href="<?php echo get_category_link($catIDs[$i]); ?>">
<?php echo get_catname($catIDs[$i]); ?></a>
</li>
<?php } ?>
</ul>
出力結果
<ul id="catChild">
<li>
<a href="http://cat-speak.net/?cat=8">
メディア</a>
</li>
<li>
<a href="http://cat-speak.net/?cat=10">
インフォメーション</a>
</li>
</ul>
解説
<?php
//$catに最上位カテゴリの情報を入れる
$cat = get_category($cat);
while ( $cat->parent > 0 )
$cat = get_category( $cat->parent );
親カテゴリに居る時、$cat->parent(親カテゴリID)には、0が返されるので、while文を通すことで$catには、親カテゴリでは自分自身のIDが入り、子カテゴリでは親カテゴリIDが入ります。 ここで、カテゴリが親子関係ののみであれば、if文でかまわないのかもしれませんが、while文にすることで、孫以降のカテゴリでも最上位カテゴリの情報が$catに入ります。
//親カテゴリIDを取得
$parentID = attribute_escape($cat->cat_ID);
//子カテゴリIDを全て取得し、配列に入れる
$catChildren = get_category_children($parentID);
$catIDs = explode('/',$catChildren);
array_shift($catIDs);
sort ($catIDs);
?>
get_category_childrenは子カテゴリを取得するwordpressの関数です。 <?php echo get_category_children($parentID); ?> と記述すると、/10/12/8 のように、「/」で区切られた子カテゴリIDの値になります。 explode関数で、ひとつひとつのカテゴリIDにバラして配列に入れて、ループして使えるようにします。 その後、ここではIDが小さいものから順になるようにソートしています。
追記:この過程は、get_termsを使うと、下記でも可能でした。
$catIDs = get_terms( 'category',
array(
'child_of' => $parentID,
'orderby' => 'id',
'fields' => 'ids' ) );
<?php
//ループしてHTMLを作成
for($i=0; $i<count($catIDs); $i++) {
$cats=get_category($catIDs[$i]);
} ?>
count($catIDs)は配列の要素数なので、全ての子カテゴリの回数分だけループを続けます。 次の$cats=get_category($catIDs[$i]);で、$catには、子カテゴリの情報が入るので、あとは好きなように情報をとりだしてHTMLを成形するだけになります。
[...] http://cat-speak.net/2011/05/15/64/よりメモ ※上記みたほうがみやすい [...]
[...] 参考サイト Thanks! カテゴリーのIDから投稿記事数を返す方法 親カテゴリに属する子カテゴリ一覧を表示する [...]
検索から辿り着きました。非常に有益な情報をありがとうございます。望んでいた表示が実現できそうです。
宜しければ一つ教えていただきたいのですが、この子カテゴリに投稿数を表示させる事はできますか?『show_count’ => ‘true’』など諸々試してはみたのですが実装には至らず。ご教授頂けますと幸いです。どうぞ宜しくお願い致します。
>mnさん
show_countは、wp_list_categoriesに用意された引数ですので、ここでは使うことができません。
この記事もかなり前に書いたものなので、その後、forよりもforeachを使った方がループが楽なことがわかったのでソースコード修正してますが、下記のようにすると良いと思います。