在一个插件中,我试图不让用户使用相同的账单信息下类似的订单。假设一个名为John Doe billing first name和姓氏的用户下了一个包含product1和product2的订单,而其他人试图下相同或类似的订单(例如包含product1、product2、product3),而上一个订单仍在处理中。所以为了避免这种行为,我尝试在下单前验证订单。如果有任何正在运行的订单具有相同的账单信息,我会抛出一个Woocommerce错误,但我不知道如何确保最后的订单是否也包含类似的项目!这是我的密码:
function check_for_duplicate_order($data)
{
$data['billing_last_name'];
$data['billing_first_name'];
$data['billing_postcode'];
$meta_query_args = array(
'relation' => 'OR', // Optional, defaults to "AND"
array(
'key' => '_billing_postcode',
'value' => '%' . $data['_billing_postcode'],
'compare' => 'LIKE'
),
array(
'key' => '_billing_phone',
'value' => '%' . $data['billing_phone'],
'compare' => 'LIKE'
),
array(
'relation' => 'AND',
array(
'key' => '_billing_first_name',
'value' => $data['billing_first_name'],
'compare' => '='
),
array(
'key' => '_billing_last_name',
'value' => $data['billing_last_name'],
'compare' => '='
)
)
);
$query_params = [
'post_type' => 'shop_order',
'posts_per_page' => 1,
'post_status' => array('wc-pending','wc-processing','wc-on-hold'),
'meta_query' => $meta_query_args
];
$cart_items_ids = [];
global $woocommerce;
$items = $woocommerce->cart->get_cart();
foreach($items as $item => $values) {
$cart_items_ids[] = $values['data']->get_id();
}
}
add_action('woocommerce_after_checkout_validation', 'check_for_duplicate_order');
在上面的代码中,我获取当前订单的账单信息,然后查找具有相同账单信息的其他活动订单,但从这一点上,我不知道如何获取已找到的订单项目,并查看以前的订单中是否也有相同的项目。
我设法找到了一个解决方案,将当前购物车中的商品与以前订单中的商品进行匹配:
foreach ($billing_active_order_ids as $active_order_id){
$order = wc_get_order( $active_order_id );
foreach ($order->get_items() as $id => $order_item){
if(in_array($order_item->get_product_id(),$cart_items_ids)){
wc_add_notice($duplicate_order_message, 'error');
return;
}
}
}