WordPress – 親カテゴリーIDと階層を指定し、リスト表示させる

要件

管理画面で”親カテゴリーの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>

これで、要望通り動くようになった。

もうちょっとすっきり書けないかなぁ…

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です