Come aggiungere automaticamente un prodotto gratuito con coupon in WooCommerce

Come aggiungere automaticamente un prodotto gratuito con coupon in WooCommerce

Se gestisci un e-commerce con WooCommerce, sai bene quanto le promozioni siano fondamentali per incentivare gli acquisti. Una strategia particolarmente efficace è quella di offrire un prodotto omaggio (Free gift) quando il cliente utilizza un determinato codice sconto (coupon). In questo articolo vediamo come aggiungere automaticamente un prodotto gratuito con coupon in WooCommerce

Come offrire un prodotto gratuito con il coupon e perché?

L’aggiunta di un omaggio al carrello è una tecnica di marketing collaudata che offre diversi vantaggi:

  • Aumenta il valore percepito dell’offerta
  • Incentiva l’utilizzo dei coupon e quindi le conversioni
  • Fidelizza il cliente che si sente premiato
  • Differenzia la tua offerta dalla concorrenza

Invece di limitarti a uno sconto percentuale, puoi sorprendere i tuoi clienti con un prodotto gratuito che appare magicamente nel carrello non appena inseriscono il coupon.

Come funziona la soluzione

Il codice proposto gestisce automaticamente l’intero ciclo di vita del regalo:

  1. Quando il cliente applica uno dei coupon configurati, il prodotto omaggio viene aggiunto al carrello con prezzo azzerato
  2. Se il cliente rimuove il coupon, anche il regalo viene eliminato
  3. Il prodotto gratuito mostra un’etichetta “GRATUITO” ben visibile
  4. Se il carrello rimane vuoto (eccetto il regalo), viene svuotato completamente

Il codice da inserire per aggiungere un Free Gift al carrello

Aggiungi il seguente codice nel file functions.php del tuo tema child, se il tuo sito non ha un tema child ti consiglio di attivarlo: leggi questo post.

Nella funzione webzone_free_gift_config() dovrai modificare due parametri:

  • coupon_codes: l’array contenente i codici coupon che attivano il regalo
  • product_id: l’ID del prodotto WooCommerce da regalare

Per trovare l’ID di un prodotto, vai in WooCommerce → Prodotti, passa il mouse sul prodotto desiderato e vedrai l’ID nell’URL o nel tooltip.

Copia ed incolla il codice seguente nel file functions.php

