现场是这样的。列表页 /list/page/2/ 到 /list/page/8/ 的 canonical 由主题模板统一输出成前一页地址,WordPress 6.6 配 Yoast 22.8,第 6 页指第 5 页、第 5 页指第 4 页,一路连成链。GSC 重复网页报表把七个分页归进同一组,第 3 页之后全是已发现但未编入索引。试过把分页整批 noindex,收录更差,两天后又改回来。

中间走过弯路,把「列表里的 rel=next 指第 7 页,canonical 却指第 5 页,两个信号互相矛盾」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。模板把分页当成重复内容,canonical 默认回指前一条,链越长终点越模糊;第 1 页用不带 page 的地址,第 2 页起才开始指向前一页,起点和终点对不上;排序参数 ?order= 没进 canonical 判断,同一页被拆成两个地址各算一份。

上来先抽出第 1 到第 8 页的 canonical 看指向

for i in 1 2 3 4 5 6 7 8; do curl -s https://www.example.com/list/page/$i/ | grep -o '<link rel="canonical"[^>]*>'; done

接着把分页 canonical 改回自身地址

add_filter('wpseo_canonical', function($url){ return is_paged() ? get_pagenum_link(max(1, get_query_var('paged'))) : $url; });

补回 rel=prev 让链条首尾相接

add_action('wp_head', function(){ $p = get_query_var('paged'); if ($p > 1) { echo '<link rel="prev" href="'.get_pagenum_link($p - 1).'">'; } });

单独抓一次第 6 页确认输出

curl -sI https://www.example.com/list/page/6/ | head -3

恢复的判定其实很直接。第 2 到第 8 页的 canonical 都指向自身,rel=prev 与 rel=next 首尾相接,重复网页报表里该组只剩一条,第 3 页开始陆续进索引。

提醒一点。判断分页要用 is_paged 而不是 is_singular,否则列表首页会被一起改掉,这一点插件文档写得很含糊。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189