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

12

Je ne trouvais pas le bon moyen d'obtenir la liste de tous les produits pour un identifiant de catégorie donné (pas le nom de la catégorie).

Le code que j'utilise pour obtenir la liste des catégories est le suivant: il fonctionne correctement:

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

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

Cependant, pour un ID de catégorie donné (par exemple 47), je n’ai pas trouvé le moyen d’obtenir les produits correspondants. J'ai essayé le chemin suivant:

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

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

Le débogage du tableau $products renvoie toujours 0, ce qui est faux car je sais qu'il existe des produits dans la catégorie portant l'ID 47. Des idées pour corriger mon code?

    
posée Malloc 06.05.2014 - 23:06

3 réponses

16

Je soupçonne que le principal problème est que vous devriez utiliser l'objet WP_Query plutôt que get_posts() . Ce dernier, par défaut, ne renvoie que les éléments dont le type de post_type est post not products,

.

Donc, étant donné une catégorie avec l'ID 26, le code suivant renverrait 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 précédentes de WooCommerce, la visibilité était stockée sous forme de méta-champ. Le code était donc le suivant:

    $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);

Nous ne renvoyons ici que des produits visibles, 12 par page.

Consultez enlace pour plus d'informations sur le fonctionnement du ciblage par catégorie. Il est souvent plus utile de le récupérer. il par slug que par ID!

    
réponse donnée benz001 02.06.2014 - 12:53
2

changer de catégorie (category-slug-name) par son identifiant, son nom ou son 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(); ?>
    
réponse donnée dalveer 19.01.2015 - 13:21
2

Un peu en retard, mais j'aimerais 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 faux: get_posts renvoie tout type de post-types, par défaut posts post-type, tout comme WP_Query . Les vraies différences entre les deux sont merveilleusement expliquées ICI .

En fait, il manquait simplement quelques paramètres à l'OP dans le tableau $args :

  • La définition du type de message 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',
            )
        )
    

Ainsi vos prochaines lignes

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

Vous montrera les produits nécessaires:)

Tous les autres paramètres supplémentaires indiqués par @ benz001 sont bien sûr valables mais ne sont pas demandés par l'OP. J'ai donc décidé de les laisser dans cette réponse.

    
réponse donnée Erenor Paz 18.11.2016 - 12:22

Lire d'autres questions sur les étiquettes