Limit guest users to buy a particular product multiple times in the same week based on previous orders in WooCommerce

左心房为你撑大大i 提交于 2021-01-07 01:06:11

问题


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 and phone number.

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.


回答1:


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
function action_woocommerce_checkout_process() {
    // Only for guests
    if ( is_user_logged_in() ) return;
    
    // Isset
    if ( isset( $_POST['billing_email'] ) ) {
        // NOT empty
        if ( ! empty ( $_POST['billing_email'] ) ) {
            $customer_email = $_POST['billing_email'];  
        }
    }
    
    // Isset
    if ( isset ( $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( __( 'Guest users 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 );



回答2:


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.



来源:https://stackoverflow.com/questions/65107824/limit-guest-users-to-buy-a-particular-product-multiple-times-in-the-same-week-ba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!