WooCommerce - Mostra le sottocategorie di prodotti da un genitore specifico

4 ott 2013, 15:37:20
Visualizzazioni: 15.2K
Voti: 0

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

0
Tutte le risposte alla domanda 3
4

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.

4 ott 2013 18:36:31
Commenti

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 tjwillems
5 ott 2013 01:46:24

@tjwillems: Ho modificato il codice/la riga

Nicolai Grossherr Nicolai Grossherr
5 ott 2013 12:21:42

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

Nicolai Grossherr Nicolai Grossherr
8 ott 2013 17:29:01

@ialocin, grazie mille! Questa risposta mi è stata molto utile. Solo una domanda, come posso ottenere l'URL della categoria figlia?

input input
12 mar 2014 00:12:32
2

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.

4 ott 2013 15:58:48
Commenti

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

Nicolai Grossherr Nicolai Grossherr
4 ott 2013 16:12:52

Non è che voglio nascondere i titoli H3. Voglio modificare la funzione. Attualmente mostra le categorie selezionate in ordine alfabetico. Ma io vorrei che mostrasse le sottocategorie di un genitore specifico... (difficile da spiegare :) )

tjwillems tjwillems
4 ott 2013 17:41:26
0

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',
    );
}
6 ago 2015 07:15:46