WooCommerce邮编范围验证失效问题求助
WooCommerce 邮编区间验证解决方案
WooCommerce配送邮编的存储规则
WooCommerce的woocommerce_shipping_zone_locations表中,邮编存储逻辑如下:
- 单个邮编:
location_code字段存储完整格式的邮编(如10000-000),location_code2字段为空 - 邮编区间:
location_code存储区间起始邮编,location_code2存储区间结束邮编,两者均保留-分隔的完整格式
现有代码的问题
- 直接用
CAST(location_code AS UNSIGNED)会截断-后的内容,比如10000-000会被转成10000,导致区间判断完全错误 - 未同时兼容单个邮编精确匹配和区间范围匹配的场景
修正后的实现代码
global $wpdb; $tabela_cep = $wpdb->prefix . 'woocommerce_shipping_zone_locations'; // 处理输入邮编:移除所有非数字字符,转为纯数字格式统一对比 $cep_limpo = preg_replace('/\D/', '', $cep); // 构造查询:同时支持单个邮编精确匹配、区间范围匹配 $query = " SELECT location_code FROM $tabela_cep WHERE -- 匹配单个邮编(精确匹配原始格式) location_code = %s OR -- 匹配邮编区间:将数据库中带格式的邮编转为纯数字后做范围判断 ( location_code2 IS NOT NULL AND %s BETWEEN REPLACE(location_code, '-', '') AND REPLACE(location_code2, '-', '') ) LIMIT 1 "; // 执行查询,传入原始邮编(用于精确匹配)和处理后的纯数字邮编(用于区间判断) $resultado = $wpdb->get_var($wpdb->prepare($query, $cep, $cep_limpo));
代码说明
preg_replace('/\D/', '', $cep):清除输入邮编中的非数字字符,避免格式差异导致的对比错误REPLACE(location_code, '-', ''):将数据库中存储的带-的邮编转为纯数字,保证区间判断的准确性- 用
OR连接两种匹配场景,同时覆盖单个邮编和区间邮编的验证需求
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

