首页 > 解决方案 > 如果街道地址在黑名单中,则拒绝结帐 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' );
}
}

非常感谢任何帮助。

标签: woocommerce

解决方案


除了一些逻辑问题外,您拥有的代码运行良好。我已经检查了代码,但在以下情况下它对我不起作用

  • 当地址为街道名称 1 时,即大写字母和小写字母混合在地址中(您的数组具有街道名称 1,而您的 php 函数仅将第一个字母转换为大写字母)。所以 Street NAme 1, StReeT NaMe 1, STEEt 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' );
    }
}

推荐阅读