サポート » 使い方全般 » 親、子、孫の順でカテゴリを表示したい

  • 解決済 sou08sou

    (@sou08sou)


    初めまして。

    single.phpに、
    その記事が属しているカテゴリ名を親>子>孫の順でリンクなしで表示したく、
    調べたところ、下記のような記述があり使用してみました。

    <?php
    $cats = get_the_category();
    $cat = $cats[0];
    if($cat->parent){
    $parent = get_category($cat->parent);
    echo $parent->cat_name;
    }else{
    echo $cat->cat_name;
    }
    ?></span><br>
    <?php
        $cats = get_the_category();
        foreach($cats as $cat):
        if($cat->parent) echo $cat->cat_name . '<br>';
        endforeach;
    ?>

    そうしたら、表示が
    親>孫>子
    となってしまいました。

    試しに
    <?php the_category('' , 'single'); ?>
    を入れてみたら、
    <a href="">親</a><a href="">親 子 孫</a><a href="">親 子</a>
    と表示されてしまいました。。

    原因がお分かりになる方がいましたら、教えていただけると嬉しいです。
    よろしくお願い致します。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • はじめまして。

    「get_the_category」の取得順序がカテゴリの階層順ではなく、名前順で取得されるためかなと思います。

    記事が属するカテゴリを階層順に並び替えればいいので、以下のようにしてみてはいかがでしょうか。

    <?php
    $cats = $sort = array();
    $post_cats = get_the_category();
    foreach ($post_cats as $cat) {
      $layer = count(get_ancestors($cat->term_id, 'category'));
      $cats[] = array(
        'name' => $cat->name,
        'layer' => $layer
      );
      $sort[] = $layer;
    }
    array_multisort($sort, SORT_ASC, $cats);
    foreach ($cats as $cat) {
      echo "{$cat['name']}<br />";
    }
    ?>

    上記は親カテゴリ、子カテゴリ。孫カテゴリ全てが記事にカテゴリ付けられているときでしたね・・・。
    一番下の階層のカテゴリを取得して、そこから子、親と遡っていく方が汎用性が高そうな気がするので、変えてみました。

    <?php
    $post_cats = get_the_category();
    if($post_cats){
      $bottom_cat = $post_cats[0];
      $bottom_anc = get_ancestors($bottom_cat->term_id, 'category');
      foreach ($post_cats as $index => $cat) {
        if ($index > 0) {
          $anc = get_ancestors($cat->term_id, 'category');
          if(count($anc) > count($bottom_anc)){
            $bottom_cat = $cat;
            $bottom_anc = $anc;
          }
        }
      }
      $bottom_anc = array_reverse($bottom_anc);
      foreach ($bottom_anc as $anc) {
        $cat = get_category($anc);
        echo "{$cat->name}<br />";
      }
      echo $bottom_cat->name;
    }
    ?>

    カテゴリーの親子判定に cat_is_ancestor_of() を使った別案です。

    $cats = get_the_category();
    $c1 = array_shift( $cats );
    if ( $c1 ) {
    	foreach ( $cats as $c2 ) {
    		if ( cat_is_ancestor_of( $c1, $c2 ) ) {
    			$c1 = $c2;
    		}
    	}
    	foreach( get_ancestors( $c1->term_id, 'category' ) as $catid ) {
    		$c2 = get_category( $catid );
    		echo "{$c2->name} > ";
    	}
    	echo $c1->name;
    } else {
    	echo 'カテゴリー無し';
    }
    
    • この返信は1 週、 4 日前に  gblsm さんが編集しました。

    すみません、array_reverse が抜けていました。正しくは

    foreach( array_reverse( get_ancestors( $c1->term_id, 'category' ) ) as $catid ) {
    

    なお、親子ではないカテゴリーを同時に付けてあるとうまく動作しません。

    halbot様、gblsm様

    お二方ともありがとうございました!
    どちらでもちゃんと表示されました。

    ずっと試行錯誤して悩んでいたので、本当に感謝です!
    ありがとうございました!

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • このトピックに返信するにはログインが必要です。