今回はWordpressのサイドバーなどでよくみられるようなカテゴリ一覧の実装サンプルを紹介します。
イメージ的には以下のような感じです。
サンプルコードは以下です。
<ul class="Sidebar_Navigation_List_Ul"> <?php $categories = get_only_root_categories(); foreach( $categories as $category ) : if($category->count > 0): ?> <li class="Sidebar_Navigation_List_Li"> <a href="<?php echo get_category_link($category->term_id) ?>"><?php echo $category->name ?></a> <?php //========== 子カテゴリを表示 - start ========== $chirdren_cat_ids = get_term_children($category->term_id, 'category'); //子カテゴリのIDの配列を取得 if($chirdren_cat_ids) : ?> <ul class="Sidebar_Navigation_List_Child_Ul"> <?php foreach($chirdren_cat_ids as $child_cat_id) : $child_cat = get_category($child_cat_id); if($child_cat->count > 0) : ?> <li class="Sidebar_Navigation_List_Child_Li"> <a href="<?php echo get_category_link($child_cat->term_id) ?>"><?php echo $child_cat->name ?></a> </li> <?php endif; endforeach; ?> </ul> <?php endif; //========== 子カテゴリを表示 - end ==========?> </li> <?php endif; endforeach; ?> </ul>
function get_only_root_categories() { $categories = array_filter(get_categories(), function($obj){ return ($obj->category_parent == 0 && $obj->term_id !== 1); //1 = Uncategorized }); return $categories; }
まず、get_only_root_categories() で親カテゴリのみを取得しています。
それをforeachで回して、リンクを生成します。
echo get_category_link($category->term_id) でリンクのhref属性を生成。
echo $category->name でリンクのテキストを生成します。
もし、そのカテゴリが子カテゴリを持っている場合は、入れ子でリンクを生成します。
get_term_children($category->term_id, 'category') で子カテゴリのIDの配列を取得します。
if($chirdren_cat_ids) :でIDがある場合は、子リストを生成します。
今回は、2階層までしか出していませんが、孫まで出したいという場合は、ループを一階層増やせばよいです。