地址里加了 orderby=comment_count,页面顺序还是按发布时间,换几个值都没有变化,排序参数像被谁吃掉了,怎么点都一样。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,排序参数只被前端接收,没有映射进查询,或者后加载的插件把 orderby 覆盖回去了,前面的设置等于白做,在页面上完全看不出来。
「列表排序参数失效」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。改完顺手把文档补一句,省得下次自己重新推一遍。
add_filter('pre_get_posts', function ($q) {
$o = $_GET['orderby'] ?? 'date';
$ok = ['date', 'comment_count'];
$q->set('orderby', in_array($o, $ok) ? $o : 'date');
});
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,先打印最终执行的那一条 SQL,确认排序子句在不在;把允许的排序字段做成一份白名单,再映射进查询;调整过滤器优先级,确保自己的设置在最后生效。
最后用这个标准收尾,换排序值之后列表顺序真的变了,非法值会自动回落到默认。
