我在woocommerce中使用此功能来阻止人们输入Pobox地址。它运作良好,但是并没有考虑输入“ po”或“ box”等其他变体的人。
我怎样才能确保也将其阻止?
谢谢
class Profile(models.Model):
def save(self, *args, **kwargs):
print("Test")
super(Profile, self).save(*args, **kwargs)
答案 0 :(得分:1)
用于查找邮政信箱的正则表达式:/(PO|BOX)|PO?\s?BOX/gmi
解释:
/(PO|BOX)
字符串包含PO或BOX |
或PO?\s?BOX
PO,后跟一个可选空格,后跟BOX /gmi
大小写全局,多行,不区分大小写在您的代码中执行正则表达式:
preg_match('/(PO|BOX)|PO?\s?BOX/gmi', $postcode, $matches);
if ($matches) {
// you found a match! handle logic here
}
很明显,在使用此正则表达式时要小心,因为许多其他邮政编码可能合法地包含“ PO”或“ BOX”,因此请使其适应您的需求和研究。
您可以在此处查看:https://regex101.com/r/d2PA4A/1
答案 1 :(得分:-1)
好的,我为此更新了我的功能。
唯一的缺点是正则表达式不会阻止'po 123'
/**
* Prevent PO box shipping
*/
add_action('woocommerce_after_checkout_validation', 'deny_pobox_postcode');
function deny_pobox_postcode( $posted ) {
global $woocommerce;
$address = ( isset( $posted['shipping_address_1'] ) ) ? $posted['shipping_address_1'] : $posted['billing_address_1'];
$postcode = ( isset( $posted['shipping_postcode'] ) ) ? $posted['shipping_postcode'] : $posted['billing_postcode'];
$replace = array(" ", ".", ",");
$address = strtolower( str_replace( $replace, '', $address ) );
$postcode = strtolower( str_replace( $replace, '', $postcode ) );
preg_match('/(?:P(?:ost(?:al)?)?[\.\-\s]*(?:(?:O(?:ffice)?[\.\-\s]*)?B(?:ox|in|\b|\d)|o(?:ffice|\b)(?:[-\s]*\d)|code)|box[-\s\b]*\d)/i', $address, $matches);
if ($matches) {
wc_add_notice( sprintf( __( "Sorry, we cannot ship to PO BOX addresses.") ) ,'error' );
}
}