Search code examples
phpwordpresswoocommercecheckoutorders

Limit customers to buy a particular product multiple times within a certain time frame in WooCommerce


I'm looking for a restriction if a guest user has bought a specific product 2 times in a week he must not be able to make another purchase of same product.

Im looking to apply this restriction based on guest user's email.

I've seen many posts related to that but all focus on registered users however i want to apply this restriction for guest users.

This is the code I am currently using, unfortunately without the desired result

function my_ip_checker() {
    $last_order = get_posts(array(
        //'date_created'        => '>=' . (time() - 86400), time in seconds
    'meta_key'    => '_billing_email',
            'meta_value'  => sanitize_email( $_POST['cb_email'] ),
            'post_type'   => 'shop_order',
            'post_status' => array('wc-processing', 'wc-completed')
    ));
    if($last_order->total > 1) { 
        wc_add_notice('Too many orders in the last 24 hours. Please return later.', 'error');
    }
}
add_action('woocommerce_checkout_process', 'my_ip_checker', 10, 0);

Any help is appreciated.


Solution

  • For a restriction for a specific product per week you could use:

    • Based on the billing email address
    • wc_get_orders provide a standard way of retrieving orders - wc_get_orders and WC_Order_Query
    • Will work for guest users or logged in users
    function action_woocommerce_checkout_process() {
        // Initialize
        $customer_email = '';
        
        // Get email
        if ( is_user_logged_in() ) {
            // Get current user
            $user = wp_get_current_user();
            
            // Get email
            $customer_email = $user->user_email;
        } elseif ( isset( $_POST['billing_email'] ) && ! empty ( $_POST['billing_email'] ) ) {
            $customer_email = $_POST['billing_email'];  
        } else {
            // Get billing_email
            $customer_email = WC()->customer->get_billing_email();
        }
        
        // NOT empty
        if ( ! empty ( $customer_email ) ) {      
            // Time in seconds (1 week)
            $time_in_seconds = 604800;
            
            // Set limit per week
            $limit = 2;
            
            // Specific product id
            $specific_product_id = 30;
            
            // Get orders from last week from customer by email
            $orders_last_week_by_customer_email = wc_get_orders( array(
                'date_created'  => '>' . (time() - $time_in_seconds ),
                'customer'      => $customer_email,
            ));
            
            // Total (counter)
            $total = 0;
            
            // Iterating through each order
            foreach ( $orders_last_week_by_customer_email as $order ) {
                // Going through order items
                foreach ( $order->get_items() as $item ) {
                    // Get product ID
                    $product_id = $item->get_product_id();
                    
                    // Compare
                    if ( $specific_product_id == $product_id ) {
                        // Get quantity
                        $quantity = $item->get_quantity();
                        
                        // Add to total
                        $total += $quantity;
                    }
                }
            }
    
            // Show error when total >= limit
            if ( $total >= $limit ) {
                wc_add_notice( sprintf( __( 'You are not allowed to buy more than %d pieces of product with ID = %d in one week', 'woocommerce' ), $limit, $specific_product_id ), 'error' );
            }       
        }
    }
    add_action( 'woocommerce_checkout_process', 'action_woocommerce_checkout_process', 10, 0 );
    

    To apply this only for guest users:

    Replace

    // Get email
    if ( is_user_logged_in() ) {
        // Get current user
        $user = wp_get_current_user();
        
        // Get email
        $customer_email = $user->user_email;
    } elseif ( isset( $_POST['billing_email'] ) && ! empty ( $_POST['billing_email'] ) ) {
        $customer_email = $_POST['billing_email'];  
    }
    

    With

    // Only for guests
    if ( ! is_user_logged_in() ) return;
    
    if ( isset( $_POST['billing_email'] ) && ! empty ( $_POST['billing_email'] ) ) {
        $customer_email = $_POST['billing_email'];  
    }