Obține lista de produse dintr-o anumită categorie
Vreau să obțin o listă de produse dintr-o anumită categorie folosind WP_query, dar nu funcționează cum ar trebui.
Am încercat asta:
$args = array(
'post_type' => 'product',
'product_cat' => 17,
);
$products = new WP_Query($args);
Dar aceasta returnează toate produsele din magazinul meu... Am încercat și cu 'cat', 'category' și 'category_name' cu același rezultat.
Am încercat să folosesc tax_query:
$args = array(
'post_type' => 'product',
'tax_query' => array(
'taxonomy' => 'product_cat',
'terms' => 17
),
);
$products = new WP_Query($args);
Și aceasta returnează toate produsele Am încercat și cu 'cat', 'category' și 'category_name' cu același rezultat.
Am reușit să obțin postări obișnuite dintr-o anumită categorie folosind următorul cod.
$args = array(
'post_type' => 'post',
'cat' => 22
);
$posts = new WP_Query($args);
Câteva detalii suplimentare:
- Sunt sigur că am ID-ul corect al categoriei.
- tax_query a funcționat și pentru postări
edit:
tax_query
returnează toate produsele, ignorând atributul meuproduct_cat
Am căutat să fac asta de zile întregi și am încercat fiecare soluție posibilă din întrebări similare de pe stack și alte site-uri fără succes... De ce nu funcționează pentru produse?
EDIT: fragmentul de cod cu tax_query
era greșit, așa că l-am schimbat.
EDIT 2: Am încercat mai multe lucruri noi, iată rezumatul:
- am dezactivat toate hook-urile personalizate: aceleași rezultate
- am instanțiat manual un
WC_Product
prin ID-ul unui produs existent ca argument. Acesta arată că atributulcategory_ids
este gol, chiar dacă produsul are o categorie în panoul de administrare... și pagina de taxonomie a categoriei arată corect. - când fac
var_dump(get_the_terms($postID, 'category'));
pentru o postare obișnuită, funcționează bine
EDIT 3:
- am dezactivat toate plugin-urile, cu excepția WooCommerce, cu același rezultat...
- când fac var_dump(get_post_types());
, tipul de postare product nu apare. Și, în mod natural, când fac var_dump(get_object_taxonomies('product'));
, returnează un array gol.

Știu că am întârziat să răspund la această întrebare, dar sper să ajute pe alții.
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => array($cat_id1,$cat_id2),
),
),
);
$query = new WP_Query($args);
Codul a fost testat și funcționează pe WooCommerce 3.9.1

În final, principala mea problemă s-a dovedit a fi faptul că executam cod direct în functions.php (în scop de testare). Codul se executa înainte ca WooCommerce să fie inițializat și, astfel, nu reușea să preia corect produsele.
În ciuda acestui lucru, nu am reușit să fac ca Wp_Query să returneze doar produsele dintr-o anumită categorie. Continuam să primesc toate produsele din baza de date, așa că am găsit o soluție alternativă.
$category; //acesta este variabila care conține slug-ul categoriei dorite
$productPosts = new WP_Query(array(
'post_type' => 'product'
));
//Aș fi putut folosi $productPosts->have_posts() aici, dar am decis să nu o folosesc în contextul meu specific
foreach ($productPosts->posts as $p) {
$currentProduct = new WC_Product_Variable($p->ID);
//Pot accesa doar ID-urile categoriilor cu WC_Product, așa că construiesc un array de slug-uri de categorii
foreach ($currentProduct->get_category_ids() as $catId) {
if( $term = get_term_by( 'id', $catId, 'product_cat' ) ){
array_push($categories, $term->name); //adaugă în array
}
}
if(in_array($category, $categories)){ //dacă currentProduct are categoria cerută,
//adaugă $currentProduct în array-ul $products
array_push($products, $currentProduct);
}
else{//produsul curent nu are categoria cerută
}
} //sfârșit foreach, acum avem toate produsele din categoria dorită... în array-ul $products
Această soluție funcționează... Dar, sincer, pare greșită. Fac mai multe interogări la baza de date pentru fiecare produs pe care vreau să-l includ în array-ul final... Așa ar trebui să funcționeze WooCommerce?
De asemenea, nu sunt sigur cum ar trebui să implementez paginarea cu aceste date, dar oricum nu este problema mea aici...
Cu siguranță există o metodă mai bună de a face asta, dar nu am găsit-o încă...
