Obține lista de produse pentru un ID de categorie dat
Nu am putut găsi modalitatea corectă de a obține lista tuturor produselor pentru un ID de categorie dat (nu numele categoriei).
Codul pe care îl folosesc pentru a obține lista categoriilor funcționează bine:
$args = array(
'orderby' => $orderby,
'order' => $order,
'hide_empty' => 0,
'include' => $ids,
'parent' => 0,
);
$categories = get_terms( 'product_cat', $args );
Cu toate acestea, acum pentru un ID de categorie dat (să zicem 47), nu am putut găsi modalitatea de a obține produsele relevante. Am încercat următoarea metodă:
$args = array(
'posts_per_page' => 5,
'offset'=> 1,
'category' => 47
);
$products = get_posts( $args );
echo var_dump($products);
Depanarea array-ului $products
returnează întotdeauna 0, ceea ce este greșit deoarece știu că există câteva produse în categoria cu ID-ul 47. Aveți idei cum să corectez codul meu?

Bănuiesc că principala problemă este că ar trebui să folosești obiectul WP_Query
în loc de get_posts()
. Acesta din urmă, implicit, returnează doar elemente cu un post_type de post
, nu produse.
Deci, pentru o categorie cu ID-ul 26, următorul cod ar returna produsele sale (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', //Acest lucru este opțional, deoarece implicit este 'term_id'
'terms' => 26,
'operator' => 'IN' // Valorile posibile sunt 'IN', 'NOT IN', 'AND'.
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'exclude-from-catalog', // Posibil și 'exclude-from-search'
'operator' => 'NOT IN'
)
)
);
$products = new WP_Query($args);
var_dump($products);
În versiunile anterioare ale WooCommerce, vizibilitatea era stocată ca un câmp meta, deci codul ar fi:
$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', //Acest lucru este opțional, deoarece implicit este 'term_id'
'terms' => 26,
'operator' => 'IN' // Valorile posibile sunt 'IN', 'NOT IN', 'AND'.
)
)
);
$products = new WP_Query($args);
var_dump($products);
Aici returnăm doar produsele vizibile, 12 pe pagină.
Consultă http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters pentru mai multe detalii despre cum funcționează țintirea categoriilor - este adesea mai util să le obții după slug decât după ID!

Începând cu WooCommerce 3, vizibilitatea a fost schimbată în taxonomie în loc de meta, așa că trebuie să schimbați meta_query în tax_query. Vezi https://wordpress.stackexchange.com/a/262628/37355.

schimbă categoria (numele-slug-categorie) după ID, nume sau slug
<?php
$args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'numele-slug-categorie', 'orderby' =>'date','order' => 'ASC' );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product;
?>
În cadrul buclei putem prelua imaginea Produsului, titlu, descriere, preț etc.
<?php endwhile; wp_reset_query(); ?>

Un pic mai târziu, dar aș vrea să clarific lucrurile și să ofer un răspuns mai clar. Utilizatorul @benz001 a oferit un răspuns posibil valid, dar a spus ceva greșit: get_posts
returnează orice tip de postări, implicit fiind tipul posts
, exact ca WP_Query
. Diferențele reale dintre cele două sunt explicate minunat AICI.
Problemă reală a fost că OP pur și simplu a omis câțiva parametri în tabloul $args
:
Definirea tipului de postare pe care o căuta:
'post_type' => 'product',
Și modificarea părții de "taxonomie" din interogarea de căutare:
'tax_query' => array( array( 'taxonomy' => 'product_cat', 'terms' => 26, 'operator' => 'IN', ) )
În acest fel, următoarele linii
$products = new WP_Query($args);
var_dump($products);
Vă vor afișa produsele dorite :)
Toți ceilalți parametri adiționali afișați de @benz001 sunt desigur valizi, dar nu au fost solicitați de OP, așa că am decis să îi omit în acest răspuns.

Prin utilizarea funcției WordPress get_posts
Obțineți toate ID-urile produselor WooCommerce după categorie
În codul de mai jos, trebuie doar să adăugați numele categoriei și va funcționa.
$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', /*numele categoriei*/
'operator' => 'IN',
)
),
));
foreach ( $all_ids as $id ) {
echo $id;
}
