Accueil » Conseils & tutoriels sites internet » Tutoriels WooCommerce » WooCommerce : un code promo sur la première commande

WooCommerce : un code promo sur la première commande

Posté dans : Tutoriels WooCommerce 0

Sur WooCommerce, il est très facile d’automatiser de nombreux éléments depuis un thème enfant. Comme d’habitude, si vous n’en avez pas, je vous invite à en créer un en suivant notre tutoriel de création de child theme, tout ce qui suit ici sera basé sur le principe que cela a été réalisé.

L’idée est la suivante : sur chaque première commande sur notre site, il faut générer un code de réduction de 20%, l’enregistrer avec une utilisation unique et sans limite de temps, pour un seul utilisateur. Ce code devra également être affiché sur notre site, sur la page de confirmation de commande (ou de remerciements).

Cela va se dérouler en trois étapes (puisque vous avez un thème enfant 🙂 ) :

Le sommaire du code promo WooCommerce avec Cyssoo

Comme de bien entendu, afin d’éviter que le code promotionnel ne soit récupéré par une tierce personne, nous allons nous efforcer de le sécuriser.

Détection de la commande gratuite

Au niveau du hook utilisé, il ne sert à rien de se greffer dans le tunnel de commande, cela serait même risqué de générer des codes promotionnels à cet emplacement. Il faut qu’en premier la commande soit bien passée, puis que selon son montant nous générions un code promotionnel.

Encore mieux, testons si la commande a un montant à zéro (commande gratuite donc) et si c’est le cas, clôturons la commande directement. Sur le site de la Team, cela se révèle très utile car au vu du nombre de modules et plugins que nous offrons, cela pourrait nous polluer la gestion des commandes WooCommerce.

Tout ce dont nous avons besoin, c’est de l’identifiant de la commande, et greffer une fonction sur la page de confirmation de commande (également appelée page de remerciements).

Créons cela :

add_action( 'woocommerce_thankyou', 'complete_free_orders', 10, 1 );
function complete_free_orders( $order_id ) {
//code
}

L’objet WC_ORDER() sur WooCommerce prenant en paramètre l’identifiant de la commande $order_id, il est à présent très simple de récupérer l’intégralité des informations de la commande comme ceci :

add_action( 'woocommerce_thankyou', 'complete_free_orders', 10, 1 );
function complete_free_orders( $order_id ) {
    $order = new WC_Order( $order_id );
}

Et la class WC_ORDER() possédant des méthodes publiques très utiles, savoir si le montant est nul ou à zéro n’est pas bien difficile, tout comme mettre à jour son statut en conséquence…

Notre fonction de clôture des commandes à zéro est donc en place :

add_action( 'woocommerce_thankyou', 'complete_free_orders', 10, 1 );
function complete_free_orders( $order_id ) {
    $order = new WC_Order( $order_id );
    if ($order->get_total() == 0) {
        $order->update_status('completed');
    }
}

Avec l’état « completed », la commande est considérée comme terminée. Testez une commande gratuite sur notre boutique, vous verrez !

Création du code promotionnel

Récompensons les personnes qui ont eu la délicatesse de passer une commande qui n’est pas nulle ou à zéro 🙂

Il va falloir ajouter un élément à notre condition qui – pour le moment – ne traite que les commandes « nulles ». Avant toute chose, testons si la personne a déjà fait l’affaire d’un code promotionnel sur une première commande, ou tout au moins une première fois.

Nous allons associer l’information directement au compte client, puisque celui-ci est bien enregistré depuis la commande.

WordPress nativement dispose de la fonction get_user_meta() qui nous permet de récupérer des informations selon trois paramètres : l’identifiant de l’utilisateur, une clé, et une valeur. Vous pouvez retrouver davantage d’information sur get_user_meta sur le Codex ici.

Appelons notre clé « first_voucher », nous en changerons la valeur une fois le code promotionnel généré. Notre fonction est d’emblée transformée en ceci :

    add_action( 'woocommerce_thankyou', 'complete_free_orders', 10, 1 );
    function complete_free_orders( $order_id ) {
        $order = new WC_Order( $order_id );
        if ($order->get_total() == 0) {
            $order->update_status('completed');
        } else {
            if (!get_user_meta($order->get_customer_id(), 'first_voucher', true)) {
                // Code
            }
        }
    }

