WooCommerce - Mostra le sottocategorie di prodotti da un genitore specifico
Voglio modificare il seguente pezzo di codice:
<?php if ( (!$theretailer_theme_options['category_listing']) || ($theretailer_theme_options['category_listing'] == 0) ) { ?>
<!-- Mostra solo la prima categoria -->
<?php $gbtr_product_cats = strip_tags($product->get_categories('|||', '', '')); //Categorie senza link separate da ||| ?>
<h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>
<?php } ?>
Esempio: http://tjwillems.nl/priveekollektie/product-category/artists/reinier-bosch/
Il titolo rosso sotto l'immagine del prodotto deve mostrare solo le sottocategorie di 'artista'. Quindi ad esempio solo 'Reinier Bosch' e non 'Illuminazione'.
Qualcuno può aiutarmi?
Saluti, Tom

La funzione di WooCommerce get_categories()
è dichiarata in abstract-wc-product.php
, poiché si basa sulla funzione di WordPress get_the_term_list()
non c'è modo di ottenere solo un ramo specifico di una categoria. Questo assolutamente non è lo stesso della funzione di WordPress get_categories()
, puoi vedere che è specifica di WooCommerce dal modo in cui viene utilizzata $product->get_categories()
. Oltre alle ovvie differenze negli argomenti che puoi utilizzare, puoi approfondire leggendo e confrontando le informazioni collegate.
Albero tassonomico delle categorie come esempio:
product_cat
|
|––cat1
| |––child1.1
| |––child1.2
| |––child1.3
|
|––cat2
|––child2.1
|––child2.2
|––child2.3
Nel tuo caso i rami sarebbero »artist« e »art«, invece di »cat1« e »cat2«. L'obiettivo è ottenere solo il ramo di categoria rilevante per il titolo che vuoi mostrare. Almeno questo è ciò che il codice qui sotto andrà a raggiungere.
Come ho detto sopra, se vuoi ottenere solo i termini da un ramo specifico di una categoria/tassonomia devi farlo in un modo diverso. Devi utilizzare get_terms()
e wp_get_post_terms()
e poi intersecare i risultati.
//categoria di prodotto woocommerce
$taxonomies = array( 'product_cat' );
//otteniamo un array con gli ID di tutti i termini che un post ha
$post_tids = wp_get_post_terms($post->ID, 'product_cat', array("fields" => "ids"));
//devi cambiare l'ID del genitore del ramo di conseguenza
$id_branch_parent = '111';
$args = array(
'fields' => 'ids',
'child_of' => $id_branch_parent
);
//otteniamo un array con gli ID di tutti i termini che il ramo ha
$branch_tids = get_terms( $taxonomies, $args );
//intersechiamo i termini del post e del ramo per ottenere un array di ID comuni
$pnb_tids = array_intersect($post_tids, $branch_tids);
//in caso di più ID dobbiamo scorrere attraverso di essi
foreach ( $pnb_tids as $tid ) {
//otteniamo le informazioni del termine tramite ID
$tobj = get_term_by('id', $tid, 'product_cat');
//memorizziamo i nomi dei termini in un array
$pnb_name_arr[] = $tobj->name;
}
//uniamo l'array dei nomi, questo è il risultato che vuoi mostrare
$pnb_term_list = implode(' – ', $pnb_name_arr);
Questo dovrebbe darti il risultato che desideri, ma non è stato testato.

Grazie per la tua risposta! Penso che serva una piccola modifica prima che funzioni.. Ora ho questo errore fatale... PHP non è il mio forte :-(
Fatal error: Cannot use object of type stdClass as array in /var/www/vhosts/tjwillems.nl/httpdocs/priveekollektie/wp-content/themes/priveekollektie/woocommerce/content-product.php on line 111
Questa riga di codice è alla linea 111 $pnb_name_arr[] = $tobj['name'];

@tjwillems Figurati! Se è la risposta corretta metti un segno di spunta, così chiunque arrivi alla domanda dopo lo saprà.

Puoi commentare questa parte
<h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>
Aggiungi all'html ....
Puoi anche usare CSS per nascondere l'h3, ad esempio
<style> .product_item h3 {display: none !important;} </style>
Puoi aggiungerlo al tuo css.
Facendo così il testo 'rosso' scomparirà e rimarrà solo l'altro testo.

Nascondere semplicemente l'elemento non è ottimale e dovrebbe essere evitata la dichiarazione di stili inline.

Ecco il modo più semplice per visualizzare le sottocategorie di prodotti da un ID genitore specifico
$parent_id = 12; // ID della categoria genitore
// Ottieni le sottocategorie dall'ID genitore
$get_child_category = get_terms('product_cat',array('child_of' => $parent_id));
// Filtra i prodotti dalla sottocategoria
foreach($get_child_category as $child_category){
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'product_cat' => $child_category->slug,
'order' => 'DESC',
);
}
