要件
管理画面で”親カテゴリーのID”と”階層”を入力し、カテゴリーリストを表示させたい。
例:
カテゴリーID…1,4,5
階層…2
と入力すると、
- カテゴリー1
- – カテゴリー1の子1
- – カテゴリー1の子2
- カテゴリー4
- カテゴリー5
みたいに表示される感じにしたい。
問題
最初は、”wp_list_categories()“を使ってこんな感じでぱぱっとできると思っていました。値の入力はテーマカスタマイザーでの手入力です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $options = get_option( 'my_theme_options' ); $side_cat_id = $options[ 'side_cat_id' ]; //カテゴリーIDを文字列で取得 $side_cat_hierarchy = $options[ 'side_cat_hierarchy' ]; //階層を文字列で取得 // 階層が入力されてない場合は親のみ表示 if($side_cat_hierarchy): $depth = $side_cat_hierarchy; else: $depth = 1; endif; // wp_list_categories()の設定 $args = array( 'depth' => $depth, 'title_li' => '', 'include' => $side_cat_id, 'hide_empty' => 0, 'hierarchical' => 1 ); ?> <ul> <?php wp_list_categories( $args ); //出力 ?> </ul> |
ところが、子カテゴリーが表示されない…
どうも、’inculde’でカテゴリーIDを指定すると、階層を有効にしても、指定したIDのカテゴリーしか表示されないようです。子カテゴリーは自動で出てこない。
解決
先に、指定した親カテゴリーIDの子孫を全部取得し、一家全員のIDをincludeに入れてやる作戦に変更。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php $options = get_option( 'my_theme_options' ); $side_cat_id = $options[ 'side_cat_id' ]; //カテゴリーIDを文字列で取得 $side_cat_hierarchy = $options[ 'side_cat_hierarchy' ]; //階層を文字列で取得 // 階層が入力されてない場合は親のみ表示 if($side_cat_hierarchy): $depth = $side_cat_hierarchy; else: $depth = 1; endif; // 指定IDの子孫カテゴリーIDを全部取得し、変数"$include"にまとめる。 if($side_cat_id): $parents = get_categories(array( 'hide_empty' => 0, 'include' => $side_cat_id )); $childes = array(); foreach($parents as $parent): $childes = array_merge($childes, get_categories(array('hide_empty'=>0, 'child_of' => $parent->term_id ))); endforeach; foreach($childes as $child): $child_id[] = $child->cat_ID; endforeach; if($child_id): $child_cat_id = implode(',' ,$child_id ); endif; $include = $side_cat_id. ',' .$child_cat_id; else: $include = ''; endif; // wp_list_categories()の設定 $args = array( 'depth' => $depth, 'title_li' => '', 'include' => $include, 'hide_empty' => 0, 'hierarchical' => 1 ); ?> <ul> <?php wp_list_categories( $args ); //出力 ?> </ul> |
これで、要望通り動くようになった。
もうちょっとすっきり書けないかなぁ…