本文约 3,493 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:写了三百篇,有一百篇从没被抓过
内容没问题、标题没问题、站点也验证过了,但有一批文章就是迟迟不收录。这时候该看的是结构:这些文章是不是藏在”首页 → 分类 → 子分类 → 子子分类 → 文章”这样的第五层。爬虫的抓取资源有限,离首页越远的页面被发现的优先级越低,层级过深是内容型站点最常见也最容易被忽略的收录瓶颈。
原理分析:层级深度如何影响抓取优先级
| 距首页点击层数 | 抓取优先级 | 常见表现 |
|---|---|---|
| 1 层(导航直达) | 最高 | 收录快、更新及时 |
| 2 层(栏目页) | 高 | 正常收录 |
| 3 层(栏目子页) | 中 | 收录延迟,更新慢 |
| 4 层及以上 | 低 | 长期不收录或快照老旧 |
| 仅靠分页可达 | 极低 | 靠分页翻到第 8 页才能点到的文章基本被放弃 |
所谓三层可达,是指任意一篇内容从首页出发,不超过三次点击就能到达。这条规则不是硬性规定,但它反映了一个事实:每多一层,页面的链接权重传递就衰减一次,被抓取的概率也下降一次。
两个常见加深层级的结构:一是分类树过深,WordPress 支持无限层级的分类,站长很容易建出四层分类;二是只靠分页翻页进入老文章,一篇两年前的文章要翻 20 页才能点到,实际上等于不可达。
保姆级实操
步骤 1:先量出真实的层级分布。 用 get_ancestors() 计算每个分类的深度,再统计每个深度下有多少文章:
// 审计脚本:统计分类层级深度与对应文章数
$report = array();
$cats = get_categories( array( 'hide_empty' => 0 ) );
foreach ( $cats as $cat ) {
$depth = count( get_ancestors( $cat->term_id, 'category', 'taxonomy' ) ) + 1;
$report[ $depth ] = ( $report[ $depth ] ?? 0 ) + (int) $cat->count;
}
ksort( $report );
foreach ( $report as $depth => $count ) {
printf( "第 %d 层分类:文章 %d 篇\n", $depth, $count );
}
步骤 2:压缩分类层级到两级。 三层及以上的分类,能合并的合并,不能合并的改成标签。判断标准:一个分类下长期不足 10 篇文章,就不该是独立分类,改成标签更合适。合并时注意用 301 把旧分类地址指向新地址。
步骤 3:让每篇文章都能被最近的内容反链。 只靠分类列表不够——新文章会不断把老文章往下挤。给每篇文章自动挂上同标签的相关文章:
// functions.php:按共同标签生成相关内容内链(挂到正文末尾)
add_filter( 'the_content', function ( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $content;
}
$post_id = get_the_ID();
$terms = wp_get_object_terms( $post_id, 'post_tag', array( 'fields' => 'ids' ) );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return $content;
}
$related = new WP_Query( array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 6,
'post__not_in' => array( $post_id ),
'no_found_rows' => true,
'tax_query' => array(
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => $terms,
),
),
) );
if ( ! $related->have_posts() ) {
return $content;
}
$html = '<div class="related-posts"><h2>相关阅读</h2><ul>';
while ( $related->have_posts() ) {
$related->the_post();
$html .= sprintf(
'<li><a href="%s">%s</a></li>',
esc_url( get_permalink() ),
esc_html( get_the_title() )
);
}
wp_reset_postdata();
$html .= '</ul></div>';
return $content . $html;
}, 20 );
步骤 4:建专题聚合页。 同一主题下的 10–20 篇文章,手工做一个聚合页,用列表把它们串起来,并在导航或首页给出入口。聚合页是解决”老文章不可达”最有效的手段,比改分页高效得多。
步骤 5:控制分页深度。 分类列表每页数量建议 20–30 条,不要设成 5 条。同时给分页页面加 rel="next"/rel="prev" 的思路已经失效,现在更实际的做法是给第 2 页之后的分页页设置 noindex,把抓取资源留给内容页。
步骤 6:补面包屑。 面包屑既帮用户定位,也提供层级信号。用主题的面包屑功能或 SEO 插件的面包屑模块(配置见 WordPress 面包屑导航设置),确保层级不超过三级。
步骤 7:复查。 改造完成两周后,再跑一次步骤 1 的脚本,确认第 3 层以下的文章数降到合理范围,然后对比收录量的变化。
常见踩坑
- 只加相关文章插件,不改分类层级,深层文章仍然要靠分类页进入。
- 相关文章插件按”最新文章”生成,等于没有语义关联。
- 合并分类时没做 301,旧分类地址全部 404。
- 相关文章输出到
the_content但没有in_the_loop()判断,导致摘要、RSS、REST 输出里都带上。 - 分页每页 5 条,200 篇文章需要 40 页,等于后 35 页不可达。
- 案例: 某 WordPress 教程站分类做到第四层,且分类列表每页只显示 8 条。统计发现约 38% 的文章需要 4 次以上点击才能到达,这批文章的收录率只有 31%。压缩到两级分类、每页 24 条、新增 12 个专题聚合页后,两个月内这批文章的收录率升到 74%。
- 面包屑显示的层级与实际 URL 结构不一致,反而制造混乱。
- 只做结构改造不做主动推送,百度重新发现深层页面仍需时间,应配合 API 推送。
总结
判断标准很直接:随机挑 20 篇老文章,看从首页出发几次点击能到达,超过三次就该改。改造优先级为:压缩分类层级 → 增大分页容量 → 建专题聚合页 → 加语义相关内链 → 补面包屑。结构改完后记得主动推送,否则百度发现这些页面仍需时间。sitemap 侧的配合做法见 WordPress 站点地图提交。
