Php 完全排除Woocommerce中装运的所有邮政信箱变更
我在woocommerce中使用此功能阻止人们输入pobox地址。它工作得很好,但它没有考虑输入其他变体(如“po”或“box”)的人 我如何确保也阻止此操作 谢谢Php 完全排除Woocommerce中装运的所有邮政信箱变更,php,woocommerce,Php,Woocommerce,我在woocommerce中使用此功能阻止人们输入pobox地址。它工作得很好,但它没有考虑输入其他变体(如“po”或“box”)的人 我如何确保也阻止此操作 谢谢 /** * Prevent PO box shipping */ add_action('woocommerce_after_checkout_validation', 'deny_pobox_postcode'); function deny_pobox_postcode( $posted ) { global $woo
/**
* 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 ) );
if ( strstr( $address, 'pobox' ) || strstr( $postcode, 'box' ) ) {
wc_add_notice( sprintf( __( "Sorry, we cannot ship to PO BOX addresses.") ) ,'error' );
}
}
用于查找邮政信箱的正则表达式:
/(邮政信箱)|邮政信箱/gmi
解释:
字符串包含PO或BOX/(PO | BOX)
或|
PO后跟可选空格,后跟BOXPO?\s?BOX
全局大小写,多行,不区分大小写/gmi
preg_match('/(PO|BOX)|PO?\s?BOX/gmi', $postcode, $matches);
if ($matches) {
// you found a match! handle logic here
}
显然,使用此正则表达式时要小心,因为许多其他邮政编码可能合法地包含“PO”或“BOX”,所以请根据您的需要和研究调整此正则表达式
你可以在这里查看:好的,我在下面更新了我的函数 唯一不好的一面是正则表达式没有阻止“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' );
}
}
如果有人碰巧住在纽约布鲁克林绿点72号博克斯街11222号怎么办?我建议永远不要像这样过滤地址,只是把一个明确的警告放在某个地方,你不能发送到邮箱地址。我同意上面的评论。您可以使用正则表达式来匹配字符串,如pobox、box等。您是对的,我没有想到这一点。OliverBigras Morin发布了一个答案,让我知道你的想法。谢谢你的帮助。gmi是什么意思?我的日志中有一个错误:PHP警告:preg_match():未知修饰符“g”该
g
表示全局,在联机编辑器中检查多行正则表达式时,您可以根据需要尝试将其删除。