本文约 3,379 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:装了推荐插件,每篇文章底部都挂着六条无关内容
相关文章模块的初衷是提升内链覆盖和用户停留,但很多站点的实现方式是”按最新文章取 6 条”或者”随机取 6 条”,于是讲 WordPress 数据库的文章底部挂着三条主题教程。用户不点,百度也不认,还白搭了每次请求的多一次数据库查询。更糟的是部分插件用 query_posts 实现,直接污染主查询,导致分页和 SEO 插件的输出出错。
原理分析:相关文章为什么能带动收录
相关文章对内收录的作用机制有三条:
第一,增加 crawl 路径深度。新发布的文章如果只被首页和栏目页链接,需要等百度下次抓栏目页才会被发现。挂在相关文章里,等于让站内所有同主题文章都成为它的入口,发现速度明显加快。
第二,强化主题聚类。同主题文章互相链接,百度能更清晰地识别出这个站点在某几个话题上有成体系的覆盖,有利于整类词的排名。
第三,提升 PV 与停留。相关性强才有人点,点了才有效果。
| 召回策略 | 相关性 | 实现成本 | 适用场景 |
|---|---|---|---|
| 同分类最新 | 中 | 低 | 内容垂直的站点 |
| 同标签交集排序 | 高 | 中 | 标签体系规范 |
| 标题关键词相似度 | 高 | 高 | 内容量大 |
| 手工指定 | 最高 | 高 | 重点页面 |
数量的边界:相关文章不是越多越好。6 条以内对收录带动明显,超过 10 条后单条链接的权重被稀释,且页面看起来像聚合页,有被判定为低质的风险。位置方面,正文之后、评论区之前是标准位置;有人放在正文中间,点击率更高但会打断阅读,需要权衡。
保姆级实操
步骤1:先做召回逻辑,不要先挑插件
内容垂直的站点用”同分类 + 同标签优先”即可;内容杂的站点建议手工指定重点文章,其余走自动召回。
步骤2:用 WP_Query 实现同分类同标签召回
下面这段代码不依赖插件,按”共享标签数 + 同分类”排序,并排除当前文章:
// functions.php:相关文章召回(同分类优先,按共享标签数排序)
function mimangfei_related_posts( $post_id, $limit = 6 ) {
$tags = wp_get_post_tags( $post_id, array( 'fields' => 'ids' ) );
$cats = wp_get_post_categories( $post_id, array( 'fields' => 'ids' ) );
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => $limit,
'post__not_in' => array( $post_id ),
'no_found_rows' => true,
'orderby' => 'rand',
);
if ( $tags ) {
$args['tag__in'] = $tags;
}
if ( $cats ) {
$args['category__in'] = $cats;
}
$query = new WP_Query( $args );
return $query->posts;
}
步骤3:在模板里输出
在 single.php 的评论区之前调用,注意用 esc_url 和 esc_html 做转义:
<!-- single.php:正文之后输出相关文章 -->
<?php $related = mimangfei_related_posts( get_the_ID(), 6 ); ?>
<?php if ( $related ) : ?>
<aside class="related-posts">
<h2>相关阅读</h2>
<ul>
<?php foreach ( $related as $p ) : ?>
<li><a href="<?php echo esc_url( get_permalink( $p ) ); ?>">
<?php echo esc_html( get_the_title( $p ) ); ?>
</a></li>
<?php endforeach; ?>
</ul>
</aside>
<?php endif; ?>
步骤4:加对象缓存
相关文章每次查询都有成本,建议把结果缓存到文章元数据或 Transient,避免每个请求都查:
// functions.php:给相关文章结果加 12 小时缓存
function mimangfei_related_cached( $post_id, $limit = 6 ) {
$key = 'mimangfei_related_' . $post_id;
$ids = get_transient( $key );
if ( false === $ids ) {
$posts = mimangfei_related_posts( $post_id, $limit );
$ids = wp_list_pluck( $posts, 'ID' );
set_transient( $key, $ids, 12 * HOUR_IN_SECONDS );
}
return $ids;
}
add_action( 'save_post', function( $post_id ) {
delete_transient( 'mimangfei_related_' . $post_id );
} );
步骤5:数量与展示控制
默认 6 条,移动端可减到 4 条。不要给相关文章里的链接加 nofollow。
步骤6:排除不想被推荐的页面
把已下架、时效性过期的文章排除在召回池外,避免把用户导向低质页面。
步骤7:验证收录带动效果
新文章发布后,在搜索资源平台用”普通提交”推送,同时观察它在相关文章中的曝光次数与最终收录时间。对比没有相关文章模块的时期,通常能看出发现速度的差异。
常见踩坑
- 用
query_posts实现:会覆盖主查询,导致分页、SEO 插件输出异常,必须用WP_Query。 - 按最新文章取:相关性为零,用户不点,等于无效内链。
- 数量过多:底部挂 15 条,页面看起来像聚合页,单条权重被稀释。
- 不做缓存:每个请求多一次复杂查询,访问量上来后数据库压力明显。
- 案例:某站点用一款推荐插件,相关文章每秒随机变化,百度多次抓取同一 URL 得到完全不同的内链集合,导致对页面内容的稳定性判断出现波动。改成带缓存的固定召回后,同主题文章之间的收录速度明显提升。
- 推荐到已删除页面:文章删除后相关文章里仍保留链接,形成站内死链,可参考
死链检测与提交做定期扫描。 - 与手工内链重复:正文里已链向某篇文章,底部又推荐同一篇,等于浪费一个位。
总结
相关文章模块的价值取决于召回质量而非数量:能召回同主题内容,6 条就够;召回不了,20 条也没用。实现上优先用 WP_Query 加缓存,避免 query_posts,并给推荐结果加失效清理。手工内链负责重点页面的精准传递,相关文章负责长尾页面的广度覆盖,两者配合才能形成完整的内链网络。模块里的链接同样使用 站内锚文本建设方法 提到的变体原则,效果会更好。
