Accueil » Conseils & tutoriels sites internet » Tutoriels Wordpress » Woocommerce : créer un produit gratuit si un autre est dans le panier

Woocommerce : créer un produit gratuit si un autre est dans le panier

Imaginons que vous souhaitiez créer une réduction plutôt spécifique, à savoir que vous offrez un produit si un autre est dans le panier, ou encore si encore un autre produit se trouve dans le panier. Par exemple, pour l’achat d’un ampli de guitare, vous offrez un lot de médiators. Ou pour l’achat q’une guitare, vous offrez également un lot de médiators (et je dis ça parce que je suis un guitariste passionné).

Votre réduction risque fort de se retrouver avec une utilisation de code promo, et encore, le système Woocommerce ne permet pas ce genre de promotion de manière native, en tout cas pas aussi flexible par raport à des critères aussi précis.

Une petite fonction peut être d’une utilité extraordinaire, avec une ou deux boucles PHP, des conditions pour tester l’identifiant du produit, un ajout automatique du produit au panier, et une mise à zéro du prix d’un produit spécifique. Le blog de Rémi Corson (celui-là, je lui paierai son café ou sa bière un jour) et d’emblée d’une grande utilité, du moins si vous êtes anglophone.

Au passage, j’explique ici comment réaliser automatiquement un code promo WooCommerce sur la première commande, plugin à l’appui. N’oubliez pas de jeter un oeil à la boutique WordPress WooCommerce de la Team, nous y avons des plugins gratuits ou non dédiés à cet effet !

Trouver l’identifiant du ou des produits qui doivent se trouver dans le panier

Déterminez avec précision quel est l’identifiant du produit qui doit se trouver dans le panier, pour que l’autre soit gratuit. Woocommerce vous le précise lorsque vous survolez avec la souris la liste de vos produits, un par un.

Une capture d’écran est plutôt complexe, surtout lorsqu’il s’agit de survol, et vous me pardonnerez d’utiliser actuellement un vieux PC tout pourri avec seukeent 20Go d’espace, et peu de fonctionnalités utiles, mais ce lien devrait vous être d’une grande aide :

Identifier rapidement l’ID de vos articles, pages, catégories et tags et produits !

Créer une petite fonction dans le fichier functions.php

OK, vous disposez de vos identifiants de produits, y compris celui qui doit être gratuit. Vous allez donc agir sur deux hooks Woocommerce, celui d’ajout au panier, et celui qui calcule le panier.

Les hooks se nomment template_redirect pour le rechargement d’une page ou un changement de page simple et woocommerce_before_calculate_totals pour ce qui concerne le calcul du panier.

Voici la fonction :

<?php

//Add free product to cart based on date and products in cart
add_action( 'template_redirect', 'add_product_to_cart' );
add_action( 'woocommerce_before_calculate_totals', 'add_product_to_cart' );
function add_product_to_cart() {
		$dt = new DateTime();
		$current_date = $dt->format('d/m/Y');
		$end_promo = date('d/m/Y', '01/09/2015');
		//Des fois que vous souhaitiez ajouter une condition de date à votre promo, pour en déterminer la fin par exemple
		//Si vous n'en avez pas besoin, supprimez les lignes ci-dessus
		$product_id = 120;
		//Le produit gratuit, retrouvez l'id du produit dans votre back-office
		$anti_eau_id = 118;
		$anti_bruit_id = 7158;
		//Un par un, les produits qui doivent se trouver dans le panier
		$allowed_products = array(120, 118, 7158);
		//La liste de tous les produits, y compris le gratuit
		$found = false;
		//Un booléen, qui précise si le produit gratuit se trouve dans le panier ou non
		//check if product already in cart
		if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
			foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
				$_product = $values['data'];
				if ( $_product->id == $product_id ){
					$found = true;
				} elseif ( $_product->id == $anti_eau_id ){
					$found = false;
				} elseif ( $_product->id == $anti_bruit_id ){
					$found = false;
				} else {
					$found = true;
				}
			}
			// if products not found, add it
			if ( ! $found )
					WC()->cart->add_to_cart( $product_id );
				foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
					$_product = $values['data'];
					//On teste si le produit est dans la liste de produits autorisés
					if ( in_array( $_product->id, $allowed_products )){
						//Et on teste tout simplement si le panier contient plus d'un produit, et si le produit gratuit se trouve dedans
						if ( $_product->id == 120 && sizeof( WC()->cart->get_cart() ) >= 1){
							$_product->price = 0;	
						}
					} else {
						//Au cas où, ajoutez un petit echo afin de préciser la promo à ceux qui l’ignorent !
					}
				}
		}

Alors, Woocommerce, toujours aussi compliqué ?

Je vous filerai bien un lien pour tester, mais l’échéance est tombée et la fonction de date interdit l’ajout au panier interdit un prix à zéro 😀 😀

Imprimer Imprimer
Suivre Cyssoo:

Développeur - formateur

Je cherche à display errors le monde, vous auriez pas la doc' ? Follow me on Twitter !

2 Responses

  1. vigliola
    | Répondre

    Bonjour si on utilise un théme enfant on place la fonction dans le théme parent svp?

    • Cyril CHALAMON
      | Répondre

      Bonjour,
      Si on utilise un thème enfant, toute fonction est à ajouter dedans 🙂
      Le fichier functions.php du thème enfant est dédié à cela. S’il n’existe pas, il faudra le créer manuellement

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.