Ottenere la lista dei prodotti di un determinato ID Categoria
Non sono riuscito a trovare il modo giusto per ottenere l'elenco di tutti i prodotti per un determinato ID categoria (non il nome della categoria).
Il codice che sto utilizzando per ottenere l'elenco delle categorie è il seguente, funziona bene:
$args = array(
'orderby' => $orderby,
'order' => $order,
'hide_empty' => 0,
'include' => $ids,
'parent' => 0,
);
$categories = get_terms( 'product_cat', $args );
Tuttavia, ora per un determinato ID categoria (diciamo 47), non sono riuscito a trovare il modo di ottenere i suoi prodotti correlati. Ho provato nel seguente modo:
$args = array(
'posts_per_page' => 5,
'offset'=> 1,
'category' => 47
);
$products = get_posts( $args );
echo var_dump($products);
Il debug dell'array $products
restituisce sempre 0, il che è sbagliato poiché so che ci sono alcuni prodotti nella categoria con ID 47. Qualche idea su come correggere il mio codice?

Sospetto che il problema principale sia che dovresti utilizzare l'oggetto WP_Query
invece di get_posts()
. Quest'ultimo per default restituisce solo elementi con post_type post
e non prodotti.
Quindi, data una categoria con ID 26, il seguente codice restituirebbe i suoi prodotti (WooCommerce 3+):
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'posts_per_page' => '12',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id', //Opzionale, di default è 'term_id'
'terms' => 26,
'operator' => 'IN' // Valori possibili: 'IN', 'NOT IN', 'AND'.
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'exclude-from-catalog', // Possibilmente anche 'exclude-from-search'
'operator' => 'NOT IN'
)
)
);
$products = new WP_Query($args);
var_dump($products);
Nelle versioni precedenti di WooCommerce la visibilità era memorizzata come meta campo, quindi il codice sarebbe:
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'posts_per_page' => '12',
'meta_query' => array(
array(
'key' => '_visibility',
'value' => array('catalog', 'visible'),
'compare' => 'IN'
)
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id', //Opzionale, di default è 'term_id'
'terms' => 26,
'operator' => 'IN' // Valori possibili: 'IN', 'NOT IN', 'AND'.
)
)
);
$products = new WP_Query($args);
var_dump($products);
Qui stiamo restituendo solo prodotti visibili, 12 per pagina.
Dai un'occhiata a http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters per maggiori dettagli su come funziona il targeting delle categorie - spesso è più utile recuperarle per slug piuttosto che per ID!

A partire da WooCommerce 3, la visibilità è stata cambiata in tassonomia invece che meta, quindi devi cambiare meta_query in tax_query. Vedi https://wordpress.stackexchange.com/a/262628/37355.

cambia categoria (category-slug-name) per ID, nome o slug
<?php
$args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'category-slug-name', 'orderby' =>'date','order' => 'ASC' );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product;
?>
All'interno del loop possiamo ottenere immagine del prodotto, titolo, descrizione, prezzo ecc.
<?phpendwhile;wp_reset_query(); ?>

Un po' in ritardo, ma vorrei chiarire le cose e fornire una risposta più pulita. L'utente @benz001 ha dato una risposta potenzialmente valida, ma ha detto qualcosa di sbagliato: get_posts
restituisce qualsiasi tipo di post-type, con il default su posts
, proprio come WP_Query
. Le vere differenze tra i due sono spiegate meravigliosamente QUI.
Il fatto è che l'OP stava semplicemente tralasciando alcuni parametri nell'array $args
:
La definizione del post-type che stava cercando:
'post_type' => 'product',
E la modifica della parte "tassonomia" della query di ricerca:
'tax_query' => array( array( 'taxonomy' => 'product_cat', 'terms' => 26, 'operator' => 'IN', ) )
In questo modo le tue prossime righe
$products = new WP_Query($args);
var_dump($products);
Ti mostreranno i prodotti necessari :)
Tutti gli altri parametri aggiuntivi mostrati da @benz001 sono ovviamente validi ma non richiesti dall'OP, quindi ho deciso di tralasciarli in questa risposta.

Utilizzando la funzione get_posts di WordPress
Ottenere tutti gli ID dei prodotti WooCommerce per categoria
Nel codice seguente, è sufficiente aggiungere il nome della categoria e funzionerà.
$all_ids = get_posts( array(
'post_type' => 'product',
'numberposts' => -1,
'post_status' => 'publish',
'fields' => 'ids',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'your_product_category', /*nome della categoria*/
'operator' => 'IN',
)
),
));
foreach ( $all_ids as $id ) {
echo $id;
}
