You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce邮编范围验证失效问题求助

WooCommerce 邮编区间验证解决方案

WooCommerce配送邮编的存储规则

WooCommerce的woocommerce_shipping_zone_locations表中,邮编存储逻辑如下:

  • 单个邮编:location_code字段存储完整格式的邮编(如10000-000),location_code2字段为空
  • 邮编区间:location_code存储区间起始邮编,location_code2存储区间结束邮编,两者均保留-分隔的完整格式

现有代码的问题

  1. 直接用CAST(location_code AS UNSIGNED)会截断-后的内容,比如10000-000会被转成10000,导致区间判断完全错误
  2. 未同时兼容单个邮编精确匹配和区间范围匹配的场景

修正后的实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:52:14