skip to Main Content

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.

2

Answers


  1. Chosen as BEST ANSWER

    For a restriction for a specific variable product per week i used:

    • I used parent product ID for guest user restricion:
    • Based on the billing email address
    • Based on phone number
    • wc_get_orders provide a standard way of retrieving orders - wc_get_orders and WC_Order_Query
    function action_woocommerce_checkout_process() {
      $specific_product_name = 'Buy iPhone 12 with Z Protect+ included';
    // Only for guests
      if ( is_user_logged_in() ) return;
    
      //product check start
      global $woocommerce;
      $parent_id;
      $_product = '';
      $items = $woocommerce->cart->get_cart();
          foreach($items as $item => $values) { 
              $_product =  wc_get_product( $values['data']->get_id());    
          } 
          $parent_id = $_product->get_parent_id();
        if( $parent_id == 389 ){
      //product check end
    
          // Isset
      if ( isset( $_POST['billing_phone'] ) ) {
          // NOT empty
          if ( ! empty ( $_POST['billing_phone'] ) ) {
              $customer_phone = $_POST['billing_phone'];  
          }
      }
      
      // Isset
      if ( isset ( $customer_phone ) ) {   
             // Time in seconds (1 week)
          $time_in_seconds = 604800;
        
          // Set limit per week
          $limit = 2;
          
          // Specific product name
          $specific_product_name = 'Buy iPhone 12 with Z Protect+ included';
          
          // Get orders from last week from customer by phone
          $orders_last_week_by_customer_phone = wc_get_orders( array(
              'date_created' => '>' . (time() - $time_in_seconds ),
              'billing_phone' => $customer_phone,
          ));
          $total = 0;
        
          // Iterating through each order
          foreach ( $orders_last_week_by_customer_phone as $order ) {
               // Going through order items
              foreach ( $order->get_items() as $item ) {
                    // Name of the producte
                  $product_name = $item->get_name();
                  // Compare
                  if ( $specific_product_name == $product_name ) {                                            
                      // Add to total
                      $total += 1;
                   }
              }
           }
    
          // Show error when total >= limit
          if ( $total >= $limit ) {
              wc_add_notice( sprintf( __( 'You are not allowed to buy more than %d iPhones. For more information please contact support.', 'woocommerce' ), $limit ), 'error' );
          }       
    }
      // Isset
      if ( isset( $_POST['billing_email'] ) ) {
          // NOT empty
          if ( ! empty ( $_POST['billing_email'] ) ) {
              $customer_email = $_POST['billing_email'];  
          }
      }
      
      // 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 = 'Buy iPhone 12 with Z Protect+ included';
          
          // 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_name();
                  // 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 iPhones. For more information please contact support.', 'woocommerce' ), $limit), 'error' );
          }       
      }
      //product check start
    }
    //product check start
    }
    
    add_action( 'woocommerce_checkout_process', 'action_woocommerce_checkout_process', 10, 0 );
    

    Thanks to the 1st answer above for providing me the base to start implementation. Any further improvements in my code are welcomed.


  2. 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'];  
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search