两篇置顶文章在第一页出现,翻到第二页又出现一次,再往后翻还能看到,同一篇被重复读了好几遍。乍看像缓存或者权限的锅,追下去往往不是。
add_action('pre_get_posts', 'no_sticky');
function no_sticky($q) {
if ($q->is_home()) $q->set('ignore_sticky_posts', 1);
}
追下去是这么回事:置顶文章被强行插进每一页的开头,没有从正常结果里剔除,翻页时自然重复,越往后越明显,读者会以为是两篇不同的文章。
「sticky 文章重复」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,循环里用一个数组记录下来已经输出过的文章 ID;每次输出之前都比对一遍,出现过就跳过不渲染;或者干脆在主查询里忽略置顶,交给单独的区块。
验收就看一点,每篇文章在翻页过程中只出现一次,置顶区块不受任何影响。
