Ottenere l'elenco dei prodotti di una categoria specifica
Voglio ottenere un elenco di prodotti di una categoria specifica usando WP_query, ma non funziona come dovrebbe.
Ho provato questo:
$args = array(
'post_type' => 'product',
'product_cat' => 17,
);
$products = new WP_Query($args);
Ma questo restituisce tutti i prodotti del mio negozio... Ho anche provato con gli attributi 'cat', 'category' e 'category_name' con lo stesso risultato.
Ho provato a usare tax_query:
$args = array(
'post_type' => 'product',
'tax_query' => array(
'taxonomy' => 'product_cat',
'terms' => 17
),
);
$products = new WP_Query($args);
E anche questo restituisce tutti i prodotti Ho provato anche con 'cat', 'category' e 'category_name' con lo stesso risultato.
Sono riuscito a ottenere i normali post di una categoria specifica con questo codice:
$args = array(
'post_type' => 'post',
'cat' => 22
);
$posts = new WP_Query($args);
Alcune cose aggiuntive:
- Sono sicuro di avere l'ID corretto della categoria.
- tax_query ha funzionato anche per i post
modifica:
tax_query
restituisce tutti i prodotti, ignorando il mio attributoproduct_cat
Ho cercato di risolvere questo problema per giorni e ho provato ogni possibile soluzione trovata su Stack e altri siti senza successo... Perché non funziona per i prodotti?
MODIFICA: lo snippet di codice con tax_query
era sbagliato, quindi l'ho modificato.
MODIFICA 2: Ho provato diverse nuove cose, ecco il riepilogo:
- disabilitati tutti gli hook personalizzati: stesso risultato
- istanziato manualmente un
WC_Product
usando l'ID di un prodotto reale come argomento. Mostra che il suo attributocategory_ids
è vuoto, anche se il prodotto ha una categoria nel pannello di amministrazione... e la pagina della tassonomia della categoria mostra le cose giuste. - quando faccio
var_dump(get_the_terms($postID, 'category'));
su un post normale funziona bene
MODIFICA 3:
- disabilitati tutti i plugin tranne WooCommerce con lo stesso risultato...
- quando faccio var_dump(get_post_types());
, il post type product non viene mostrato. E naturalmente, quando faccio var_dump(get_object_taxonomies('product'));
, restituisce un array vuoto.

Lo so, sono in ritardo per rispondere a questa domanda ma può essere utile ad altri.
$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);
È stato testato e funziona su WC 3.9.1

Alla fine il mio problema principale si è rivelato essere il fatto che stavo eseguendo codice direttamente in functions.php (a scopo di test). Il codice veniva eseguito prima che woocommerce fosse inizializzato e quindi falliva nel recuperare correttamente i prodotti. Nonostante ciò, non sono riuscito a far sì che Wp_Query restituisse solo i prodotti di una determinata categoria. Continuava a restituire ogni prodotto dal mio database, quindi ho trovato una soluzione alternativa.
$category; //questa è la variabile contenente lo slug della categoria desiderata
$productPosts = new WP_Query(array(
'post_type' => 'product'
));
//Avrei potuto usare $productPosts->have_posts() qui ma ho deciso di non usarlo nel mio contesto specifico
foreach ($productPosts->posts as $p) {
$currentProduct = new WC_Product_Variable($p->ID);
//Posso accedere solo agli ID delle categorie con WC_Product, quindi creo un array di slug di categoria invece
foreach ($currentProduct->get_category_ids() as $catId) {
if( $term = get_term_by( 'id', $catId, 'product_cat' ) ){
array_push($categories, $term->name); //lo aggiungo
}
}
if(in_array($category, $categories)){ //se il currentProduct corrente ha la categoria richiesta,
//lo aggiungo in $currentProduct nell'array $products
array_push($products, $currentProduct);
}
else{//il prodotto corrente non ha la categoria richiesta
}
} //fine foreach, ora abbiamo tutti i prodotti della categoria richiesta... nell'array $products
Questo funziona... Ma davvero, sembra sbagliato. Sto facendo diverse query al database per ogni prodotto che voglio includere nel mio array finale... È così che dovrebbe funzionare woocommerce? Inoltre, non sono sicuro di come dovrei gestire la paginazione con questi dati ma comunque non è il mio problema qui...
Deve esserci un modo migliore per farlo ma per ora non l'ho trovato...
