WooCommerce - Afișează doar subcategoriile de produse dintr-o categorie părinte specifică
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

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.

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

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.

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

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',
);
}
