我有一家商店,billing_address_1
必须对于用户来说是唯一的,并且对于不同的产品可以有所不同,但是每个SKU/product
中只有一个用户可以使用一个特定的地址。结帐期间,我想验证其他用户是否使用过billing_address_1
,并通知用户更改提供的billing_address_1
。如果提供的帐单地址先前已被该用户使用,则可以。我该如何将其作为功能添加到结帐流程中?
我创建了一个sql查询,它可以获取我需要的基本详细信息,但会认为使用woocommerce挂钩会更好,并存储为数组,检查该地址是否先前已被其他用户使用(如果没有继续)。 。此外,我认为,如果按购物车中的产品进行过滤,则查询可能会更好(更快)(只能将一种产品添加到购物车中)。
谢谢!
SELECT
A.ID as order_id, B.meta_value as b_address_1, C.meta_value as user_id
FROM wp_posts as A
LEFT JOIN wp_postmeta B
ON A.id = B.post_id AND B.meta_key = '_billing_address_1'
LEFT JOIN wp_postmeta C
ON A.id = C.post_id AND C.meta_key = '_customer_user'
WHERE A.post_type = 'shop_order'
ORDER BY order_id DESC
答案 0 :(得分:1)
更新:尝试以下代码,检查其他人是否尚未使用billing_address_1
字段值,避免下订单并显示自定义错误通知:
add_action( 'woocommerce_after_checkout_validation', 'custom_billing_address_1_validation', 50, 2 );
function custom_billing_address_1_validation( $data, $errors ) {
if( isset( $data['billing_address_1'] ) ) :
global $wpdb;
$customer_id = get_current_user_id();
$billing_address_1 = sanitize_text_field( $data['billing_address_1'] );
$count = $wpdb->get_var( "
SELECT COUNT(p.ID)
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}postmeta as pm2 ON p.ID = pm2.post_id
WHERE p.post_type LIKE 'shop_order'
AND pm.meta_key LIKE '_customer_user'
AND pm.meta_value != $customer_id
AND pm2.meta_key LIKE '_billing_address_1'
AND pm2.meta_value LIKE '$billing_address_1'
" );
if ( $count > 0 )
$errors->add( 'validation', __('The "Street Address" already exist, please contact us.') );
endif;
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。
现在要在产品级别启用此功能,要复杂得多,而且范围太广,因为它只是真正的发展。请记住,客户地址未链接到产品…