如果街道地址在WooCommerce黑名单上,则拒绝结帐

时间:2018-11-03 10:35:46

标签: woocommerce

我正在使用下面的代码,目的是阻止某些街道地址无法订购。该代码不起作用(仍然可以使用任何被阻止的地址进行订购),我想知道为什么。

代码如下:

add_action( 'woocommerce_checkout_process', 'validate_address_for_spam_order' );
function validate_address_for_spam_order() {
$disableAddressList = array (
'Street name 1',
'Street name 2',
'Street name 3',
'Street name 4',
);
$billingAddress = isset( $_POST['billing_address_1'] ) ? trim( $_POST['billing_address_1'] ) : '';
$billingAddress = str_replace(array('-','_'),' ',$billingAddress);
$billingAddress = ucwords($billingAddress);
if (in_array($billingAddress, $disableAddressList))
{
wc_add_notice( __( 'Your error message here' ), 'error' );
}
}

我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您的代码运行正常,但存在一些逻辑问题。我已经检查了代码,但在以下情况下对我不起作用

  • 当地址为街道名称1时,即地址中混合使用大写字母和小写字母(您的数组的街道名称为1,而php函数仅将第一个字母转换为大写字母)。因此,比较中的Street NAme 1,Street NaMe 1,STREEt Name1会得出错误的结果。

因此,您将不得不更改比较地址的方法。我选择适用于大多数字符串比较的以下内容。

  • 用小写字母写出您的已分配地址数组
$disableAddressList = array (
'street name 1',
'street name 2',
'street name 3',
'street name 4',
);
  • 使用ucwords()代替strtolower()

因此代码将

add_action( 'woocommerce_checkout_process', 'validate_address_for_spam_order' );
function validate_address_for_spam_order() {
    $disableAddressList = array (
        'street name 1',
        'street name 2',
        'street name 3',
        'street name 4',
    );
    $billingAddress = isset( $_POST['billing_address_1'] ) ? trim( $_POST['billing_address_1'] ) : '';
    $billingAddress = str_replace(array('-','_'),' ',$billingAddress);
    $billingAddress = strtolower($billingAddress);
    if (in_array($billingAddress, $disableAddressList))
    {
        wc_add_notice( __( 'Your error message here' ), 'error' );
    }
}

答案 1 :(得分:0)

将街道地址与文字字符串进行比较,只有在对其进行适当标准化的情况下,才能起作用。例如,“ 123 4th Ave”和“ 123 Fourth Avenue”是完全不同的字符串,但是它们代表相同的地址。

要标准化地址,您需要一个地址标准化工具。我供职的公司名列YAddress