Obtenir la liste des produits d'un ID de catégorie donné

14

Je n'ai pas trouvé le bon moyen d'obtenir la liste de tous les produits pour un ID de catégorie donné (pas un nom de catégorie).

Le code que j'utilise pour obtenir la liste des catégories est le suivant, cela fonctionne très bien:

$args = array(
           'orderby'    => $orderby,
           'order'      => $order,
           'hide_empty' => 0,
           'include'    => $ids,
           'parent'    => 0,
     ); 

$categories = get_terms( 'product_cat', $args );

Cependant, maintenant pour un ID de catégorie donné (disons 47), je ne pouvais pas trouver le moyen d'obtenir ses produits pertinents. J'ai essayé de la manière suivante:

$args = array( 
    'posts_per_page' => 5,
    'offset'=> 1,
    'category' => 47
 );

$products = get_posts( $args );
echo var_dump($products);

Le débogage du $productstableau renvoie toujours 0, ce qui est faux car je sais qu'il y a des produits sous la catégorie avec l'ID 47. Des idées pour réparer mon code?

Malloc
la source
1
categoryou product_category?
fuxia

Réponses:

19

Je soupçonne que le principal problème est que vous devriez utiliser l' WP_Queryobjet plutôt que get_posts(). Le dernier par défaut ne renvoie que les articles avec un post_type de postproduits non,

Donc, étant donné une catégorie avec l'ID 26, le code suivant retournerait ses produits (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', //This is optional, as it defaults to 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog', // Possibly 'exclude-from-search' too
            'operator'      => 'NOT IN'
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Dans les versions antérieures de WooCommerce, la visibilité était stockée sous forme de méta-champ, le code serait donc:

    $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', //This is optional, as it defaults to 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Ici, nous ne retournons que des produits visibles, 12 par page.

Jetez un œil à http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters pour plus de détails sur le fonctionnement du ciblage par catégorie - il est souvent plus utile de le récupérer par slug que par ID!

benz001
la source
La solution a fonctionné. Belle explication.
Kamesh Jungi
1
À partir de Woocommerce 3, la visibilité est modifiée en taxonomie au lieu de méta, vous devez donc changer la méta_query en tax_query. Voir wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Votre conclusion get_posts()est fausse. Vous pouvez remplacer new WP_Query($args)par get_posts($args)dans votre code et cela fonctionnera.
Bjorn
2

changer la catégorie (nom-catégorie-slug) par id ou nom ou 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; 
?>
Within loop we can fetch Product image, title, description, price etc. 

<?phpendwhile;wp_reset_query(); ?>
dalveer
la source
2

Un peu en retard, mais je voudrais clarifier les choses et apporter une réponse plus claire. L'utilisateur @ benz001 a donné une réponse valide possible, mais a dit quelque chose de mal: get_postsrenvoie tout type de post-types, par défaut à postspost-type, tout comme WP_Query. Les vraies différences entre les deux sont merveilleusement expliquées ICI .

Le fait est que l'OP manquait simplement certains paramètres dans le $argstableau:

  • La définition du post-type qu'il recherche:

        'post_type'             => 'product',
  • Et la modification de la "partie taxonomie" de la requête de recherche:

        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'terms' => 26,
                'operator' => 'IN',
            )
        )

De cette façon, vos prochaines lignes

$products = new WP_Query($args);
var_dump($products);

Vous montrera les produits nécessaires :)

Tous les autres paramètres supplémentaires affichés par @ benz001 sont bien sûr valides mais non demandés par l'OP, j'ai donc décidé de les laisser dans cette réponse.

Erenor Paz
la source
2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
la source
OP a spécifiquement demandé d'obtenir des produits en utilisant un ID de catégorie, cependant, cela m'a aidé, donc je voterai de toute façon.
Sachez