我正在使用下面的代码,目的是阻止某些街道地址无法订购。该代码不起作用(仍然可以使用任何被阻止的地址进行订购),我想知道为什么。
代码如下:
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' );
}
}
我们非常感谢您的帮助。
答案 0 :(得分:2)
您的代码运行正常,但存在一些逻辑问题。我已经检查了代码,但在以下情况下对我不起作用
因此,您将不得不更改比较地址的方法。我选择适用于大多数字符串比较的以下内容。
$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。