搜索全站
百度SEO 9 分钟阅读

相关文章模块怎么做?内链推荐位的设计、数量与收录带动

相关文章是覆盖面最广的内链形式。本文讲清推荐位的位置、数量、召回逻辑,给出不用插件的相关文章实现代码与缓存处理,避免拖慢页面。

U
UFO_PF 2021-06-12 · 阅读 9 分钟
相关 百度SEO
阅读提示
本文约 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:验证收录带动效果
新文章发布后,在搜索资源平台用”普通提交”推送,同时观察它在相关文章中的曝光次数与最终收录时间。对比没有相关文章模块的时期,通常能看出发现速度的差异。

常见踩坑

  1. 用 query_posts 实现:会覆盖主查询,导致分页、SEO 插件输出异常,必须用 WP_Query。
  2. 按最新文章取:相关性为零,用户不点,等于无效内链。
  3. 数量过多:底部挂 15 条,页面看起来像聚合页,单条权重被稀释。
  4. 不做缓存:每个请求多一次复杂查询,访问量上来后数据库压力明显。
  5. 案例:某站点用一款推荐插件,相关文章每秒随机变化,百度多次抓取同一 URL 得到完全不同的内链集合,导致对页面内容的稳定性判断出现波动。改成带缓存的固定召回后,同主题文章之间的收录速度明显提升。
  6. 推荐到已删除页面:文章删除后相关文章里仍保留链接,形成站内死链,可参考 死链检测与提交 做定期扫描。
  7. 与手工内链重复:正文里已链向某篇文章,底部又推荐同一篇,等于浪费一个位。

总结

相关文章模块的价值取决于召回质量而非数量:能召回同主题内容,6 条就够;召回不了,20 条也没用。实现上优先用 WP_Query 加缓存,避免 query_posts,并给推荐结果加失效清理。手工内链负责重点页面的精准传递,相关文章负责长尾页面的广度覆盖,两者配合才能形成完整的内链网络。模块里的链接同样使用 站内锚文本建设方法 提到的变体原则,效果会更好。

U
UFO_PF作者

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

留下你的想法

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