本文约 3,736 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:第 2 页到底该不该被收录
做内容站的站长常纠结一个细节:WordPress 自动生成的 /page/2/、/page/3/ 要不要放行?有人说应该 noindex,有人说要做”全部显示页”(View All)。更麻烦的是,很多 SEO 插件的默认设置彼此矛盾——有的给分页页加上了 canonical 指向第 1 页,结果第 2 页里那些只有在这里才能点到的文章,全部被归并到首页,权重和抓取机会一起消失。
要回答这个问题,得先明确一件事:Google 在 2019 年 3 月正式宣布不再使用 rel="next" 和 rel="prev" 标记来理解分页序列。也就是说,那些年我们辛辛苦苦加的分页标记,现在对 Google 完全不起作用。很多老教程还在教人加这些标签,属于过时信息,照做只会在 HTML 里堆无用代码。
原理分析:Google 现在怎么处理分页
Google 现在把每个分页 URL 当作独立页面处理。这意味着:
| 策略 | 结果 | 建议 |
|---|---|---|
| canonical 指向第 1 页 | 第 2 页内文章失去入口 | 不推荐 |
| self-canonical | 每页独立参与排序 | 推荐 |
| 整站分页 noindex | 深层文章无法被索引 | 不推荐 |
| 全部显示页 + 分页 301 | 重复内容风险 | 视内容量而定 |
Google 官方明确表示:”我们不会把分页页的链接信号合并到第 1 页”。所以正确的做法是让每个分页页 self-canonical(canonical 指向自己),并给每个分页页独一无二的 title 与 meta description——比如第 2 页的标题带”(第 2 页)”,避免与第 1 页构成重复。
“全部显示页”(View All)适合单页内容量可控的场景:把全部条目放在一个页面,然后让 /page/2/ 之类 URL 301 到它。好处是权重集中、用户体验完整;坏处是当条目超过几百条时,页面体积过大,LCP 变差,反而拖累 Core Web Vitals。取舍标准:单页加载后 HTML 体积控制在数百 KB 内就做 View All,否则保留序列分页。
保姆级实操
步骤 1:确认分页页的 canonical 是自己。 打开 /page/2/ 查看源码里的 <link rel="canonical">。若指向第 1 页,用插件过滤器修正。Yoast SEO 用 wpseo_canonical 过滤器,Rank Math 用 rank_math/frontend/canonical。
<?php
// 强制分页页使用 self-canonical(Yoast SEO)
add_filter('wpseo_canonical', function ($canonical) {
if (is_paged()) {
return get_pagenum_link(get_query_var('paged'), false);
}
return $canonical;
});
// Rank Math 版本
add_filter('rank_math/frontend/canonical', function ($canonical) {
if (is_paged()) {
return get_pagenum_link(get_query_var('paged'), false);
}
return $canonical;
});
步骤 2:给分页页写独立标题。 默认的 pre_get_document_title 通常不带页码,导致所有分页页标题相同,被判定为重复内容。
<?php
// 分页页标题追加页码,避免与第 1 页重复
add_filter('pre_get_document_title', function ($title) {
$paged = get_query_var('paged');
if (is_paged() && $paged > 1) {
return $title . ' - 第 ' . (int) $paged . ' 页';
}
return $title;
}, 20);
// 同步处理 Yoast 输出的标题
add_filter('wpseo_title', function ($title) {
$paged = get_query_var('paged');
if (is_paged() && $paged > 1) {
return $title . ' - 第 ' . (int) $paged . ' 页';
}
return $title;
}, 20);
步骤 3:控制分页链接的输出形态。 WordPress 的 paginate_links() 默认输出的是带查询参数的链接,改成路径形式更利于收录与统计。
<?php
// 在分类/首页模板中输出规范的分页链接
echo paginate_links([
'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $GLOBALS['wp_query']->max_num_pages,
'prev_text' => '上一页',
'next_text' => '下一页',
'end_size' => 2, // 首尾各显示 2 页
'mid_size' => 2, // 当前页两侧各显示 2 页
]);
步骤 4:决定是否做全部显示页。 若单页条目 ≤ 200 且正文体积可控,可新增一个 ?view=all(或独立路径)页面输出全部条目,并给该页 canonical 指向自己,同时让分页页保留独立索引。不要把分页页 301 到 View All,除非你确认不再需要分页 URL 参与排名。
步骤 5:sitemap 只放栏目第 1 页。 分页页不需要进 sitemap,靠内链发现即可。Yoast 与 Rank Math 默认也只输出第 1 页,保持默认就好。
步骤 6:验证。 用 Search Console 的”网址检查”分别测试 /page/2/,确认 Google 读到的 canonical 是自身、标题带页码;再用 PageSpeed Insights 检查 View All 页的 LCP,超过 2.5 秒就放弃该方案。分页与抓取预算的关系可延伸阅读 Google 抓取预算优化。
常见踩坑
- 案例: 某站给全部分页页加了
noindex,follow,三个月后 GSC”已抓取,但目前未编入索引”暴涨到 6000 条,且第 3 页之后的 400 多篇老文章全部失去入口,自然流量损失约 22%。移除 noindex、改回 self-canonical 后逐月恢复。 - 仍在模板里输出
rel="next"/rel="prev",以为能帮 Google 理解序列。Google 2019 年已明确不再使用这两个标记,加了也没用。 - canonical 指向第 1 页,导致分页页上的文章链接被认为”属于第 1 页”,深层文章抓取频次骤降。
- 分页页与第一页共用同一个 H1 与描述,被判定为重复内容后整组降级。
- 做 View All 时不设上限,一个页面塞进 3000 条商品,HTML 超过 3MB,LCP 高达 8 秒,Core Web Vitals 三项全红。
- 搜索结果页、标签页与分页页混在一起,既分页又参数化,形成 URL 无限膨胀。参数类页面建议
noindex,可参考 robots.txt 配置教程。 - 使用无限滚动(Infinite Scroll)却没有对应的分页 URL 兜底,爬虫抓不到第 2 屏之后的内容。
总结
分页处理的核心结论:每个分页页 self-canonical、独立标题、不做 noindex、不进 sitemap;View All 只在单页体积可控时使用;rel=next/prev 可以彻底删掉。行动清单为先检查 canonical 指向,再补页码标题,最后用 GSC 逐页验证 canonical 读取结果。记住分页页的真正价值不是它自己排名,而是它作为”通往深层文章的第二条通路”——只要这条通路在,深层内容的抓取就不会断。
