woocommerce - 如果街道地址在黑名单中,则拒绝结帐 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' );
}
}
非常感谢任何帮助。
解决方案
除了一些逻辑问题外,您拥有的代码运行良好。我已经检查了代码,但在以下情况下它对我不起作用
- 当地址为街道名称 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' );
}
}
推荐阅读
- angularjs - 用于请求映射参数 spring boot 的动态 URI 逗号分隔
- algorithm - 在 CDCL 算法求解 SAT 时忘记布尔公式中的子句的主要原因是什么?
- python - Tensorflow,tf.reshape 导致“变量不存在梯度”
- r - 在 R 中求解线性系统
- c++ - 具有多个中心坐标矩形的碰撞检测 (C++)
- php - 在 Magento 2 中添加有关运输限制的通知客户注册
- javascript - (JavaScript) 编写一个函数,接收两个单词的字符串,如果两个单词的字母相同,则返回 True
- javascript - 如何在 React JS 的映射函数中返回 forEach
- nginx - 在 k8s 入口上添加特定文件类型的标头
- javascript - 如何禁用特定 PHP 文件的特定 JS 文件?