Et si vous pensiez que pour la création du code, c’était compliqué, c’est que vous n’avez pas particulièrement recherché sur internet 😉 . WooCommerce offre directement sur Github les sources, et par-dessus le marché en parle dans sa documentation.

            $code = uniqid();
            $coupon_code = 'TEAMEVER_'.$code; // Code
            $amount = '20'; // Amount
            $discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product
                      
            $coupon = array(
              'post_title' => $coupon_code,
              'post_content' => '',
              'post_status' => 'publish',
              'post_author' => 1,
              'post_type'   => 'shop_coupon'
            );
                      
            $new_coupon_id = wp_insert_post( $coupon );
            update_post_meta( $new_coupon_id, 'discount_type', $discount_type);
            update_post_meta( $new_coupon_id, 'coupon_amount', $amount);
            update_post_meta( $new_coupon_id, 'individual_use', 'yes');
            update_post_meta( $new_coupon_id, 'usage_limit_per_user', '1');
            update_post_meta( $new_coupon_id, 'product_ids', '' );
            update_post_meta( $new_coupon_id, 'exclude_product_ids', '');
            update_post_meta( $new_coupon_id, 'usage_limit', '1');
            update_post_meta( $new_coupon_id, 'expiry_date', '');
            update_post_meta( $new_coupon_id, 'apply_before_tax', 'yes');
            update_post_meta( $new_coupon_id, 'free_shipping', 'no');
            update_post_meta( $new_coupon_id, 'customer_email', $order->get_billing_email());

Ne reste plus qu’à mettre à jour l’information précisant que l’utilisateur a déjà eu son code promotionnel « first_voucher » avec update_user_meta(), qui met à jour une information d’utilisateur selon une clé et une valeur :

            update_user_meta($order->get_customer_id(), 'first_voucher', true);

La fonction complète et déjà fonctionnelle permettant de générer un code promotionnel sur WooCommerce pour une première commande passée sur votre boutique est terminée désormais. Elle est donc comme ceci :

add_action( 'woocommerce_thankyou', 'complete_free_orders', 10, 1 );
function complete_free_orders( $order_id ) {
    $order = new WC_Order( $order_id );
    if ($order->get_total() == 0) {
        $order->update_status('completed');
    } else {
        if (!get_user_meta($order->get_customer_id(), 'first_voucher', true)) {
            $code = uniqid();
            $coupon_code = 'TEAMEVER_'.$code; // Code
            $amount = '20'; // Amount
            $discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product
                      
            $coupon = array(
              'post_title' => $coupon_code,
              'post_content' => '',
              'post_status' => 'publish',
              'post_author' => 1,
              'post_type'   => 'shop_coupon'
            );
                      
            $new_coupon_id = wp_insert_post( $coupon );
            update_post_meta( $new_coupon_id, 'discount_type', $discount_type);
            update_post_meta( $new_coupon_id, 'coupon_amount', $amount);
            update_post_meta( $new_coupon_id, 'individual_use', 'yes');
            update_post_meta( $new_coupon_id, 'usage_limit_per_user', '1');
            update_post_meta( $new_coupon_id, 'product_ids', '' );
            update_post_meta( $new_coupon_id, 'exclude_product_ids', '');
            update_post_meta( $new_coupon_id, 'usage_limit', '1');
            update_post_meta( $new_coupon_id, 'expiry_date', '');
            update_post_meta( $new_coupon_id, 'apply_before_tax', 'yes');
            update_post_meta( $new_coupon_id, 'free_shipping', 'no');
            update_post_meta( $new_coupon_id, 'customer_email', $order->get_billing_email());
            update_user_meta($order->get_customer_id(), 'first_voucher', true);
        }
    }
}

Ces codes promotionnels seront donc uniques, basés sur une information en préfixe (TEAMEVER_) et une chaîne de caractères générée selon la date de la commande, uniquement pour une première commande et pour un seul utilisateur (le code promotionnel ne fonctionnera pas pour d’autres utilisateurs).

Affichage du code promotionnel

Maintenant que ces codes promotionnels sont en place, encore faut-il les afficher, sans quoi comment voulez-vous que vos clients sachent qu’ils ont des réductions en remerciement de leur confiance ?

Le hook de confirmation de commande est celui-ci :

<?php do_action( 'woocommerce_thankyou', $order->get_id() ); ?>

Donc nous pouvons directement afficher un code promotionnel et du texte à cet endroit !

