web-dev-qa-db-ja.com

階層ツリーで2つの分類法を組み合わせる

たとえば、分類法を持つWooCommerce製品があります。

  • ブランド(例:Converse、adidas、D&G)(分類ID:product_brand)
  • カテゴリ(ブーツ、スニーカー、サンダル、ヒールなど)(分類ID:product_cat)

もちろん、すべてのブランドがすべてのカテゴリを含むわけではありません。

カテゴリ別にブランドをリストする必要があります。 ( Zapposがすることに似たもの 。E.g。:

Converse
- Sandals (2)
- Sneakers (6)

D&G
- Boots (10)
- Heels (4)
- Sandals (7)

特定のブランドを持つすべての製品をループ処理し、そのカテゴリをチェックする以外にこれを行うための簡単な方法はありますか?

5
Marvin3

投稿が分類法Yの用語にも関連付けられている分類法Xのすべての用語のリストを取得するには、次の手順を実行します。

  1. 両方の分類法のすべての用語IDを取得する
  2. 空の期間のアーカイブを表示したくないため、すべての投稿を取得するための税クエリを作成します。
  3. 結果を階層リストにフォーマットします。

行こう!

  1. IDという用語を取得するのは簡単です。

    get_terms( $taxonomy_name, array( 'fields' => 'ids' ) )
    

    それを2回(各分類ごとに1回)実行するだけです。

  2. タクソノミークエリでは、両方の分類法で are というすべての投稿を確認するために、関係ANDが必要です。

        'tax_query'        => array (
            'relation' => 'AND',
            array(
                'taxonomy' => $first,
                'field'    => 'id',
                'terms'    => get_terms( $first, array( 'fields' => 'ids' ) )
            ),
            array(
                'taxonomy' => $second,
                'field'    => 'id',
                'terms'    => get_terms( $second, array( 'fields' => 'ids' ) )
            ),
        ),
    
  3. 書式設定のために、最初の分類法の用語がキーで、2番目の分類法の用語が値である配列を作成します。それからプレーンな<ul>要素でネストしたリストを作ります。

今の機能:テストが簡単だったという理由だけで、分類法としてタグとカテゴリを使用しました。

function double_term_tree(
    $post_types = array( 'post', 'page' ),
    $first      = 'category',
    $second     = 'post_tag'
    )
{
    $query = new WP_Query(
        array (
            'numberposts'      => -1,
            'suppress_filters' => TRUE,
            'posts_per_page'   => -1,
            'post_type'        => $post_types,
            'tax_query'        => array (
                'relation' => 'AND',
                array(
                    'taxonomy' => $first,
                    'field'    => 'id',
                    'terms'    => get_terms( $first, array( 'fields' => 'ids' ) )
                ),
                array(
                    'taxonomy' => $second,
                    'field'    => 'id',
                    'terms'    => get_terms( $second, array( 'fields' => 'ids' ) )
                ),
            ),
        )
    );

    if ( empty ( $query->posts ) )
        return;

    $result_list = array();
    $output      = '<ul>';

    foreach ( $query->posts as $post )
    {
        $first_terms  = get_the_term_list( $post->ID, $first, '', '|' );
        $second_terms = get_the_term_list( $post->ID, $second, '', '|' );

        $f_term_array = explode( '|', $first_terms );
        $s_term_array = explode( '|', $second_terms );

        foreach ( $f_term_array as $f_term )
        {
            if ( ! isset ( $result_list[ $f_term ] ) )
                $result_list[ $f_term ] = array();

            $result_list[ $f_term ] = array_merge( $result_list[ $f_term ], $s_term_array );
        }
    }

    foreach ( $result_list as $k => $v )
    {
        $result_list[ $k ] = array_unique( $v );
        $output           .= "\n<li>$k\n\t<ul>\n\t\t<li>"
            . join( "</li>\n\t\t<li>", array_unique( $v ) )
            . "</li>\n\t</ul>\n</li>";
    }

    $output .= '</ul>';

    return $output;
}

あなたはこのようにこの関数を呼ぶことができます:

echo double_term_tree( 'product', 'brand', 'category' );

そして、あなたはその木を手に入れます。

8
fuxia