サポート » 使い方全般 » 親カテに属する子カテと孫カテを特定のタグで囲いたい

  • 解決済 heppoko

    (@heppoko)


    親カテに属する子カテと孫カテを表示させたいと思って下記のソースにて実現できました。

    <?php
    $categories = get_terms( 'category', array(
        'hide_empty' => 0,
        'child_of' => 親カテゴリーのID,
     ) );
         foreach($categories as $value):
     ?>
    <p><a href="<?php echo get_category_link($value->term_id); ?>"><?php echo $value->name;?></a></p>
    <?php endforeach; ?>

    しかしこれだと、確かに子カテの下に孫カテが表示はされるのですが、どれが子カテで孫カテなのかが分からない。

    子カテ 01
    ・孫カテ 01
    ・孫カテ 02
    ・孫カテ 03

    子カテ 02
    ・孫カテ 01
    ・孫カテ 02
    ・孫カテ 03

    そこで上記のように、子カテをPタグで囲い、孫カテをリストタグで囲った状態で出力できないかと模索したのですが一向に答えが見つからず困っております。そもそも実現可能かどうかも分からないのですが、お分かりになる方がいらっしゃいましたら、ご教授いただければ幸いです。よろしくお願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 3階層しかないという前提ですが、取得したtermの親が親カテゴリーのIDかどうかをチェックすれば良いと思います。
    親が親カテゴリーのIDであれば、子カテゴリという判断です。

    var in_p = false;
    if($value->parent == 親カテゴリーのID) {
     if(in_p){
      echo '</ul></p>';
      in_p = false;
     }
     in_p = true;
     echo '<p><ul>'
    
    }else{
     echo "<li><a href="<?php echo get_category_link($value->term_id); ?>"><?php echo $value->name;?></a></li>"
    }
    
    echo '</ul></p>';
    in_p = false;

    ※上記コードは一度も実行していないことをご了承ください。

    スレッド開始 heppoko

    (@heppoko)

    ご回答ありがとうございます。

    しかしすみません…書いていただいたソースをどこにどう書き足せば良いのかが分からず…
    あれこれやってみたのですが、エラーばかりで。

    大変お手数なのですがその点で再度ご回答いただければ幸いです。
    よろしくお願いいたします。

    実行していないとはいえ、ちょっと不具合等いろいろ荒すぎてすいません。

    子カテの下に孫カテが表示されるとのことですので、以下のようにカテゴリが取得できたとして

    array(8) {
      [0]=>
      object(stdClass)#1 (3) {
        ["parent"]=>
        int(0)
        ["term_id"]=>
        int(1)
        ["name"]=>
        string(12) "子カテ 01"
      }
      [1]=>
      object(stdClass)#2 (3) {
        ["parent"]=>
        int(1)
        ["term_id"]=>
        int(2)
        ["name"]=>
        string(15) "孫カテ 01-01"
      }
      [2]=>
      object(stdClass)#3 (3) {
        ["parent"]=>
        int(1)
        ["term_id"]=>
        int(3)
        ["name"]=>
        string(15) "孫カテ 01-02"
      }
      [3]=>
      object(stdClass)#4 (3) {
        ["parent"]=>
        int(1)
        ["term_id"]=>
        int(4)
        ["name"]=>
        string(15) "孫カテ 01-03"
      }
      [4]=>
      object(stdClass)#5 (3) {
        ["parent"]=>
        int(0)
        ["term_id"]=>
        int(2)
        ["name"]=>
        string(12) "子カテ 02"
      }
      [5]=>
      object(stdClass)#6 (3) {
        ["parent"]=>
        int(2)
        ["term_id"]=>
        int(2)
        ["name"]=>
        string(15) "孫カテ 02-01"
      }
      [6]=>
      object(stdClass)#7 (3) {
        ["parent"]=>
        int(2)
        ["term_id"]=>
        int(3)
        ["name"]=>
        string(15) "孫カテ 02-02"
      }
      [7]=>
      object(stdClass)#8 (3) {
        ["parent"]=>
        int(2)
        ["term_id"]=>
        int(4)
        ["name"]=>
        string(15) "孫カテ 02-03"
      }
    }

    これを以下のように処理します。

    $in_p = false;
    foreach($categories as $category){
        if($category->parent == $parent_id) {
            if($in_p){
                echo '</ul></p>';
                $in_p = false;
            }
            $in_p = true;
            echo '<p><ul>';
        }else{
            echo "<li><a href=\"".get_category_link($category->term_id)."\">$category->name</a></li>";
        }
    }
    echo '</ul></p>';
    $in_p = false;

    実行結果はこのままだと1行で出てくるので、整形すると、以下のとおりです。

    <p>
      <ul>
        <li><a href="http://foo.bar/vategory/2">孫カテ 01-01</a></li>
        <li><a href="http://foo.bar/vategory/3">孫カテ 01-02</a></li>
        <li><a href="http://foo.bar/vategory/4">孫カテ 01-03</a></li>
      </ul>
    </p>
    <p>
      <ul>
        <li><a href="http://foo.bar/vategory/2">孫カテ 02-01</a></li>
        <li><a href="http://foo.bar/vategory/3">孫カテ 02-02</a></li>
        <li><a href="http://foo.bar/vategory/4">孫カテ 02-03</a></li>
      </ul>
    </p>

    追記です。
    取得できたカテゴリは「$categories」に、親カテゴリのIDは「$parent_id」に入っているものとします。

    あと、子カテゴリのリンクを出力するのを忘れていました・・・

    $in_p = false;
    foreach($categories as $category){
        if($category->parent == $parent_id) {
            if($in_p){
                echo '</ul></p>';
                $in_p = false;
            }
            $in_p = true;
            echo '<p>';
            echo "<a href=\"".get_category_link($category->term_id)."\">$category->name</a>";
            echo '<ul>';
        }else{
            echo "<li><a href=\"".get_category_link($category->term_id)."\">$category->name</a></li>";
        }
    }
    echo '</ul></p>';
    $in_p = false;
    <p>
    	<a href="http://foo.bar/vategory/1">子カテ 01</a>
    	<ul>
    		<li><a href="http://foo.bar/vategory/2">孫カテ 01-01</a></li>
    		<li><a href="http://foo.bar/vategory/3">孫カテ 01-02</a></li>
    		<li><a href="http://foo.bar/vategory/4">孫カテ 01-03</a></li>
    	</ul>
    </p>
    <p>
    	<a href="http://foo.bar/vategory/2">子カテ 02</a>
    	<ul>
    		<li><a href="http://foo.bar/vategory/2">孫カテ 02-01</a></li>
    		<li><a href="http://foo.bar/vategory/3">孫カテ 02-02</a></li>
    		<li><a href="http://foo.bar/vategory/4">孫カテ 02-03</a></li>
    	</ul>
    </p>
    スレッド開始 heppoko

    (@heppoko)

    munyagu様

    懇切丁寧なご回答、本当にありがとうございました。

    タグの追加をしたくてあれこれしてみたら、このソース以降が表示されなくなってしまって焦ったのですが、自分のタグ追記がミスだったことが判明して、最終的に思ったような出力をすることが出来ました。

    重ね重ね、ありがとうございました。
    しばらくしたら、閉じさせていただきますね。

    スレッド開始 heppoko

    (@heppoko)

    ありがとうございました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「親カテに属する子カテと孫カテを特定のタグで囲いたい」には新たに返信することはできません。