在WooCommerce中,限制客户在特定时间内多次购买特定产品



我正在寻找一个限制,如果访客用户在一周内购买了两次特定产品,他就不能再购买同一产品

我希望根据访客用户的电子邮件应用此限制。

我看过很多与此相关的帖子,但都集中在注册用户上,但我想对访客用户应用此限制。

这是我目前使用的代码,不幸的是没有想要的结果

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);

如有任何帮助,我们将不胜感激。

对于每周特定产品的限制,您可以使用:

  • 基于计费电子邮件地址
  • wc_get_orders提供了一种标准的订单检索方式-wc_get_orders和wc_Order_Query
  • 适用于访客用户或登录用户
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 );

仅适用于访客用户:

更换

// 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'];  
}

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

对于每周特定可变产品的限制,我使用了:

  • 我使用了访客用户限制的父产品ID:
  • 基于计费电子邮件地址
  • 基于电话号码
  • wc_get_orders提供了检索订单的标准方式wc_get_ordersWC_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 );

感谢上面的第一个答案为我提供了开始实施的基础。欢迎对我的代码进行任何进一步的改进。

脚本运行得很好,但如果客户之前购买了特定产品,则不允许购买任何其他产品。

脚本只是检查客户之前是否购买了特定的产品,并阻止他的订单。我添加了一个额外的条件,检查他是否试图购买特定的产品或其他东西。

if( WC()->cart->find_product_in_cart( WC()->cart->generate_cart_id( $specific_product_id ) ) ) {

该代码位于之前

// Show error when total >= limit

最新更新