Ajouter de nouveaux paramètres à une requête wc_get_products()

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() et WC_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. wc_get_products() et WC_Product_Query sont similaires aux get_posts() et WP_Query du cœur WordPress. Comme ces derniers, il suffit de passer un tableau d’arguments définissant les critères de recherche.

GitHub : woocommerce/wiki/wc_get_products-and-WC_Product_Query

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 via get_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 ou weight
  • 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ètre stock_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 🙂


Vous avez aimé cet article ?

Partagez-le sur vos réseaux sociaux en guise de remerciement :)


Laisser un commentaire