每页设 12 条,第一页只有 10 条,第二页开头又重复第一页最后两条,总数显示 120,翻到第 10 页就空了。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,pre_get_posts 里用 post__in 把置顶商品提到最前,posts_per_page 没扣掉置顶数量。置顶又被主查询再查一次,两页之间就出现重叠。
「置顶商品占位」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
$q->set('ignore_sticky_posts', true);
$q->set('post__not_in', get_option('sticky_posts'));
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,置顶改成单独查询输出,主查询把 ignore_sticky_posts 设为 true;或者在 pre_get_posts 里把置顶 ID 从主查询排除;翻到最后一页确认条数和总数对得上。
最后用这个标准收尾,每页都是 12 条,第二页不重复第一页内容,最后一页条数和总数吻合。
