Cat Speak

札幌在住のWebデザイナー・コモモのブログ

ホーム > ウェブ制作Tips > WordPress > 親カテゴリに属する子カテゴリ一覧を表示する

親カテゴリに属する子カテゴリ一覧を表示する

カテゴリーアーカイブ(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を成形するだけになります。

4 Responses to “親カテゴリに属する子カテゴリ一覧を表示する”

  1. […] 参考サイト Thanks! カテゴリーのIDから投稿記事数を返す方法 親カテゴリに属する子カテゴリ一覧を表示する […]

  2. mn より:

    検索から辿り着きました。非常に有益な情報をありがとうございます。望んでいた表示が実現できそうです。
    宜しければ一つ教えていただきたいのですが、この子カテゴリに投稿数を表示させる事はできますか?『show_count’ => ‘true’』など諸々試してはみたのですが実装には至らず。ご教授頂けますと幸いです。どうぞ宜しくお願い致します。

  3. コモモ komomo より:

    >mnさん
    show_countは、wp_list_categoriesに用意された引数ですので、ここでは使うことができません。
    この記事もかなり前に書いたものなので、その後、forよりもforeachを使った方がループが楽なことがわかったのでソースコード修正してますが、下記のようにすると良いと思います。

    <?php
    //$catに最上位カテゴリの情報を入れる
    $cat = get_category($cat);
    while ( $cat->parent > 0 )
    $cat = get_category( $cat->parent );
    
    //親カテゴリIDを取得
    $parentID = attribute_escape($cat->cat_ID);
    
    //子カテゴリを取得し、配列に入れる
    $cats = get_terms( 'category', array(
     	'hide_empty' => false,
    	'child_of'   => $parentID
     ) );
    ?>
    
    <ul id="catChild">
    <?php foreach($cats as $cat): ?>
    <li><a href="<?php echo get_category_link($cat->term_id); ?>"><?php echo $cat->name; ?>(<?php echo $cat->count; ?>)</a>
    </li>
    <?php endforeach; ?>
    </ul>
    

コメントを残す

人気の記事