Dans un contexte de développement d’une boutique WooCommerce, il est souvent bien utile d’utiliser la fonction wc_get_products()
afin de lister des produits WooCommerce selon certains critères.
Mais seuls des critères natifs sont évidemment disponibles via cette fonction. Découvrons comment ajouter nos propres paramètres de requêtes WC_Product_Query
pour rechercher des produits encore plus finement.
Les requêtes WC_Product_Query
et wc_get_products()
Définissons d’abord à quoi sert cette fonction. Le Wiki WooCommerce la présente comme telle :
wc_get_products()
etWC_Product_Query
permettent de récupérer des produits via une méthode standard, d’utilisation sûre et qui ne cassera pas lors de futurs changements dans la base de données WooCommerce.Utiliser
WP_Query
ou construire vos propres requêtes SQL vous assure un code obsolète dans des futures versions de WooCommerce, étant donné que ces données sont susceptibles de changer de tables SQL pour de meilleures performances.C’est donc la bonne pratique à mettre en place par les extensions et thèmes pour récupérer des produits WooCommerce.
GitHub : woocommerce/wiki/wc_get_products-and-WC_Product_Querywc_get_products()
etWC_Product_Query
sont similaires auxget_posts()
etWP_Query
du cœur WordPress. Comme ces derniers, il suffit de passer un tableau d’arguments définissant les critères de recherche.
Tout comme la création de produits (déjà évoquée dans un de nos tutoriels), WooCommerce donne accès à ses données via des méthodes « abstraites ».
A l’heure où j’écris cet article, WooCommerce stocke toujours ses données (produits, commandes) dans une structure WordPress native (des types de contenus & taxonomies aux données sauvegardées dans des tables WordPress communes).
Mais cela risque de bientôt changer ! Une extension « beta » officielle WooCommerce est déjà disponible : l’objectif est que des tables SQL sur-mesure spécifiquement créées par WooCommerce accueillent les données du plugin e-commerce.
Il est donc fortement déconseillé :
- d’aller récupérer des produits WooCommerce en interrogeant directement le type de contenus
product
viaget_posts()
- de créer un produit WooCommerce en utilisant la fonction du cœur WordPress
wp_insert_post()
D’où l’intérêt d’utiliser wc_get_products()
!
Les paramètres de base
Je ne compte pas lister tous les paramètres disponibles — le Wiki WooCommerce les détaillant très bien ! Mais presque tous les champs WooCommerce natifs sont interrogeables.
On peut par exemple :
- chercher des produits selon leur statut (publié, brouillon, etc.) avec le paramètre
status
- récupérer uniquement les produits d’un certain type (simple, variable, groupé, etc.) avec le paramètre
type
- interroger la base WooCommerce en recherchant via un UGS (SKU) avec le paramètre
sku
- rechercher des produits respectant une taille ou poids spécifiques avec les paramètres
width
,length
,height
ouweight
- récupérer des produits ayant été vendus un certain nombre de fois avec le paramètre
total_sales
- savoir quels produits ont un stock spécifique grâce au paramètre
stock_quantity
, ou ceux qui sont en stock ou en rupture de stock avec le paramètrestock_status
- chercher des produits selon leur note moyenne d’avis en utilisant le paramètre
average_rating
Et bien plus encore ! Pour la liste complète, rendez-vous sur le repo GitHub WooCommerce.
Mais que faire si vous souhaitez effectuer une requête sur un champ meta
ajouté par vos soins, appliquer une tax_query
ou tout autre paramètre maison ? Le filtre woocommerce_product_data_store_cpt_get_products_query
est là pour ça !
Ajouter vos propres paramètres personnalisés à wc_get_products()
Derrière son doux petit nom, le filtre woocommerce_product_data_store_cpt_get_products_query
nous permet quelque chose de très pratique : ajouter nos propres paramètres à passer dans le tableau d’arguments de wc_get_products()
et informer WooCommerce que nous souhaitons modifier la requête à effectuer, selon nos nouveaux critères.
Prenons un exemple concret, d’un cas client réel que j’ai eu à résoudre, pour illustrer l’usage de ce filtre.
Récupérer des produits d’un vendeur de l’extension WC Product Vendors
Dans le cadre du développement d’une place de marché WooCommerce avec l’extension WC Product Vendors, j’ai eu besoin d’accéder uniquement aux produits d’un vendeur spécifique.
Autre besoin : lister seulement les produits qu’un vendeur a mis en avant via son tableau de bord (« featured »).
<?php
namespace Mosaika;
/**
* Handle a custom 'vendor' query var to get products of a specific Vendor.
* Handle a custom 'featured_by_vendor' query var to get featured products of a specific Vendor.
*
* @param array $query_args - WP_Query args
* @param array $query_vars - WC_Product_Query args
* @return array Modified $query_args
*/
function add_vendor_custom_wc_query_args( $query_args, $query_vars ) {
// Filter by a unique vendor.
if ( ! empty( $query_vars['vendor'] ) ) {
$query_args['tax_query'][] = [
'taxonomy' => WC_PRODUCT_VENDORS_TAXONOMY,
'field' => 'id',
'terms' => (int) $query_vars['vendor'],
];
}
// Only get vendor featured products, and order by featured time (descending).
if ( ! empty( $query_vars['featured_by_vendor'] ) && (int) $query_vars['featured_by_vendor'] > 0 ) {
$query_args['meta_query'][] = [
'key' => '_featured_by_vendor',
'value' => (int) $query_vars['featured_by_vendor'],
'compare' => '>',
];
$query_args['order'] = 'DESC';
$query_args['orderby'] = 'meta_value_num';
$query_args['meta_key'] = '_featured_by_vendor';
}
return $query_args;
}
add_filter( 'woocommerce_product_data_store_cpt_get_products_query', __NAMESPACE__ . '\\add_vendor_custom_wc_query_args', 10, 2 );
Explications
Entrée
Ce filtre nous permet de hooker notre propre fonction qui acceptera 2 paramètres vitaux en entrée : le tableau de paramètres de la requête WC_Product_Query
(dans la variable $query_args
) et surtout, les paramètres passés dans la fonction wc_get_products()
dans la variable $query_vars
.
C’est dans cette variable qu’on risque probablement de retrouver nos paramètres maison. Dans mon cas, on y retrouve le paramètre vendor
ou bien le paramètre featured_by_vendor
(ou les deux en même temps, l’un n’empêche pas l’autre).
Sortie
En sortie, il doit renvoyer le tableau $query_args
potentiellement modifié contenant les paramètres de requête à effectuer.
Lignes 15 à 21 : dans mon premier cas, j’ai donc enregistré mon propre paramètre vendor
utilisable dans wc_get_products()
pour interroger la base de produits WooCommerce et ne récupérer que les produits d’un vendeur spécifique en ajoutant une recherche sur la taxonomie créée par le plugin (via une tax_query
).
Cela me permet alors de lancer une recherche comme wc_get_products( [ 'vendor' => 8 ] )
pour n’avoir que les produits du vendeur possédant l’ID 8.
Lignes 24 à 34 : deuxième cas, une meta_query
sur-mesure est lancée si j’ajoute le paramètre featured_by_vendor
dans wc_get_products()
. Si présent, ce paramètre imposera à la WC_Product_Query
de ne renvoyer que les produits possédant cette meta donnée (éventuellement supérieure à un timestamp passé, pour ne récupérer que des produits mis en avant après une certaine date).
De plus, l’ordre de la requête d’origine est modifié afin de lister les produits selon un ordre basé sur la valeur de cette meta _featured_by_vendor
. J’ai donc les produits mis en avant par le vendeur, triés selon leur date de mise en avant (les plus récemment mis en avant d’abord).
Cela est maintenant possible grâce à wc_get_products( [ 'featured_by_vendor' => 1 ] )
.
A considérer
Notez bien que cette logique de mise en avant d’un produit par un vendeur (du plugin WC Products Vendors) a été codée sur-mesure dans le cadre d’un projet client, et n’est pas une fonctionnalité du plugin de marketplace. L’exemple utilisé ici ne sert qu’à illustrer l’usage du filtre et l’ajout d’un nouveau paramètre personnalisé à wc_get_products()
.
Conclusion
J’insiste une dernière fois : évitez d’utiliser des fonctions WordPress natives pour récupérer des données WooCommerce !
Nous avons vu comment étendre la WC_Product_Query
de WooCommerce pour créer nos propres paramètres. N’hésitez pas à partager vos usages en commentaires 🙂