前台文章列表按自定义字段排序正常,进后台文章列表发现顺序也被改了,连搜索和分页都不对。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

add_action('pre_get_posts', function ($q) {
  if (is_admin() || !$q->is_main_query()) return;
  $q->set('orderby', 'meta_value_num');
  $q->set('meta_key', 'price');
});

过滤器里没有判断 is_main_query 与 is_admin,把站内所有查询都接管了,后台列表和搜索被同一个排序条件一起改写。这一点先确认清楚,后面就不用反复试。

「pre_get_posts 主查询」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,在回调里用 is_main_query 只放行前台主查询;后台确实需要的场景单独加 is_admin 分支;改完前后台各翻一页比对排序与分页结果。

改完照着核一遍,前台按价格排序,后台列表恢复默认的按发布时间倒序。

作者 9823189