在文章列表点自定义字段列排序,顺序还是按发布时间。乍看像缓存或者权限的锅,追下去往往不是。

add_filter('pre_get_posts', function ($q) {
  if ($q->is_main_query() && $q->get('orderby') === 'price') {
    $q->set('meta_key', 'price');
    $q->set('orderby', 'meta_value_num');
  }
});

追下去是这么回事:排序参数没有挂到查询上,或字段值存储为字符串导致排序结果异常。

「WordPress 自定义字段排序」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,用查询过滤器接管排序;字段值转为数值排序;确认列表列已注册为可排序。

验收就看一点,点击列头后按字段值正确排序。

作者 9823189