完全排除Woocommerce中所有邮政信箱的变化

时间:2019-06-13 13:55:10

标签: php woocommerce

我在woocommerce中使用此功能来阻止人们输入Pobox地址。它运作良好,但是并没有考虑输入“ po”或“ box”等其他变体的人。

我怎样才能确保也将其阻止?

谢谢

class Profile(models.Model):
    def save(self, *args, **kwargs):
        print("Test")
        super(Profile, self).save(*args, **kwargs)

2 个答案:

答案 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' );
}

}