搜索全站
Google SEO 10 分钟阅读

WordPress 分页内容 SEO:序列分页与全部显示页怎么取舍

Google 已不再支持 rel=next/prev。本文讲清 WordPress 分页页的正确 canonical、标题与索引策略,给出 paginate_links 与 Yoast 过滤器的可运行代码。

U
UFO_PF 2019-12-03 · 阅读 10 分钟
Wo GOOGLE SEO
阅读提示
本文约 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 抓取预算优化。

常见踩坑

  1. 案例: 某站给全部分页页加了 noindex,follow,三个月后 GSC”已抓取,但目前未编入索引”暴涨到 6000 条,且第 3 页之后的 400 多篇老文章全部失去入口,自然流量损失约 22%。移除 noindex、改回 self-canonical 后逐月恢复。
  2. 仍在模板里输出 rel="next" / rel="prev",以为能帮 Google 理解序列。Google 2019 年已明确不再使用这两个标记,加了也没用。
  3. canonical 指向第 1 页,导致分页页上的文章链接被认为”属于第 1 页”,深层文章抓取频次骤降。
  4. 分页页与第一页共用同一个 H1 与描述,被判定为重复内容后整组降级。
  5. 做 View All 时不设上限,一个页面塞进 3000 条商品,HTML 超过 3MB,LCP 高达 8 秒,Core Web Vitals 三项全红。
  6. 搜索结果页、标签页与分页页混在一起,既分页又参数化,形成 URL 无限膨胀。参数类页面建议 noindex,可参考 robots.txt 配置教程。
  7. 使用无限滚动(Infinite Scroll)却没有对应的分页 URL 兜底,爬虫抓不到第 2 屏之后的内容。

总结

分页处理的核心结论:每个分页页 self-canonical、独立标题、不做 noindex、不进 sitemap;View All 只在单页体积可控时使用;rel=next/prev 可以彻底删掉。行动清单为先检查 canonical 指向,再补页码标题,最后用 GSC 逐页验证 canonical 读取结果。记住分页页的真正价值不是它自己排名,而是它作为”通往深层文章的第二条通路”——只要这条通路在,深层内容的抓取就不会断。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。