Lorsque l’on fait du e-commerce, il arrive que l’on doivent ajouter des coûts supplémentaires à des produits, comme des frais de gestion, un dépôt de garantie, etc. Sous Woocommerce, ajouter des coûts à un panier est assez simple, mais l’ajouter en fonction du produit, et en faisant en sorte que la valeur soit administrable, c’est autre chose. Je vous propose ici un petit tuto sur la façon de procéder.
Les attributs
Woocommerce dispose du système d’attributs, récurrent dans les solutions de e-commerce. C’est par ce système que nous allons passer. Dans un premier temps donc, vous devez créer les attributs que vous allez utiliser pour ajouter des coûts à vos produits.
Faites bien attention à l’identifiant que vous allez donner à votre attribut, car c’est de lui dont on va se servir pour ajouter le surcoût.
Une fois ces éléments créés, vos gestionnaires pourront, dans la fiche produit, sélectionner directement l’attribut et l’ajouter à la fiche.
Attention à ne mettre dans ces attributs que des nombres, sans quoi le résultat sera faussé, puisque les valeurs seront converties en float.
Pour l’exemple présent, j’ai créé deux attributs : frais d’activation et dépôt de garantie, pour deux comportements différents. Les frais d’activation s’appliqueront à chaque itération du produit dans le panier, tandis que le dépôt de garantie ne s’applique qu’une seule fois, quel que soit le nombre de fois que le produit se trouve dans le panier.
Le code
Pour ajouter les coûts dont nous avons besoin, nous allons utiliser la méthode « get_attribute » (WC_Product) pour récupérer nos attributs, et la méthode « add_fee » (WC_Cart) pour ajouter au panier le coût ainsi récupéré. Ajoutez le code suivant dans votre fichier functions.php de votre thème.
function my_custom_costs(){ global $woocommerce; if(is_admin() && !defined('DOING_AJAX')) return; //Initialisation des coûts $garatie_cost = 0; $activation_cost = 0; //Parcours du panier $cart = $woocommerce->cart->get_cart(); foreach($cart as $product) { $the_product = get_product($product['product_id']); //Dépôt de garantie, un unique coût pour ce produit $garantie_cost += (float) $the_product->get_attribute("pa_depot-de-garantie"); //Frais d'activation, un coût par produit $nb_products = $product['quantity']; $activation_cost += ((float) $the_product->get_attribute("pa_frais-activation")) * $nb_products; } //Application des coûts calculés if($garantie_cost) { $woocommerce->cart->add_fee("Dépôt de garantie", $garantie_cost, true, ''); } if($activation_cost) { $woocommerce->cart->add_fee("Coût d'activation", $activation_cost*$nb_products, true, ''); } } add_action('woocommerce_cart_calculate_fees','my_custom_costs');
Que fait cette fonction ?
Pour chaque produit du panier, elle récupère les valeurs des attributs Frais d’activation et Dépôt de garantie. Les identifiants des attributs définis en BO commencent tous par « pa_ » (Product Attribute). Elle ajoute ensuite cette valeur à un total qui sera ensuite ajouté au panier. Pourquoi cette méthode ? Simplement parce qu’il est impossible d’ajouter le coût au cas par cas. L’ajout de coût ne peut se faire que sur le panier global, il faut donc additionner les différents coûts issus des différents produits du panier.
Les Frais d’activation nécessitent d’être itérés autant de fois que le produit auquel ils sont associés. Autrement dit, je dois multiplier le coût additionnel par le nombre de fois que le produit existe dans le panier, ce qui explique le petit multiplicateur.
Il est à noter que les coûts additionnels tels que configurés ici sont soumis à la taxation.
Une fois la boucle terminée, j’ajoute les coûts additionnels finaux au panier.
Cette fonction est perfectible
Elle peut servir de base, mais peut totalement être adaptée selon vos besoins. Par exemple, vous pourriez ajouter un système permettant de lister individuellement les coûts qui ont été ajoutés, plutôt que de ne voir qu’un total pour l’ensemble. De même, certains de vos coûts ne seront peut-être pas soumis aux taxes.
Je vous invite donc à consulter directement le code de la fonction add_fee, pour customiser à l’envie cette fonction.