Ottenere le categorie figlie da una categoria genitore in WooCommerce
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?

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...

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?

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 Ho aggiornato il mio codice per restituire il nome e/o lo slug...

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 Ho modificato la mia risposta con altro codice... Ora sulla pagina prodotto è completamente diverso dato che un prodotto può avere molte categorie prodotto...

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 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...

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?

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.
