钻石会员权益页写着全场包邮,结算页仍收 12 元运费,用户下单前截图来问是不是虚假宣传。乍看像缓存或者权限的锅,追下去往往不是。
add_filter('woocommerce_package_rates', 'free_shipping_for_diamond');
// 钻石等级返回 0 运费
追下去是这么回事:运费计算在购物车和结算两处各写了一份,结算那份没读会员等级。购物车片段还被缓存成游客版本。
「等级运费冲突」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,运费逻辑抽成一个函数,两处都调用它;结算时强制重算一次运费,不复用购物车结果;按等级和地区分缓存键,游客缓存不能给会员用;用钻石会员下一单,核对运费为 0。
验收就看一点,钻石会员结算运费显示 0,普通会员仍按原规则收费。
