it-swarm.com.de

Kombinieren Sie zwei Taxonomien in einem hierarchischen Baum

Ich verwende beispielsweise WooCommerce-Produkte mit folgenden Taxonomien:

  • marke (z. B. Converse, adidas, D & G) (Taxonomie-ID: product_brand)
  • kategorie (z. B. Stiefel, Turnschuhe, Sandalen, Absätze) (Taxonomie-ID: product_cat)

Natürlich umfasst nicht jede Marke alle Kategorien.

Ich muss die Kategorien nach Marke auflisten. (etwas Ähnliches wie Zappos macht . ZB .:

Converse
- Sandals (2)
- Sneakers (6)

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

Gibt es eine einfache Möglichkeit, dies zu tun, außer alle Produkte mit einer bestimmten Marke durchzugehen und ihre Kategorie zu überprüfen?

5
Marvin3

Um eine Liste aller Begriffe der Taxonomie X zu erhalten, deren Einträge auch Begriffen der Taxonomie Y zugeordnet sind, müssen wir:

  1. Holen Sie sich alle Term-IDs für beide Taxonomien
  2. Erstellen Sie eine Steuerabfrage, um alle Posts abzurufen, da keine leeren Termarchive angezeigt werden sollen.
  3. Formatieren Sie das Ergebnis in einer hierarchischen Liste.

Lass uns gehen!

  1. Die Term-IDs zu erhalten ist einfach:

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

    Wir müssen das nur zweimal machen (für jede Taxonomie einmal).

  2. Die Taxonomieabfrage benötigt eine Beziehung AND, um sicherzustellen, dass alle Posts, die wir erhalten, in beiden Taxonomien sind :

        '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. Für die Formatierung erstellen wir ein Array, in dem die Begriffe der ersten Taxonomie die Schlüssel und die Begriffe der zweiten Taxonomie die Werte sind. Dann erstellen wir eine verschachtelte Liste mit einfachen <ul> Elementen.

Nun die Funktion: Ich habe Tags und Kategorien als Taxonomien verwendet, nur weil es einfacher zu testen war.

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;
}

Sie können diese Funktion folgendermaßen aufrufen:

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

Und dann bekommst du den Baum.

8
fuxia