Quantcast
Channel: Techie Corner » Web
Viewing all articles
Browse latest Browse all 26

Woocommerce: Coupon for new customer / first order only

$
0
0

woocommerceOne of my customer request to offer a coupon for all new customer / first order only. But i do not manage to find any free plugin that able to achieve this. So i decided to dig into woocommerce checkout process and write my own function to achieve this.

To apply coupon for new customer in Woocommerce, follow the steps below:-

  • Before apply the code below, you have to create a new COUPON. I’ve created a new coupon name ‘firstlove’
  • Now you can copy and paste the code below into your theme functions.php
    /**
     * Frontend validate new customer only coupon code
     * hook: woocommerce_after_checkout_validation
     */
    add_action('woocommerce_after_checkout_validation','check_new_customer_coupon', 0);
    
    function check_new_customer_coupon(){
    	global $woocommerce;
    	// you might change the firstlove to your coupon
    	$new_cust_coupon_code = 'firstlove';
    	
    	$has_apply_coupon = false;
    
    	foreach ( WC()->cart->get_coupons() as $code => $coupon ) {
    		if($code == $new_cust_coupon_code) {
    			$has_apply_coupon = true;
    		}
    	}
    
    	if($has_apply_coupon) {
    			
    		if(is_user_logged_in()) {
    			$user_id = get_current_user_id();
    
    			// retrieve all orders
    			$customer_orders = get_posts( array(
    					'meta_key'    => '_customer_user',
    					'meta_value'  => $user_id,
    					'post_type'   => 'shop_order',
    					'numberposts'=> -1
    			) );
    
    			if(count($customer_orders) > 0) {
    				$has_ordered = false;
    					
    				$statuses = array('wc-failed', 'wc-cancelled', 'wc-refunded');
    					
    				// loop thru orders, if the order is not falled into failed, cancelled or refund then it consider valid
    				foreach($customer_orders as $tmp_order) {
    
    					$order = wc_get_order($tmp_order->ID);
    					if(!in_array($order->get_status(), $statuses)) {
    						$has_ordered = true;
    					}
    				}
    					
    				// if this customer already ordered, we remove the coupon
    				if($has_ordered == true) {
    					WC()->cart->remove_coupon( $new_cust_coupon_code );
    					wc_add_notice( sprintf( "Coupon code: %s is only applicable for new customer." , $new_cust_coupon_code), 'error' );
    					return false;
    				}
    			} else {
    				// customer has no order, so valid to use this coupon
    				return true;
    			}
    
    		} else {
    			// new user is valid
    			return true;
    		}
    	}
    
    }
  • once done, you can try to apply the coupon code for a new customer. It should work as expected.

If the code above could not satisfied your requirement, you can freely modify.

Happy Coding!


Viewing all articles
Browse latest Browse all 26

Trending Articles