o
.
o
<
}
<
/
X

NOUS LES DEVS

Woocommerce orderby include

Comment afficher des produits en choisissant précisément leur ordre

Niveau : débutant(e)
</> </> </>

Shortcode

Dans Woocommerce, avec l’utilisation du shortcode [products], il est possible de passer un paramètre ids et de récupérer des produits spécifiques par rapport à leur ID.

Le shortcode suivant me permet de récupérer les produits qui ont les ID 6, 3, 1 et 8.

[products limit="4" columns="4" ids="6,3,1,8"]

Dans l'ordre des ids

Mon but maintenant est d’afficher des produits par ordre d’ajout dans l’attribut ids. Si je reprends mon exemple, je veux d’abord afficher le produit qui a l’ID 6 puis 3 ensuite 1, et pour finir 8.

Woocommerce permet de faire cela. Il faut ajouter le paramètre orderby à la valeur include au niveau du shortcode.

[products limit="4" columns="4" ids="6,3,1,8" orderby="include"]

Normalement ça marche, si ce n’est pas le cas, tu peux lire la suite.

Alias post__in

Mais bizarrement je n’ai pas réussi à le faire tourner. Je pensais que ça allait être hyper simple mais bon voilà, la vie de développeur. Je suis sûr que tu vois de quoi je veux parler.

En cherchant un peu, j’ai remarqué que orderby= »include » était en fait un alias (ce qui est logique) vers la valeur post__in. D’ailleurs ils font grossièrement le mappage dans la méthode get_wp_query_args.

	protected function get_wp_query_args( $query_vars ) {

		// Map query vars to ones that get_wp_query_args or WP_Query recognize.
		$key_mapping = array(
			'status'         => 'post_status',
			'page'           => 'paged',
			'include'        => 'post__in',
			'stock_quantity' => 'stock',
			'average_rating' => 'wc_average_rating',
			'review_count'   => 'wc_review_count',
		);
		foreach ( $key_mapping as $query_key => $db_key ) {
			if ( isset( $query_vars[ $query_key ] ) ) {
				$query_vars[ $db_key ] = $query_vars[ $query_key ];
				unset( $query_vars[ $query_key ] );
			}
		}

		...
}

Faire marcher le truc

Habituellement, pour manipuler le rendu du shortcode [products], je passe toujours par le filtre woocommerce_shortcode_products_query qui il permet de manipuler les arguments de la query.

Et donc c’est exactement ce que je vais faire ici, j’ajoute un add_filter, je crée ma propre fonction et à l’intérieur, je vérifie simplement si orderby est à la valeur include, et si c’est le cas, alors je change la valeur en post__in, et ça fait le job !

add_filter( 'woocommerce_shortcode_products_query', 'gol_product_orderby_include', 10, 1);
function gol_product_orderby_include($query_args){
	if( $attributes["orderby"] == "include" ){
		$attributes["order"] = "";
		$attributes["orderby"] = "post__in";
	}
	return $attributes;
}

A savoir que je n’ai pas tout le temps le problème. J’ai l’impression que c’est uniquement sur certaines versions du plugin ou alors peut-être qu’il y a un autre plugin qui interfère. Pour cette raison, je n’ai pas été plus loin dans la recherche.

17/12/2021

Yann Vangampelaere - nouslesdevs -

NOUS LES DEVS

Vous aimez ce que je fais ? Vous voulez que j'en fasse plus ? dans le développement du blog.