Jeffrey Tanuwidjaja
Jeffrey Tanuwidjaja

Reputation: 85

Set discount based on number of orders in WooCommerce

In WooCommerce, how to set discount based on number of order?

For example I would like to apply a discount based on customer orders:

I've search internet but not found any solution or plugins available.

Thanks.

Upvotes: 0

Views: 1758

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 254378

Here is a custom function hooked in woocommerce_cart_calculate_fees that will add to cart a custom discount based on customer orders count, this way:

add_action('woocommerce_cart_calculate_fees' , 'discount_based_on_customer_orders', 10, 1);
function discount_based_on_customer_orders( $cart_object ){

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;  

    // Getting "completed" customer orders
    $customer_orders = get_posts( array(
        'numberposts' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => get_current_user_id(),
        'post_type'   => 'shop_order', // WC orders post type
        'post_status' => 'wc-completed' // Only orders with status "completed"
    ) );

    // Orders count
    $customer_orders_count = count($customer_orders);

    // The cart total
    $cart_total = WC()->cart->get_total(); // or WC()->cart->get_total_ex_tax()

    // First customer order
    if( empty($customer_orders) || $customer_orders_count == 0 ){
        $discount_text = __('First Order Discount', 'woocommerce');
        $discount = -50;
    } 
    // 2nd orders discount
    elseif( $customer_orders_count == 1 ){
        $discount_text = __('2nd Order Discount', 'woocommerce');
        $discount = -30;            
    } 
    // 3rd orders discount
    elseif( $customer_orders_count == 2 ){
        $discount_text = __('3rd Order Discount', 'woocommerce');   
        $discount = -10;        
    }

    // Apply discount
    if( ! empty( $discount ) ){
        // Note: Last argument is related to applying the tax (false by default)
        $cart_object->add_fee( $discount_text, $discount, false);
    }
}

The Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

This code is tested and works.

The only problem can be if customer is not logged in.

You may add, at the beginning, in first condition ! is_user_logged_in() this way:

    if ( is_admin() && ! defined( 'DOING_AJAX' ) && ! is_user_logged_in() )
        return;

Upvotes: 1

Related Questions