本文约 6,294 字,预计阅读 16 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:一堆只有三篇文章的作者页,拉低了整站的质量印象
Search Console 的「网页」报告里,经常能看到大量 /author/zhangsan/ 这样的 URL 被收录,但点击量永远是 0。这些作者页内容极其稀薄:一个头像、一段简介、几篇文章标题。Google 的质量评估指南里,这类「内容稀薄(thin content)」页面过多会拉低整站的质量印象,而它们本身又带不来任何流量。
但作者页也不是一律该删。多人协作的站点(媒体站、多作者博客)里,作者页是读者「关注某个作者」的入口,有真实价值,甚至可以用 Person 结构化数据表达作者身份,对 E-E-A-T(经验、专业、权威、可信)的信号建设有帮助。判断的关键在于站点是单人还是多人,以及作者页有没有实质内容。本文给出两种情况下的不同处理方式,以及补全作者页的代码。
原理分析:两类归档页的差异与 noindex 的正确用法
WordPress 的归档页有几种,收录策略应当区别对待:
| 归档类型 | 典型 URL | 建议策略 |
|---|---|---|
| 分类/标签页 | /category/xxx/ |
保留并补全内容 |
| 作者页 | /author/xxx/ |
单作者站 noindex,多作者站保留 |
| 日期归档 | /2024/05/ |
视内容量决定,通常 noindex |
| 自定义分类法 | /product-cat/xxx/ |
保留并补全 |
noindex 的正确用法有个重要细节:加了 noindex 的页面必须允许爬虫抓取,否则爬虫看不到这个指令,页面会以「无描述」的形式留在索引里。所以不要同时在 robots.txt 里屏蔽 /author/,这两个手段是互斥的:要么 robots 屏蔽(爬虫不来,页面可能仍被索引为无描述 URL),要么 noindex(爬虫能来,看到指令后移除)。
WordPress 5.7 起提供了 wp_robots 过滤器,是官方推荐的 robots meta 输出方式。它接收一个关联数组,键为指令名(如 noindex、nofollow、max-image-preview),值为布尔或字符串。用 add_filter( 'wp_robots', ... ) 配合条件标签即可精确控制,比手写 <meta name="robots"> 稳妥(也避免了与 SEO 插件重复输出)。
作者页的模板优先级是 author-{nicename}.php → author-{id}.php → author.php → archive.php → index.php。多数主题只有 archive.php,作者页就套用了通用归档模板,输出的是最精简的样子,这也是作者页「内容稀薄」的技术原因。
保姆级实操
- 先判断站点类型:单作者站直接 noindex 作者页;多作者站进入下一步。
- 统计作者产出:用
count_user_posts()判断该作者文章数,低于阈值(如 3 篇)的作者页才 noindex。 - 建 author.php:补上头像、简介、社交媒体链接、文章数、最新文章列表。
- 条件输出 noindex:用
wp_robots过滤器按条件标签与作者文章数决定。 - 补结构化数据:多作者站可以给作者页加
Person类型数据。 - 内链处理:作者页的文章列表要真实输出,别只放一句「暂无文章」。
- 验证:用 URL 检查工具看 robots meta 是否生效,并在 Search Console 观察移除进度。
<?php
// 子主题 functions.php:按作者产出决定是否 noindex
add_filter( 'wp_robots', 'mimangfei_author_robots' );
function mimangfei_author_robots( $robots ) {
if ( ! is_author() ) {
return $robots;
}
$author_id = get_queried_object_id();
$count = (int) count_user_posts( $author_id, 'post', true );
// 产出少于 3 篇的作者页不参与索引
if ( $count < 3 ) {
$robots['noindex'] = true;
$robots['nofollow'] = true;
}
return $robots;
}
<?php
/**
* author.php
*
* @package lumen-mimangfei-child
*/
get_header();
$author_id = get_queried_object_id();
$count = (int) count_user_posts( $author_id, 'post', true );
?>
<main id="primary" class="site-main site-main--author">
<header class="author-header">
<div class="author-avatar">
<?php echo get_avatar( $author_id, 96 ); ?>
</div>
<div class="author-info">
<h1><?php echo esc_html( get_the_author_meta( 'display_name', $author_id ) ); ?></h1>
<?php
$desc = get_the_author_meta( 'description', $author_id );
if ( $desc ) :
?>
<p class="author-bio"><?php echo wp_kses_post( wpautop( $desc ) ); ?></p>
<?php
endif;
?>
<p class="author-meta">
共发布 <?php echo esc_html( $count ); ?> 篇文章
<?php
$url = get_the_author_meta( 'user_url', $author_id );
if ( $url ) :
?>
· <a href="<?php echo esc_url( $url ); ?>" rel="nofollow noopener" target="_blank">个人站点</a>
<?php
endif;
?>
</p>
</div>
</header>
<?php if ( have_posts() ) : ?>
<ul class="author-posts">
<?php
while ( have_posts() ) :
the_post();
?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<time datetime="<?php echo esc_attr( get_the_date( DATE_W3C ) ); ?>">
<?php echo esc_html( get_the_date() ); ?>
</time>
</li>
<?php
endwhile;
?>
</ul>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>该作者还没有发布文章。</p>
<?php endif; ?>
</main>
<?php
get_footer();
<?php
// 多作者站:给作者页补 Person 结构化数据
add_action( 'wp_head', 'mimangfei_author_person_json_ld' );
function mimangfei_author_person_json_ld() {
if ( ! is_author() ) {
return;
}
$author_id = get_queried_object_id();
$data = array(
'@context' => 'https://schema.org',
'@type' => 'Person',
'name' => get_the_author_meta( 'display_name', $author_id ),
'description' => get_the_author_meta( 'description', $author_id ),
'url' => get_author_posts_url( $author_id ),
);
$url = get_the_author_meta( 'user_url', $author_id );
if ( $url ) {
$data['sameAs'] = array( esc_url_raw( $url ) );
}
echo '<script type="application/ld+json">'
. wp_json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES )
. '</script>' . "\n";
}
常见踩坑
- 同时 robots 屏蔽和 noindex:爬虫被 robots.txt 挡住,看不到 noindex 指令,页面以「无描述」形式长期留在索引里。二选一,推荐只 noindex。
- 所有归档页一刀切 noindex:把有价值的分类页也屏蔽了,损失大量长尾流量。分类页应保留并补全描述。
- 案例:某多作者科技站为了「清理低质量页面」,把所有
/author/全部 robots 屏蔽。半年后发现作者姓名相关的品牌词搜索里,站点完全不出现——原本作者页承载的作者身份信号全部消失。改成保留高产作者页、只 noindex 产出少于 3 篇的作者页,并补全简介与社交链接,品牌词曝光逐步恢复。教训:作者页不只是列表页,它承载着作者身份信号。 count_user_posts()参数顺序:签名是count_user_posts( $userid, $post_type, $public_only ),漏掉第三个参数会把非公开文章也算进去,导致判断偏差。get_the_author()在归档页外失效:它依赖全局$authordata,在author.php里没问题,但在其他模板里调用会得到空值。用get_queried_object_id()拿 ID 更可靠。- 作者简介为 HTML 但未过滤:
description字段允许 HTML,直接 echo 有 XSS 风险。用wp_kses_post()过滤。 - 与 SEO 插件重复输出 noindex:插件已经把作者页 noindex,主题又输出一次 meta 标签,页面里出现两条 robots meta。用
wp_robots过滤器统一处理,不要手写标签。 - 作者页 URL 泄漏用户名:
/author/admin/暴露了登录名,等于把暴力破解的一半信息送出去。让作者 slug 与登录名不同,或在后台修改user_nicename。
总结
作者页的判断标准是:这个页面对读者是否有独立价值。多作者站里,产出稳定、有简介有头像的作者页值得保留并补全;产出寥寥、简介为空的作者页应当 noindex。行动清单:判断单/多作者 → 用 count_user_posts() 设阈值 → 建 author.php 补全头像、简介、文章数、社交链接 → 用 wp_robots 条件输出 noindex(不要同时在 robots.txt 屏蔽)→ 多作者站补 Person 结构化数据 → 修改作者 slug 避免泄漏用户名 → 在 Search Console 观察。日期类归档的取舍思路类似,可参考 主题日期归档是否该保留。
