web-dev-qa-db-fra.com

WP_Query Produits Woocommerce appartenant à plusieurs catégories distinctes uniquement tax_query

J'utilise WP_Query pour les produits Woocommerce dans le but d'interroger les produits d'une catégorie particulière. C'est la syntaxe qui a fonctionné pour moi -

$args = array(
    'posts_per_page' => -1,
    'product_cat' => 'category-slug-here',
    'post_type' => 'product',
    'orderby' => 'title',
);
$the_query = new WP_Query( $args );
// The Loop
while ( $the_query->have_posts() ) {
    $the_query->the_post();
    echo '' . get_the_title() . '<br /><br />';
}
wp_reset_postdata();

Cela retourne des données, mais je souhaite transmettre un ID, et non un slug de catégorie, et rechercher des produits qui existent dans plusieurs catégories uniquement

L'argument product_cat n'est pas natif de WP_Query (du moins, je peux le trouver), donc je suppose que c'est quelque chose de personnalisé pour Woocommerce. Grâce à leur documentation, je n'ai rien trouvé qui me permette de filtrer par ID de catégorie, ni d'utiliser une condition AND pour ce filtrage.

En utilisant cat, les tableaux de tax_query et category__and n'ont donné aucun résultat. Pour l’essentiel, je voudrais interroger tous les produits de la catégorie 102 et 115. Si je dois utiliser des slugs, je suis sûr qu’il existe un moyen d’obtenir ces informations en fonction de l’ID que j’ai, souhaite éviter 2 requêtes à filtrer par plusieurs catégories.

Est ce que quelqu'un sait comment accomplir cela?

UPDATE: J'ai appris que la séparation des slug de catégorie par des virgules dans l'argument product_cat produirait un effet "OU", ce qui permettra de combiner des produits distincts des deux, mais ce n'est pas ce que je recherche. Donc, par exemple:

 'product_cat' => 'category-slug1, category-slug2'

renverra les produits des deux catégories au total, mais je cherche toujours un moyen de trouver des produits distincts qui appartiennent UNIQUEMENT aux deux catégories ou à plusieurs. 

12
RCNeil

Wow, alors après des heures à me cogner la tête, voici comment j'ai pu résoudre ce problème - 

$args = array(
    'posts_per_page' => -1,
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'category-slug1'
        ),
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'category-slug2'
        )
    ),
    'post_type' => 'product',
    'orderby' => 'title',
);
$the_query = new WP_Query( $args );

Cela tire parti de l’argument tax_query, y compris le relation => 'AND', pour s’assurer que le produit entre dans les DEUX catégories.

J'espère que cela aidera quelqu'un dans le futur. 

Je ne pouvais pas non plus comprendre comment passer un identifiant plutôt qu'un slug (bien que je sois sûr qu'il existe un moyen), mais voici la fonction permettant de récupérer le slug à partir d'un identifiant:

$terms = get_term($YOURID, 'product_cat'); 
$theslug = $terms->slug; 
27
RCNeil

Pour interroger par catégorie_ID c'est ce qui a fonctionné pour moi.

// First obtain term id:
//...
$all_categories = get_categories( $args );
$cat_ids = array();

foreach ($all_categories as $cat) 
{
     array_Push($cat_ids, $cat->term_id);
}

//Now use ids from array:
$args = array(
    'posts_per_page' => -1,
    'post_type' => 'product',
    'tax_query'     => array(
        array(
            'taxonomy'  => 'product_cat',
            'field'     => 'id', 
            'terms'     => $cat_ids
        )
    )
);
10
user2718602

À partir du codex WordPress sur WP_Query pour les paramètres de catégorie :

équivalent de OU

$args = array( 'product_cat' => 'category-slug1,category-slug2' ) );

équivalent de ET

$args = array( 'product_cat' => 'category-slug1+category-slug2' );

par exemple.

$query = new WP_Query( $args );
6
Daniel Twork

Dans le tableau d'un tableau 'tax_query', vous pouvez spécifier un 'opérateur' à exécuter sur la requête. Vous pouvez réaliser ce que vous voulez en utilisant l'opérateur 'AND'.

$args = array(
'posts_per_page' => -1,
'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'product_cat',
        'field' => 'slug',
        'terms' => array( 'category-slug1', 'category-slug2' )
        'operator => 'AND',
    ),
),
'post_type' => 'product',
'orderby' => 'title',
);
$the_query = new WP_Query( $args );

Tous les produits sélectionnés par cette requête correspondront aux "termes" fournis. Voir ce lien pour plus d’informations: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

Au cas où le lien se briserait, voici les informations pertinentes:

operator (string) - Opérateur à tester. Les valeurs possibles sont 'IN', 'NOT IN', 'AND', 'EXISTS' et 'NOT EXISTS'. La valeur par défaut est 'IN'. 

0
asdf