商品列表按价格排序,出现 10 排在 2 后面、100 排在 20 后面的顺序,一看就是按字符串在比大小。乍看像缓存或者权限的锅,追下去往往不是。

$q->set('meta_key', 'price');
$q->set('orderby', 'meta_value_num');
$q->set('order', 'ASC');

追下去是这么回事:字段值以字符串形式存在 postmeta 表里,用 meta_value 排序走的是字典序,必须换成按数值比较的排序方式。

碰到「meta_value_num 排序」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,把 orderby 的值从 meta_value 换成 meta_value_num;在 meta_query 里给这个字段补上 NUMERIC 类型;刷新列表核对前十条的价格顺序是否连续。

验收就看一点,价格从低到高连续排列,个位数不再排到十位数后面。

作者 9823189