$args = array(
'orderby' => array('date' => 'DESC', 'ID' => 'DESC'),
'paged' => $paged,
);
$q = new WP_Query($args);
列表每页十条,翻到第二页时开头两条和上一页末尾完全一样,第三页又重复了上一页的一条,按 ID 去重后总数反而少了两条。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,发布时间只精确到秒,批量发布的几篇文章时间完全相同,数据库对相同排序值的返回顺序并不固定,两次查询的边界就会错位。只按时间排序再加 LIMIT OFFSET,重复和漏项会同时出现。
围绕「分页排序重复」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。
处理上按这个顺序:排序里补一个唯一字段做次级排序,时间相同就按 ID 排,顺序才稳定;翻页查询把当前页的边界值带上,改成按时间加 ID 的游标查询,别再用大偏移;前端追加数据时按文章 ID 去重,重复的丢掉,别直接 concat。
改完只确认一件事:从第一页翻到第五页,相邻两页没有重复 ID,总数和列表实际条数对得上。
