要件
管理画面で”親カテゴリーのID”と”階層”を入力し、カテゴリーリストを表示させたい。
例:
カテゴリーID…1,4,5
階層…2
と入力すると、
- カテゴリー1
- – カテゴリー1の子1
- – カテゴリー1の子2
- カテゴリー4
- カテゴリー5
みたいに表示される感じにしたい。
問題
最初は、”wp_list_categories()“を使ってこんな感じでぱぱっとできると思っていました。値の入力はテーマカスタマイザーでの手入力です。
<?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に入れてやる作戦に変更。
<?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>
これで、要望通り動くようになった。
もうちょっとすっきり書けないかなぁ…

コメントを残す