- WordPress :5.8
- Statut : résolu
- Ce sujet contient 23 réponses, 3 participants et a été mis à jour pour la dernière fois par Mandes, le il y a 1 année et 2 mois.
-
AuteurMessages
-
2 janvier 2022 à 22 h 06 min #2392272
Bonjour,
Ma configuration WP actuelle
- Version de PHP/MySQL : 7.4.25
- Thème utilisé : storefont
- Extensions en place : WooCommerce PDF Invoices & Packing Slips, WooCommerce Product Archive Customiser, WooCommerce Stripe Gateway, Wordfence Security, WordPress Navigation Menu Links, WPS Cleaner, WPS Hide Login, YITH WooCommerce Added to Cart Popup, Yoast SEO
- Nom de l’hébergeur : ionos
- Adresse du site : mandes.fr
Problème(s) rencontré(s) :
Bonsoir à toutes, tous,
Je souhaite ajouter automatiquement un produit (gratuit, par exemple) au panier en fonction du total du panier. Disons 60€.
Le code suivant le permet. Le problème est que le produit gratuit qui a été chargé dans un panier égal ou supérieur à 60€ n’est pas déchargé si j’abaisse dans un second temps le montant de la commande à moins de 60€. Je cherche donc un moyen de supprimer le produit gratuit du panier si les conditions ne sont plus remplies. Merci pour votre aide précieuse 😉/**
* Ajouter un produit en fonction du total du panier
*/
add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
if ( ! is_admin() ) {
global $woocommerce;
$product_id = 25559; //replace with your product id
$found = false;
$cart_total = 60; //replace with your cart total needed to add above item
if( $woocommerce->cart->total >= $cart_total ) {
//check if product already in cart
if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->get_id() == $product_id )
$found = true;
}
// if product not found, add it
if ( ! $found )
$woocommerce->cart->add_to_cart( $product_id );
} else {
// if no products in cart, add it
$woocommerce->cart->add_to_cart( $product_id );
}
}
}
}3 janvier 2022 à 12 h 28 min #2392301Oops petite erreur!
- Cette réponse a été modifiée le il y a 2 années et 11 mois par ferman.
3 janvier 2022 à 19 h 01 min #2392316Bonjour,
Voici deux fonctions:
La première permet d’ajouter un produit gratuit dès que le montant du panier dépasse un minimum (et d’enlever le produit gratuit dès qu’on revient sous ce minimum). A la base, deux fonctions combinées et (largement 🙂 )modifiées (1), (2)
La deuxième ajoute une notice sur la page panier donnant le produit offert et le montant économisé. A la base, cette fonction adaptée.
function ferman_add_product_to_cart() {
global $woocommerce;
$cart_total = 200;
$free_product = wc_get_product( 1935 );
$total = WC()->cart->total;
$free_product_id = $free_product->get_ID(); // Product Id of the free product which will get added to cart
$free_product_price = $free_product->get_regular_price($free_product_id);
$free_product_reduced_price = $free_product->get_sale_price($free_product_id);
$found = false;
//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->get_id() == $free_product_id )
$found = true;
}
// if product not found, add it
if ( ! $found && $woocommerce->cart->total >= $cart_total ){
WC()->cart->add_to_cart( $free_product_id );
$total = $total-$free_product_price;
}
elseif ($found && $woocommerce->cart->total-$free_product_price <= $cart_total ){
$product_cart_id = WC()->cart->generate_cart_id( $free_product_id );
$cart_item_key = WC()->cart->find_product_in_cart( $product_cart_id );
if ( $cart_item_key ) {WC()->cart->remove_cart_item( $cart_item_key );}
else {return;}
}
}
else {
return;
}
}
add_action( 'template_redirect', 'ferman_add_product_to_cart' );Première fonctionfunction bbloomer_find_product_in_cart_modif() {
$free_product = wc_get_product( 1935 );
$free_product_id = $free_product->get_ID();
$free_product_price = $free_product->get_regular_price($free_product_id);
$free_product_name = $free_product->get_name($free_product_id);
$in_cart = false;
foreach( WC()->cart->get_cart() as $cart_item ) {
$product_in_cart = $cart_item['product_id'];
if ( $product_in_cart === $free_product_id ) $in_cart = true;
}
if ( $in_cart ) {
$notice = 'Nous vous offrons le produit '. $free_product_name.' valant normalement '.$free_product_price.' euros.';
wc_print_notice( $notice, 'notice' );
}
}
add_action( 'woocommerce_before_cart', 'bbloomer_find_product_in_cart_modif' );Deuxième fonctionPour que ça fonctionne, vous devez mettre le produit gratuit en « solde » et le prix soldé = 0
Vous devez aussi dans les réglages du produit -> inventaire , cocher « vendre individuellement » sans ça il sera possible d’ajouter le produit gratuit à volonté ce qui n’est pas le but recherché.
Testé: ça fonctionne mais je n’ai pas tout regardé. Vérifiez bien à fond de votre côté pour voir s’il n’y a pas de problème.
3 janvier 2022 à 20 h 26 min #2392322Je viens de voir aux lignes 16 et 17 une coquille: $_product alors que ça devrait être $product.; ça marche quand même mais ce n’est pas correct, il faut corriger.
3 janvier 2022 à 21 h 29 min #2392326Autre chose: à la ligne 23 de la première fonction: remplacer « total-$free_product_price » par simplement « total ».
3 janvier 2022 à 22 h 43 min #2392327Bonsoir Ferman et merci pour ce code merveilleux !
Pour tester j’ai laissé le seuil à 200€.
– J’ai ajouté des produits payants au panier jusqu’à dépasser le seuil pour arriver à : 200.60€ -> le produit gratuit s’est bien ajouté au panier.
– J’ai ensuite ajouté un produit payant. Nouveau montant : 206.50€ -> le produit gratuit est resté dans le panier (parfait).
– J’ai supprimé le dernier produit ajouté, le montant du panier est donc revenu à 200,60€ mais bizarrement le produit gratuit a disparu du panier. Je dois ajouter un produit payant pour que le produit gratuit revienne dans le panier.– Problème : Lignes 16 et 17 : Si je change $_product par $product.; = erreur.
– Ligne 23 de la première fonction: remplacer « total-$free_product_price » par simplement « total » -> OK fait.
– Pour finir, j’ai une erreur si j’ajoute la function bbloomer.
Voilà pour mon petit rapport 😉
Merci beaucoup pour ce code absolument génial.3 janvier 2022 à 22 h 54 min #2392331Correction : pas d’erreur sur function bbloomer (l’erreur c’était moi) 🙂
3 janvier 2022 à 23 h 45 min #2392340Alors:
Problème : Lignes 16 et 17 : Si je change $_product par $product.; = erreur.
Ce n’est pas « $product; » mais « $product » sans « ; » . Le « ; » était la ponctuation de la phrase, pas du code. J’aurais dû mettre des guillemets.
J’ai supprimé le dernier produit ajouté, le montant du panier est donc revenu à 200,60€
Une petite erreur de ma part; à la ligne 25 remplacez » <= » par « < » . Regardez aussi dans woocommerce ->réglages général->options de devise et tout en bas regardez combien de décimales après la virgule vous avez sur votre woocommerce.
3 janvier 2022 à 23 h 59 min #2392341J’ai tout modifié selon vos indications.
Tout semble fonctionner parfaitement.
C’est vraiment du génie.
Votre travail et vos conseils sont d’une immense utilité.
Un grand grand grand merci 🙂
4 janvier 2022 à 0 h 07 min #2392343Tout semble fonctionner parfaitement.
Tant mieux, touchons du bois. Si vous rencontrez une autre erreur merci de venir nous le dire sur le forum.
Pour signaler que le sujet est clos pouvez-vous le passer en « résolu ». Merci.
4 janvier 2022 à 16 h 40 min #2392386Bonjour,
Je viens de m’apercevoir que j’ai cette alerte sur la ligne : $total = total;
Warning: Use of undefined constant total - assumed 'total' (this will throw an Error in a future version of PHP) in /homepages/5/d689643507/htdocs/wp-content/themes/storefrontenfant/functions.php on line 146
Une idée peut-être ?
Merci 🙂
4 janvier 2022 à 18 h 10 min #2392389Pouvez-vous me donner la ligne complète ainsi que les quelques lignes au-dessus et en-dessous? Je n’arrive pas à trouver l’expression $total=total; Et donc ça ne fonctionne pas?
- Cette réponse a été modifiée le il y a 2 années et 11 mois par ferman.
4 janvier 2022 à 18 h 15 min #2392391Bonsoir,
A la ligne 23 de la première fonction vous m’avez demandé de remplacer « total-$free_product_price » par simplement « total ».
Sinon tout fonctionne parfaitement. J’ai juste cette petite alerte. Merci.
4 janvier 2022 à 18 h 30 min #2392395La ligne était « $total-$free_product_price »
remplacer « total-$free_product_price » par simplement « total » devrait conduire pour la ligne à $total=$total et non $total=total. De toute manière, $total = $total est évident. Vous pouvez (et même devez) sans pitié éliminer cette ligne.
Explication: avant le code que je vous ai donné j’avais regardé une autre méthode pour arriver au résultat et là la ligne était nécessaire. En modifiant le code j’ai dû changer plusieurs choses et j’ai zappé cette ligne devenue inutile et qu’il faut donc enlever. L’avertissement devrait disparaître.
4 janvier 2022 à 20 h 58 min #2392404Merveilleux. Tout à l’air ok maintenant.
Merci infiniment Ferman.
-
AuteurMessages
- Vous devez être connecté pour répondre à ce sujet.