[Résolu] Ajout automatique d’un produit gratuit au panier (sans code promo) (Créer un compte)

  • WordPress :5.8
  • Statut : résolu
15 sujets de 1 à 15 (sur un total de 24)
  • Auteur
    Messages
  • #2392272
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    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 );
    }
    }
    }
    }

    #2392301
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Oops petite erreur!

    • Cette réponse a été modifiée le il y a 2 années et 11 mois par ferman.
    #2392316
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Bonjour,

    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 fonction

    function 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 fonction

    Pour 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.

     

    #2392322
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Je 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.

    #2392326
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Autre chose: à la ligne 23 de la première fonction: remplacer « total-$free_product_price  » par simplement « total ».

    #2392327
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    Bonsoir 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.

    • Cette réponse a été modifiée le il y a 2 années et 11 mois par Mandes.
    • Cette réponse a été modifiée le il y a 2 années et 11 mois par Mandes.
    #2392331
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    Correction : pas d’erreur sur function bbloomer (l’erreur c’était moi) 🙂

    #2392340
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Alors:

    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.

     

    #2392341
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    J’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 🙂

     

     

    #2392343
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Tout 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.

     

    #2392386
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    Bonjour,

    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 🙂

    #2392389
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    Pouvez-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.
    #2392391
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    Bonsoir,

    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.

    #2392395
    ferman
    Modérateur
    Maître WordPress
    7297 contributions

    La 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.

     

    • Cette réponse a été modifiée le il y a 2 années et 11 mois par ferman.
    • Cette réponse a été modifiée le il y a 2 années et 11 mois par ferman.
    #2392404
    Mandes
    Participant
    Chevalier WordPress
    158 contributions

    Merveilleux. Tout à l’air ok maintenant.

    Merci infiniment Ferman.

15 sujets de 1 à 15 (sur un total de 24)
  • Vous devez être connecté pour répondre à ce sujet.