• 解決済 egoblock

    (@egoblock)


    WPのカテゴリーのhierarchicalの構造がイマイチ理解出来ないので質問させてください。

    id|parent|name
    1|0|root
    2|1|child1
    3|1|child2
    4|0|child3
    5|3|child4
    6|2|child5
    7|4|child6
    8|7|child7
    9|3|child8

    上記のように親カテゴリーのidを持たせたテーブルをリカーシブでループさせます。

    function test($r, $p = 0 ){
            $t= $r;
            for( $i = 0; $i < count( $t ); $i++ ){
                    if( $i == 0 ){
                            echo '<ul>';
                    }
                    if( $p == $t[$i]["parent"] ){
                            echo '<li>';
                            echo '<p>parent:' . $t[$i]["parent"] . '</p>';
                            echo '<p>id:' . $t[$i]["id"] . '</p>';
                            echo '<p>name:' . $t[$i]["name"] . '</p>'; 
    
                            test( $t, $r[$i]["id"] );
    
                            echo '</li>';
                    }
                    if( $i == ( count($r) - 1 ) ){
                            echo '</ul>';
                    }
            }
    }
    
    test($category_array);

    上記のソースでループすると、一応ツリー上の者が出来上がるのですが、
    末子カテゴリーのときに中身の無い
    <ul></ul>
    が出力されてしまいます。

    こうならないようにするためにはwp_term_taxonomyのcountのようなカラムを持たせて0を入れておかなくてはいけないのでしょうか?

    カテゴリーやらタグやらが更新されたときには、都度countの値をアップデートする必要がありますが、そのようにしているものなのでしょうか?

    稚拙な質問で大変恐縮ですが、ご回答頂けると幸いです。

    よろしくお願い致します。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • 御質問の趣旨がつかめないのですが、末子カテゴリーは「自分のidが、parentとして使われているカテゴリーがひとつもない」ですよね。

    トピック投稿者 egoblock

    (@egoblock)

    レスしていただき、ありがとうございます。

    >末子カテゴリーは「自分のidが、parentとして使われているカテゴリーがひとつもない」
    はい、そうです。
    末子カテゴリーのループのとき
    if( $p == $t[$i][“parent”] )
    が成立しないので中身は出ないですが、
    if( $i == 0 )とif( $i == ( count($r) – 1 ) )は成立するので 

    <ul></ul>
    のように空の状態で
    <ul>が出力されてしまいます。

    そうならないためにwp_term_taxonomyにcountというカラムがあり、
    これが0のときは<ul>および</ul>
    を出力させないという処理をしているのかと考えました。

    https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/category-template.php
    ソースを観てもその辺りがわからなくて、質問させて頂いた次第です。

    wp_term_taxonomyのcountフィールドは、そのタームがつけられたオブジェクト(投稿など)の数です。親子関係に影響を受けるものではありません。

    トピック投稿者 egoblock

    (@egoblock)

    gblsmさん

    ご回答頂いているのに、不手際が多く恐縮です。

    if( $i == 0 ){
        echo '<ul>';
    }
    if( $p == $t[$i]["parent"] ){
        //省略
    }
    if( $i == ( count($r) - 1 ) ){
        echo '</ul>';
    }

    末子カテゴリーのループのとき、
    $p == $t[$i][“parent”]は成立しないので何も出力されませんが、
    $i == 0と$i == ( count($r) – 1 は成立するため、
    空の<ul></ul>だけが出力されてしまいます。

    これを解消するためにwp_term_taxonomyのcountが存在しているのかと思っております。

    簡単に済ませるなら、関数testがechoせず文字列(ul要素を含めない)を返すようにします。呼び出し側が返された文字列の長さを調べ、ゼロでなければul要素で囲んで出力すればよいのでは?

    (再掲:wp_term_taxonomyのcountフィールドは、そのタームがつけられたオブジェクト(投稿など)の数です。親子関係に影響を受けるものではありません。)

    トピック投稿者 egoblock

    (@egoblock)

    gblsmさん

    レスして頂きありがとうございました。

    function test($r, $p = 0 ){
            $t= $r;
    
            $flag = array();
            foreach( $t as $u ){
                    if( $p == $u["parent"] ){
                            $flag[] = $u["parent"];
                    }
            }
            if( !empty( $flag ) ){
                    for( $i = 0; $i < count( $t ); $i++ ){
                            if( $i == 0 ){
                                    echo '<ul>';
                            }
                            if( $p == $t[$i]["parent"] ){
                                    echo '<li>';
                                    echo '<p>parent:' . $t[$i]["parent"] . '</p>';
                                    echo '<p>id:' . $t[$i]["id"] . '</p>';
                                    echo '<p>name:' . $t[$i]["name"] . '</p>';
    
                                    test( $t, $r[$i]["id"] );
    
                                    echo '</li>';
                            }
                            if( $i == ( count($r) - 1 ) ){
                                    echo '</ul>';
                            }
                    }
            }
    }
    test($array)

    あまり美しくないですが、ループまわす前にループをまわして末子かどうかを判定するようにしました。

    >wp_term_taxonomyのcountフィールドは、そのタームがつけられたオブジェクト(投稿など)の数です。親子関係に影響を受けるものではありません。
    そうですよね。
    冷静になると当たり前でした。

    ご丁寧に回答頂きましてありがとうございました。

    ずいぶん以前にフォーラムで見た(孫カテゴリーに動向とか)のをコピーペーストしたコードがあるんですが、
    その中で
    get_ancestorsとか、
    get_term_childrenを使ってました。
    自分はウィジェットの見栄えを書き出すwalkerの自家用クラスで使っていた。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「カテゴリーのリカーシブを理解したい」には新たに返信することはできません。