Si vous utilisez WooCommerce pour votre e-boutique et que vous souhaitez trier vos produits WooCommerce de façons spécifique selon la catégorie affichée, cela n’est pas possible.

Heureusement cet article nous fournit une solution facile à mettre en oeuvre en utilisation le plugin ACF Advanced Custom Fields

Pour les utilisateurs du thème WordPress Enfold j’ajouterai en fin d’article la prise en compte de ce tri pour un affichage avec Masonry

Méthode pour modifier le tri des produits WooCommerce en fonction de la catégorie

1 – Installez et activez le plugin ACF
2 – Créer un groupe de champs depuis le menu ACF avec un champs de type « Relation » que l’on nommera product_order (nom arbitraire, utilisé dans le code ci dessous) on lui affectera un « filtre sur les types de publication » produits et un « format dans le modèle » ID de l’article. Enfin affichez ce groupe ACF lorsque le formulaire de taxonomie est égale à la catégorie (product_cat).
Ce champs apparaitra sur la page de modification de vos catégories WooCommerce, et permet pour chaque catégorie, de mettre un place un ordre spécifique d’affichage des produits.

3- Ajoutez le code suivant dans le fichier functions.php de votre thème WordPress enfant (ou dans un plugin). Ce code permet de modifier l’ordre d’affichage des produits sur vos pages de catégorie de produit WooCommerce.

function my_custom_product_order($q)
{
	if(!is_admin())
	{
		// fetch current category id from active query
		$category_id = $q->get_queried_object_id();

		// get array of all product IDs in current category
		$product_ids = get_category_product_ids($category_id);

		// get preferred order from ACF field
		$product_ids_order_preferred = get_field('product_order', 'product_cat_' . $category_id);

		// if we have some product sort order set…
		if($product_ids_order_preferred)
		{
			// merge our preferred category ids array with the array of all products ids, and remove duplicates
			$product_ids = array_unique(array_merge($product_ids_order_preferred, $product_ids));
		}

		// set the 'posts__in' argument to the new array of post IDs (unfortunately wordpress doesn’t let you just pass an array of IDs straight in here)
		$q->set('post__in', $product_ids);

		// set the query orderby value to observe the posts__in field
		$q->set('orderby', 'post__in');
	}
	remove_action('woocommerce_product_query', 'custom_pre_get_posts_query');
}

add_action('woocommerce_product_query', ‘my_custom_product_order’);


// helper function to fetch all product IDs from a specific category ID
function get_category_product_ids($category_id)
{
	$args = array(
			'post_type' => 'product',
			'post_status' => 'publish',
			'fields' => 'ids',
			'posts_per_page' => -1,
			'tax_query' => array(
				array(
					'taxonomy' => 'product_cat',
					'field' => 'term_id',
					'terms' => $category_id,
					'operator' => 'IN'
				)
			)
	);

	$ids = get_posts($args);
	return $ids;
}

Modifier le tri des produits dans l’élément Masonry de Enfold

Dans mon cas, mon site était construit avec le thème Enfold et les produits WooCommerce d’une catégorie étaient affichés via l’élément Masonry.
Le code ci dessus ne fonctionnait pas pour prendre en compte le nouvel ordre d’affichage des produits défini via le champs ACF.
Pour le prendre en compte, il faut utiliser le filtre Enfold avia_masonry_entries_query tel qu’indiqué sur la documentation Enfold et ajouter le bout de code à votre fichier functions.php

add_filter('avia_masonry_entries_query', 'avia_masonry_custom_query');

function avia_masonry_custom_query( $query ) {
	// On applique la modification de l'ordre unniquement si l'outil masonry est affecté aux categories de produit
	$type_cat    = $query['tax_query'][0]['taxonomy'];
	// On récupère l'identifiant de la catégorie sélectionnée
	$category_id = $query['tax_query'][0]['terms'][0];
  if ($type_cat == 'product_cat' && $category_id) {
		// get array of all product IDs in current category
		$product_ids = get_category_product_ids($category_id);
		// get preferred order from ACF field
		$product_ids_order_preferred = get_field('product_order', 'product_cat_' . $category_id);
		// if we have some product sort order set…
		if($product_ids_order_preferred)
		{
			// merge our preferred category ids array with the array of all products ids, and remove duplicates
			$product_ids = array_unique(array_merge($product_ids_order_preferred, $product_ids));
			$query['post__in'] = $product_ids;
			$query['orderby'] = 'post__in';
		}
	}
  return $query;
}

0 réponses

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.