Mettons cela en code.

            $voucher_msg = '<div class="ever_voucher">';
            $voucher_msg .= '<p><strong>';
            $voucher_msg .= 'Merci pour votre première commande !';
            $voucher_msg .= '</strong></p>';
            $voucher_msg .= '<p><strong>';
            $voucher_msg .= 'Votre code promo : '.$coupon_code.$amount;
            $voucher_msg .= ' d\'une valeur de '.$amount.'%';
            $voucher_msg .= '</strong></p>';
            $voucher_msg .= '</div>';
            echo $voucher_msg;

Pour la suite de la fonction, ne reste plus qu’à intégrer cela dans les conditions. Notre fonction est désormais totalement terminée :

/**
 * Programmaticaly close order if free and create voucher if not
 * @see https://www.team-ever.com/woocommerce-un-code-promo-sur-la-premiere-commande/
 */
add_action( 'woocommerce_thankyou', 'complete_free_orders', 10, 1 );
function complete_free_orders( $order_id ) {
    $order = new WC_Order( $order_id );
    if ($order->get_total() == 0) {
        $order->update_status('completed');
    } else {
        if (!get_user_meta($order->get_customer_id(), 'first_voucher', true)) {
            $code = uniqid();
            $coupon_code = 'TEAMEVER_'.$code; // Code
            $amount = '20'; // Amount
            $discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product
                      
            $coupon = array(
              'post_title' => $coupon_code,
              'post_content' => '',
              'post_status' => 'publish',
              'post_author' => 1,
              'post_type'   => 'shop_coupon'
            );
                      
            $new_coupon_id = wp_insert_post( $coupon );
            update_post_meta( $new_coupon_id, 'discount_type', $discount_type);
            update_post_meta( $new_coupon_id, 'coupon_amount', $amount);
            update_post_meta( $new_coupon_id, 'individual_use', 'yes');
            update_post_meta( $new_coupon_id, 'usage_limit_per_user', '1');
            update_post_meta( $new_coupon_id, 'product_ids', '' );
            update_post_meta( $new_coupon_id, 'exclude_product_ids', '');
            update_post_meta( $new_coupon_id, 'usage_limit', '1');
            update_post_meta( $new_coupon_id, 'expiry_date', '');
            update_post_meta( $new_coupon_id, 'apply_before_tax', 'yes');
            update_post_meta( $new_coupon_id, 'free_shipping', 'no');
            update_post_meta( $new_coupon_id, 'customer_email', $order->get_billing_email());
            update_user_meta($order->get_customer_id(), 'first_voucher', true);
            $voucher_msg = '<div class="ever_voucher">';
            $voucher_msg .= '<p><strong>';
            $voucher_msg .= 'Merci pour votre première commande !';
            $voucher_msg .= '</strong></p>';
            $voucher_msg .= '<p><strong>';
            $voucher_msg .= 'Votre code promo : '.$coupon_code.$amount;
            $voucher_msg .= ' d\'une valeur de '.$amount.'%';
            $voucher_msg .= '</strong></p>';
            $voucher_msg .= '</div>';
            echo $voucher_msg;
        }
    }
}

Nous avons bien évidemment un thème enfant, mettons un peu de design :

.ever_voucher{
    text-align: center;
    border:1px solid #f99654;
    border-radius: 50%;
    padding: 8px;
    -webkit-box-shadow: 10px 10px 5px 0px rgba(140,135,140,1);
    -moz-box-shadow: 10px 10px 5px 0px rgba(140,135,140,1);
    box-shadow: 10px 10px 5px 0px rgba(140,135,140,1);
}

Il va de soi que selon les critères que vous désirez adapter pour ces codes promotionnels, chaque valeur de update_post_meta sera à adapter selon vos besoins, par exemple si vous désirez exclure des produits de ce code promo, ou offrir des frais de port… Demandez-nous en commentaires si vous désirez davantage d’informations sur ce code. Pour notre part, le résultat est celui-ci :

WooCommerce code promo sur commande

Notez qu’il est également possible de modifier les conditions selon n’importe quelle valeur disponible dans la commande, comme son montant, l’email du client, un produit dans la commande… Et automatiser totalement la génération ainsi que la gestion des codes promotionnels sur WooCommerce. Et puis dans le fond, WooCommerce demeure très simple et si peu onéreux !

Vous voulez tester ? Bah passez une commande payante sur notre site ! 😀

Ce tutoriel existe en plugin gratuit WooCommerce (bah tiens…)

https://www.team-ever.com/woocommerce-plugin-de-code-promo-sur-premiere-commande/

Imprimer Imprimer
Suivre Cyssoo:

Développeur - formateur

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

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.