问题
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
andWC_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