本文约 4,583 字,预计阅读 12 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:两百篇文章,一百九十篇从没被访问过
从 Google Analytics 里拉一个”所有页面”报表,按浏览量排序,多数博客会发现一个残酷的事实:排名前 10 的页面贡献了 80% 以上的流量,剩下的几百篇文章一个月访问量不到 10 次。这些文章不是写得不好,而是发布之后就”沉底”了——首页只显示最新 10 篇,翻过几页就再没人点进去,站内没有任何入口指向它们。
归档页和标签体系就是为了解决”内容沉底”。归档页解决”按时间找到”,标签页解决”按主题找到”,内链解决”从热门内容导向冷门内容”。三者配合起来,老文章才有机会被重新发现。很多博主只重视发布环节,把归档页交给主题默认样式——一个纯文本链接列表,既没有描述也没有文章数,读者和搜索引擎都不会认真对待。
原理分析:三类列表页的分工与收录策略
WordPress 默认提供三种列表:日期归档(is_date())、分类归档(is_category())、标签归档(is_tag())。它们的本质都是 WP_Query 的一次查询加一个模板文件,但在 SEO 上定位完全不同:日期归档的搜索需求极低,通常不需要被索引;分类归档是栏目主页,必须精心维护;标签归档是主题聚合页,只有积累了足够多的文章才值得被索引。
| 页面类型 | 是否索引 | 维护重点 | 典型问题 |
|---|---|---|---|
| 分类归档 | 是 | 描述文案、置顶文章 | 描述为空导致模板化 |
| 标签归档 | ≥3 篇才索引 | 标签命名统一 | 同义词标签泛滥 |
| 日期归档 | 否 | 保持可访问即可 | 被大量索引造成重复 |
| 作者归档 | 单作者站建议否 | 与关于页重复 | 与关于页内容雷同 |
判断一个标签页是否值得索引,可以用这条规则:文章数 ≥3 且标签名在站内没有同义词孪生兄弟。不满足就 noindex,把抓取预算留给真正有价值的页面。
保姆级实操
步骤 1:做一个”按年分组”的时间归档页。 建一个自定义页面模板,循环按年份输出文章标题与日期,比默认的月度链接列表更像”内容地图”。
<?php
/**
* Template Name: 年度归档
*/
get_header();
$years = $wpdb->get_col(
"SELECT DISTINCT YEAR(post_date) FROM {$wpdb->posts}
WHERE post_status = 'publish' AND post_type = 'post'
ORDER BY post_date DESC"
);
foreach ( $years as $year ) :
$posts = get_posts( array(
'post_type' => 'post',
'posts_per_page' => -1,
'year' => (int) $year,
'orderby' => 'date',
'order' => 'DESC',
) );
?>
<section class="archive-year">
<h2><?php echo esc_html( $year ); ?> 年(<?php echo count( $posts ); ?> 篇)</h2>
<ul>
<?php foreach ( $posts as $p ) : ?>
<li>
<time><?php echo esc_html( get_the_date( 'm-d', $p ) ); ?></time>
<a href="<?php echo esc_url( get_permalink( $p ) ); ?>">
<?php echo esc_html( get_the_title( $p ) ); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</section>
<?php
endforeach;
get_footer();
步骤 2:给低价值归档页加 noindex。 用 wp_robots 过滤器,WordPress 5.7 之后推荐这种写法,避免和 robots.txt 冲突。
add_filter( 'wp_robots', 'mimangfei_archive_noindex' );
function mimangfei_archive_noindex( $robots ) {
if ( is_date() || is_author() ) {
$robots['noindex'] = true;
$robots['follow'] = true;
}
if ( is_tag() ) {
$term = get_queried_object();
if ( $term && $term->count < 3 ) {
$robots['noindex'] = true;
}
}
return $robots;
}
步骤 3:用 wp_get_archives() 输出侧边栏月度归档。 内置函数不用自己写查询,show_post_count 能显示每月篇数。
wp_get_archives( array(
'type' => 'monthly',
'limit' => 12,
'format' => 'html',
'show_post_count' => true,
'echo' => true,
) );
步骤 4:清理无价值的标签。 先查出只用过一次或零次的标签,再批量删除。
SELECT t.term_id, t.name, tt.count
FROM wp_terms t
JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'post_tag' AND tt.count < 2
ORDER BY tt.count ASC;
# 确认列表后删除(把 123 换成实际 term_id)
wp term delete post_tag 123
步骤 5:在文章底部自动输出”相关文章”。 优先按标签匹配,标签不足时回退到同分类最新文章,保证每篇文章底部都有出口。
function mimangfei_related_posts( $post_id, $limit = 5 ) {
$tags = wp_get_post_tags( $post_id, array( 'fields' => 'ids' ) );
$args = array(
'post__not_in' => array( $post_id ),
'posts_per_page' => $limit,
'orderby' => 'rand',
);
if ( $tags ) {
$args['tag__in'] = $tags;
}
$related = get_posts( $args );
if ( count( $related ) < $limit ) {
$fallback = get_posts( array(
'category__in' => wp_get_post_categories( $post_id ),
'post__not_in' => array( $post_id ),
'posts_per_page' => $limit - count( $related ),
) );
$related = array_merge( $related, $fallback );
}
return $related;
}
步骤 6:在热门文章里手动补老文章链接。 每月挑 3 篇流量最高的文章,在正文中自然插入 2–3 条指向旧文的链接。这是提升老内容曝光最直接的方式。
常见踩坑
- 标签随手建,出现”WordPress””wordpress””WP”三个同义标签。
- 日期归档页被大量索引,浪费抓取预算。
- 相关文章插件按点击量排序,结果全站底部都显示同样 5 篇。
wp_get_archives()缓存不更新,新文章不出现在归档里(可配合缓存插件清除)。- 直接在模板里写
query_posts(),导致分页失效。 - 案例:某技术博客 400 篇文章,站长把每篇文章的关键词都建成标签,最终 900 多个标签里 700 多个只对应 1 篇文章。Search Console 里”已抓取但未索引”堆积上千条。清理标签、给低频标签加 noindex 并合并同义词后,有效索引页面数反而上升了,因为抓取预算被释放到了正文页。
- 归档分页标题全是”归档 – 站点名”,重复标题成百上千。
- 删除标签后没清理
term_relationships残留数据,导致统计不准。
总结
归档体系是否健康,用两个指标判断:老文章(发布超过 6 个月)的月访问量占比是否超过 30%,以及 noindex 页面数是否远高于索引页面数。行动清单:① 分类页必须填描述;② 标签少于 3 篇就 noindex;③ 日期与作者归档统一 noindex;④ 每季度清理低频标签;⑤ 每篇文章底部有相关推荐;⑥ 每月给热门文章补老内容内链。延伸阅读 博客 RSS 与邮件订阅、WordPress 站点地图优化 与 博客文章排版规范。
