检查字段值是否尚未使用,避免在Woocommerce中结帐

时间:2018-07-20 15:01:37

标签: php sql wordpress woocommerce checkout

我有一家商店,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

1 个答案:

答案 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文件中。经过测试,可以正常工作。

enter image description here

  

现在要在产品级别启用此功能,要复杂得多,而且范围太广,因为它只是真正的发展。请记住,客户地址未链接到产品