WooCommerce - Afișează doar subcategoriile de produse dintr-o categorie părinte specifică

4 oct. 2013, 15:37:20
Vizualizări: 15.2K
Voturi: 0

Vreau să modific următorul fragment de cod:

<?php if ( (!$theretailer_theme_options['category_listing']) || ($theretailer_theme_options['category_listing'] == 0) ) { ?>
        <!-- Afișează doar prima categorie -->
        <?php $gbtr_product_cats = strip_tags($product->get_categories('|||', '', '')); //Categorii fără linkuri separate prin ||| ?>
        <h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>
        <?php } ?>

Exemplu: http://tjwillems.nl/priveekollektie/product-category/artists/reinier-bosch/

Titlul roșu de sub imaginea produsului trebuie să afișeze doar subcategoriile din categoria 'artist'. De exemplu, doar 'Reinier Bosch' și nu 'Lighting'

Poate cineva să mă ajute?

Salutări, Tom

0
Toate răspunsurile la întrebare 3
4

Funcția WooCommerce get_categories() este declarată în abstract-wc-product.php, deoarece este bazată pe funcția WordPress get_the_term_list() și nu există nicio modalitate de a obține doar o anumită ramură a unei categorii. Aceasta nu este deloc aceeași cu funcția WordPress get_categories(), poți observa că este specifică WooCommerce prin modul în care este folosită $product->get_categories(). Pe lângă diferențele evidente în argumentele pe care le poți folosi, poți aprofunda citind și comparând informațiile din linkurile furnizate.


Exemplu de arbore de taxonomie a categoriilor:

product_cat
    |
    |––cat1  
    |   |––child1.1  
    |   |––child1.2  
    |   |––child1.3  
    |
    |––cat2  
        |––child2.1  
        |––child2.2  
        |––child2.3  


În cazul tău, ramurile ar fi »artist« și »art«, în loc de »cat1« și »cat2«. Scopul este să obții doar ramura relevantă a categoriei pentru titlul pe care dorești să-l afișezi. Cel puțin, aceasta este ceea ce urmează să realizeze codul de mai jos.

După cum am menționat mai sus, dacă dorești să obții doar termenii dintr-o anumită ramură a unei categorii/taxonomii, trebuie să o faci într-un mod diferit. Trebuie să utilizezi get_terms() și wp_get_post_terms() și apoi să intersectezi rezultatele.

//categoria de produs WooCommerce
$taxonomies = array( 'product_cat' );

//să obținem un array cu ID-urile tuturor termenilor pe care un post îi are  
$post_tids = wp_get_post_terms($post->ID, 'product_cat', array("fields" => "ids"));

//trebuie să modifici ID-ul părintelui ramurii în consecință
$id_branch_parent = '111';
$args = array(
    'fields' => 'ids',
    'child_of' => $id_branch_parent
);
//să obținem un array cu ID-urile tuturor termenilor pe care ramura îi are  
$branch_tids = get_terms( $taxonomies, $args );

//intersectăm termenii postului și ai ramurii pentru a obține un array de ID-uri comune
$pnb_tids = array_intersect($post_tids, $branch_tids);

//în cazul mai multor ID-uri, trebuie să iterăm prin ele
foreach ( $pnb_tids as $tid ) {
    //obținem informațiile despre termen folosind ID-ul
    $tobj = get_term_by('id', $tid, 'product_cat');
    //stocăm numele termenilor într-un array
    $pnb_name_arr[] = $tobj->name;
}

//combinăm array-ul de nume, acesta este rezultatul pe care dorești să-l afișezi
$pnb_term_list = implode(' – ', $pnb_name_arr);

Acest cod ar trebui să-ți ofere rezultatul dorit, dar nu a fost testat.

4 oct. 2013 18:36:31
Comentarii

Mulțumesc pentru răspuns! Cred că mai are nevoie de o mică ajustare înainte să funcționeze.. Acum am această eroare fatală... PHP nu este specialitatea mea :-(

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

Această linie de cod este pe linia 111 $pnb_name_arr[] = $tobj['name'];

tjwillems tjwillems
5 oct. 2013 01:46:24

@tjwillems: Am modificat codul/linia

Nicolai Grossherr Nicolai Grossherr
5 oct. 2013 12:21:42

@tjwillems Cu plăcere! Dacă este un răspuns corect, marchează-l cu bifă, astfel încât toți cei care vor veni la întrebare mai târziu să știe asta.

Nicolai Grossherr Nicolai Grossherr
8 oct. 2013 17:29:01

@ialocin, mulțumesc mult! Acest răspuns m-a ajutat. Doar o întrebare, cum pot obține URL-ul către categoria copil?

input input
12 mar. 2014 00:12:32
2

Poți să comentezi această parte

    <h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>

Adaugă în html ....

De asemenea, poți folosi CSS pentru a ascunde h3, de exemplu

<style> .product_item h3 {display: none !important;} </style>

Poți adăuga în CSS-ul tău.

Făcând asta, textul 'roșu' va dispărea și vei avea doar celălalt text.

4 oct. 2013 15:58:48
Comentarii

Doar ascunderea elementului nu este optimă și ar trebui evitată folosirea declarațiilor de stil inline.

Nicolai Grossherr Nicolai Grossherr
4 oct. 2013 16:12:52

Nu vreau să ascund titlurile H3. Vreau să modific funcția. Acum afișează categoria selectată în ordine alfabetică. Dar eu vreau să afișez subcategoriile unei anumite categorii părinte... (e greu de explicat :) )

tjwillems tjwillems
4 oct. 2013 17:41:26
0

Iată cea mai simplă metodă de a afișa subcategoriile de produse dintr-un ID părinte specific

$parent_id = 12;    // ID-ul categoriei părinte
// Obține subcategoriile din ID-ul părinte
$get_child_category = get_terms('product_cat',array('child_of' => $parent_id));
// Filtrează produsele din subcategorii
foreach($get_child_category as $child_category){
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => 10,
        'product_cat' => $child_category->slug,
        'order' => 'DESC',
    );
}
6 aug. 2015 07:15:46