Ottenere le categorie figlie da una categoria genitore in WooCommerce

19 mar 2020, 19:46:37
Visualizzazioni: 14.4K
Voti: 1

In WooCommerce, sto cercando di ottenere tutti i termini delle categorie prodotto figlie dall'ID del termine genitore della categoria prodotto corrente con il codice seguente:

$category = get_queried_object();
$category_parent_id = $category->parent;
$category_test = get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

La variabile $category_parent_id restituisce l'ID della categoria prodotto genitore e $category_test restituisce tutti i termini delle categorie prodotto

Sto cercando di ottenere tutte le categorie prodotto figlie utilizzando l'ID del termine della categoria prodotto genitore recuperato da $category->parent

Logicamente ho provato:

$category_test = $category_parent_id->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

e

$category_test = $category->parent->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

Ma questo non mi ha restituito tutte le categorie figlie della categoria genitore corrente. Qualcuno ha idea se e come questo possa essere realizzato?

0
Tutte le risposte alla domanda 1
9

Modificato (1)

Dovrai utilizzare l'argomento 'child_of' da WP_Term_Query disponibile, che ti permetterà di ottenere tutti i termini figli per il termine genitore della categoria prodotto corrente:

// Solo nelle pagine archivio delle categorie prodotto
if( is_product_category() ) {
    $main_term = get_queried_object();

    $args_query = array(
        'taxonomy' => 'product_cat', 
        'hide_empty' => false, 
        'child_of' => $main_term->parent
    );

    if ( $main_term->parent != 0 ) {
        // Cicla attraverso gli oggetti WP_Term
        foreach ( get_terms( $args_query ) as $term ) {
            if( $term->term_id != $main_term->term_id ) {
                // $term->slug; // Slug

                // Output di ogni nome termine (linkato)…
                echo sprintf( '<a href="%s">%s</a></br>', get_term_link( $term->term_id, 'product_cat' ), $term->name );
            }
        }
    }
}

Oppure puoi anche usare get_term_children() in questo modo:

// Solo nelle pagine archivio delle categorie prodotto
if( is_product_category() ) {
    $main_term  = get_queried_object();
    $taxonomy   = 'product_cat';

    if ( $main_term->parent != 0 ) {
        $child_ids = get_term_children( $main_term->parent, $taxonomy );

        echo '<ul>';

        foreach ( $child_ids as $child_id ) {
            if( $child_id != $main_term->term_id ) {
                $term = get_term_by( 'id', $child_id, $taxonomy );
                echo '<li><a href="' . get_term_link( $child_id, $taxonomy ) . '">' . $term->name . '</a></li>';
            }
        }
        echo '</ul>';
    }
}

Questo vale solo per le pagine archivio delle categorie prodotto, poiché per le pagine prodotto puoi avere molte categorie prodotto impostate per un prodotto e il codice sarebbe complicato e abbastanza diverso...

19 mar 2020 20:10:13
Commenti

Questo fornisce effettivamente tutti i dati grezzi desiderati in output. Hai qualche idea su come ottenere solo il nome e/o lo slug ad esempio?

Jeroen_L Jeroen_L
19 mar 2020 22:42:37

Giusto accettato, se avessi il tempo di spiegare come ottenere solo il nome e/o lo slug invece dei dati grezzi mi faresti risparmiare ore di ricerca. Se no grazie comunque :)

Jeroen_L Jeroen_L
19 mar 2020 22:49:33

@Jeroen_L Ho aggiornato il mio codice per restituire il nome e/o lo slug...

LoicTheAztec LoicTheAztec
19 mar 2020 23:01:18

Ho appena notato che non prende il genitore se sono su una pagina prodotto. E prende anche i genitori dei genitori e i figli di quei genitori... qualche idea? Condividerò il mio nuovo codice nel prossimo post se sei interessato.

Jeroen_L Jeroen_L
20 mar 2020 00:11:30

@Jeroen_L Ho modificato la mia risposta con altro codice... Ora sulla pagina prodotto è completamente diverso dato che un prodotto può avere molte categorie prodotto...

LoicTheAztec LoicTheAztec
20 mar 2020 00:37:44

Dovrò verificarlo ma si sta facendo tardi, e se sono su una pagina prodotto (is_product) funzionerà comunque? Lo controllerò domani, grazie comunque finora.

Jeroen_L Jeroen_L
20 mar 2020 00:55:41

@Jeroen_L Il codice gestisce solo le pagine di archivio delle categorie di prodotti, poiché puoi avere molte categorie di prodotti impostate per un prodotto... Quindi sarà qualcosa di molto diverso e più complicato gestire le pagine dei prodotti e dovresti fare una nuova domanda per gestire le pagine dei prodotti...

LoicTheAztec LoicTheAztec
20 mar 2020 07:44:35

Quasi...

I primi test mostrano che ora sale solo di 1 livello, ma se uno qualsiasi dei fratelli o sorelle all'interno di quel livello ha delle sottocategorie, allora vengono mostrate anche quelle sottocategorie.

In realtà ora fa questo: sale di 1 livello (categoria genitore), prende tutte le categorie presenti lì (che è ciò di cui ho bisogno), ma se una di quelle categorie ha delle sottocategorie, queste verranno prese anch'esse.

Quindi ora sale di +1 per andare al genitore e continuerà a scendere di -1 finché possibile, come possiamo impedirgli di fare il -1?

Per le pagine dei Prodotti, è più semplice se i prodotti sono limitati a 1 categoria associata?

Jeroen_L Jeroen_L
20 mar 2020 12:13:07

Sono riuscito a risolvere il problema di prendere le sottocategorie come cugine passando l'ID della categoria genitore e combinando altre soluzioni insieme. Aggiornerò la mia risposta con il nuovo codice. Tutto ciò che rimane ora è capire come ottenere l'elenco nella pagina del prodotto se conosciamo l'ID della categoria genitore.

Jeroen_L Jeroen_L
20 mar 2020 16:08:15
Mostra i restanti 4 commenti