// *** Funzione per aggiungere prodotto regalo al carrello ***
function webzone_free_gift_config() {
    return array(
        'coupon_codes' => array('PromoFreeGift', 'SCONTO201234567', 'PROMO151234567'),
        'product_id' => 13879
    );
}
// Funzione helper per verificare se un coupon target è applicato
function webzone_is_target_coupon_applied($coupon_code = null) {
    $config = webzone_free_gift_config();
    if ($coupon_code !== null) {
        return in_array(strtoupper($coupon_code), array_map('strtoupper', $config['coupon_codes']));
    }
    foreach ($config['coupon_codes'] as $code) {
        if (WC()->cart && WC()->cart->has_discount(strtolower($code))) {
            return true;
        }
    }
    return false;
}
// Aggiungi prodotto gratuito quando viene applicato un coupon specifico
add_action('woocommerce_applied_coupon', 'webzone_add_free_gift_on_coupon_applied');
function webzone_add_free_gift_on_coupon_applied($coupon_code) {
    $config = webzone_free_gift_config(); 
    if (!webzone_is_target_coupon_applied($coupon_code)) return;
    foreach (WC()->cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] == $config['product_id']) return;
    }
    WC()->cart->add_to_cart($config['product_id'], 1);
    wc_add_notice('Prodotto gratuito aggiunto al carrello!', 'success');
}
// Rimuovi il prodotto gratuito quando il coupon viene rimosso
add_action('woocommerce_removed_coupon', 'webzone_remove_free_gift_on_coupon_removed');
function webzone_remove_free_gift_on_coupon_removed($coupon_code) {
    $config = webzone_free_gift_config();    
    if (!webzone_is_target_coupon_applied($coupon_code)) return;
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        if ($cart_item['product_id'] == $config['product_id']) {
            WC()->cart->remove_cart_item($cart_item_key);
            wc_add_notice('Prodotto gratuito rimosso dal carrello.', 'notice');
            break;
        }
    }
}
// Imposta il prezzo del prodotto regalo a 0
add_action('woocommerce_before_calculate_totals', 'webzone_set_free_gift_price_to_zero');
function webzone_set_free_gift_price_to_zero($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    if (did_action('woocommerce_before_calculate_totals') >= 2) return;
    $config = webzone_free_gift_config();
    if (!webzone_is_target_coupon_applied()) return;
    foreach ($cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] == $config['product_id']) {
            $cart_item['data']->set_price(0);
        }
    }
}
// Impedisci la rimozione manuale del prodotto regalo
add_filter('woocommerce_cart_item_remove_link', 'webzone_disable_free_gift_removal', 10, 2);
function webzone_disable_free_gift_removal($remove_link, $cart_item_key) {
    $config = webzone_free_gift_config();
    if (!webzone_is_target_coupon_applied()) return $remove_link;
    $cart_item = WC()->cart->get_cart()[$cart_item_key];
    if ($cart_item['product_id'] == $config['product_id']) {
        return '';
    }
    return $remove_link;
}
// Aggiungi etichetta "GRATUITO" al prodotto regalo nel carrello
add_filter('woocommerce_cart_item_name', 'webzone_add_free_gift_label_in_cart', 10, 3);
function webzone_add_free_gift_label_in_cart($product_name, $cart_item, $cart_item_key) {
    $config = webzone_free_gift_config();
    if (!webzone_is_target_coupon_applied()) return $product_name;
    if ($cart_item['product_id'] == $config['product_id']) {
        $product_name .= ' <span style="background: #28a745; color: white; padding: 2px 6px; border-radius: 3px; font-size: 0.8em; font-weight: bold;">GRATUITO</span>';
    }
    return $product_name;
}
// Pulisci il carrello se rimane solo il regalo
add_action('woocommerce_cart_item_removed', 'webzone_clean_cart_if_only_free_gift_remains');
function webzone_clean_cart_if_only_free_gift_remains() {
    $config = webzone_free_gift_config();
    $non_gift_items = 0;
    foreach (WC()->cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] != $config['product_id']) {
            $non_gift_items++;
        }
    }
    if ($non_gift_items == 0 && WC()->cart->get_cart_contents_count() > 0) {
        WC()->cart->empty_cart();
    }
}

Personalizzazioni possibili

Il codice è facilmente estendibile. Ecco alcune idee:

Regali diversi per coupon diversi: potresti modificare la logica per associare un regalo specifico a ciascun coupon, creando un array associativo nella configurazione.

Condizioni aggiuntive: potresti aggiungere un importo minimo del carrello prima che il regalo venga aggiunto, verificando il totale con WC()->cart->get_subtotal().

Messaggi personalizzati: i testi delle notifiche sono facilmente modificabili nelle chiamate a wc_add_notice().

Stile dell’etichetta: il badge “GRATUITO” può essere personalizzato modificando gli stili inline o aggiungendo una classe CSS dedicata.

Considerazioni importanti

Prima di implementare questa funzionalità, tieni presente alcuni aspetti:

Gestione magazzino: se il prodotto regalo ha una giacenza limitata, ricorda che verrà decrementata ad ogni ordine. Potresti voler usare un prodotto virtuale o disabilitare la gestione stock per l’omaggio.

Compatibilità: il codice utilizza hook standard di WooCommerce ed è compatibile con le versioni recenti. Tuttavia, alcuni temi o plugin potrebbero modificare il comportamento del carrello, quindi testa sempre in un ambiente di staging.

Performance: le funzioni vengono eseguite ad ogni modifica del carrello. Con la configurazione centralizzata che ti propongo, l’impatto è minimo, ma evita di aggiungere logiche troppo complesse.

Conclusione

Con poche righe di codice PHP puoi trasformare una semplice promozione in un’esperienza d’acquisto memorabile per i tuoi clienti. Il regalo automatico nel carrello è un tocco di classe che dimostra attenzione al cliente e può fare la differenza nelle tue campagne marketing.