'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 1:[1]

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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 LaibaMaqs