2 votes

Application automatique du coupon une seule fois par utilisateur en fonction du total des dépenses dans WooCommerce

Je voudrais appliquer un coupon automatiquement en fonction du montant total dépensé par le client. Ce coupon doit être appliqué une seule fois par le client.

C'est ce que j'ai essayé jusqu'à présent, mais je n'obtiens qu'un écran vide :

add_action( 'woocommerce_before_calculate_totals', 'loyalty_order_discount', 10, 1 );

function loyalty_order_discount( $order_id ) {
    global $woocommerce;

    $coupon = 'loyaltydiscount';
    $customer = new WC_Customer(get_current_user_id());
    $total_spent = 30;

    $order = wc_get_order( $order_id );

    foreach( $order->get_used_coupons( $customer ) as $coupon_name ){

        // Retrieving the coupon ID
        $coupon_post_obj = get_page_by_title($coupon_name, OBJECT, 'shop_coupon');
        $coupon_id = $coupon_post_obj->ID;

        $coupons_obj = new WC_Coupon($coupon_id);

        if( $coupons_obj == $coupon && $customer->get_total_spent() < $total_spent ){
            $woocommerce->cart->remove_coupon( $coupon );
        }
        elseif ( ! $coupons_obj == $coupon && $customer->get_total_spent() >= $total_spent){
            $woocommerce->cart->add_discount( $coupon );
        }
    }
}

Toute aide est appréciée.

0voto

LoicTheAztec Points 72349

Vous devez d'abord définir, pour votre coupon, l'option "Limite d'utilisation par utilisateur" à 1. (et économiser) comme :

enter image description here

Maintenant, le code revisité suivant appliquera automatiquement un coupon spécifique une seule fois lorsque le total des dépenses du client aura atteint un montant défini :

add_action( 'woocommerce_before_calculate_totals', 'enable_customer_loyalty_discount', 10, 1 );
function enable_customer_loyalty_discount( $cart ) {
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || ! is_user_logged_in() )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    //Your settings below
    $coupon_code = 'loyaltydiscount';
    $coupon_code = 'summer';
    $total_spent = 30;

    if( ! in_array( $coupon_code, $cart->get_applied_coupons() ) ) {
        $user_id  = get_current_user_id(); // User ID

        // Get the WC_Customer instance Object
        $customer = New WC_Customer( $user_id );
        $email    = $customer->get_billing_email(); // Billing email

        // If the user total spent has not reached the define amount, we exit
        if( $customer->get_total_spent() < $total_spent ) {
            return;
        }

        // Get the WC_Coupon instance Object
        $coupon = New WC_Coupon( $coupon_code );

        // If the coupon has already been used by the customer, we exit
        if( array_intersect( array($user_id, $email), $coupon->get_used_by() ) {
            return;
        }

        $cart->apply_coupon( $coupon_code );
    }
}

Le code va dans le fichier function.php de votre thème enfant actif (ou thème actif). Testé et fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X