搜索全站
主题 16 分钟阅读

WordPress 作者页与归档页 SEO:是否 noindex 与内容补全

作者页内容稀薄被判低质量?本文讲清作者页与归档页的收录取舍,给出 author.php 补全代码、wp_robots 条件 noindex、多作者与单作者的不同策略与验证方法。

U
UFO_PF 2024-08-01 · 阅读 16 分钟
Wo 主题
阅读提示
本文约 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,作者页就套用了通用归档模板,输出的是最精简的样子,这也是作者页「内容稀薄」的技术原因。

保姆级实操

  1. 先判断站点类型:单作者站直接 noindex 作者页;多作者站进入下一步。
  2. 统计作者产出:用 count_user_posts() 判断该作者文章数,低于阈值(如 3 篇)的作者页才 noindex。
  3. 建 author.php:补上头像、简介、社交媒体链接、文章数、最新文章列表。
  4. 条件输出 noindex:用 wp_robots 过滤器按条件标签与作者文章数决定。
  5. 补结构化数据:多作者站可以给作者页加 Person 类型数据。
  6. 内链处理:作者页的文章列表要真实输出,别只放一句「暂无文章」。
  7. 验证:用 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";
}

常见踩坑

  1. 同时 robots 屏蔽和 noindex:爬虫被 robots.txt 挡住,看不到 noindex 指令,页面以「无描述」形式长期留在索引里。二选一,推荐只 noindex。
  2. 所有归档页一刀切 noindex:把有价值的分类页也屏蔽了,损失大量长尾流量。分类页应保留并补全描述。
  3. 案例:某多作者科技站为了「清理低质量页面」,把所有 /author/ 全部 robots 屏蔽。半年后发现作者姓名相关的品牌词搜索里,站点完全不出现——原本作者页承载的作者身份信号全部消失。改成保留高产作者页、只 noindex 产出少于 3 篇的作者页,并补全简介与社交链接,品牌词曝光逐步恢复。教训:作者页不只是列表页,它承载着作者身份信号。
  4. count_user_posts() 参数顺序:签名是 count_user_posts( $userid, $post_type, $public_only ),漏掉第三个参数会把非公开文章也算进去,导致判断偏差。
  5. get_the_author() 在归档页外失效:它依赖全局 $authordata,在 author.php 里没问题,但在其他模板里调用会得到空值。用 get_queried_object_id() 拿 ID 更可靠。
  6. 作者简介为 HTML 但未过滤:description 字段允许 HTML,直接 echo 有 XSS 风险。用 wp_kses_post() 过滤。
  7. 与 SEO 插件重复输出 noindex:插件已经把作者页 noindex,主题又输出一次 meta 标签,页面里出现两条 robots meta。用 wp_robots 过滤器统一处理,不要手写标签。
  8. 作者页 URL 泄漏用户名:/author/admin/ 暴露了登录名,等于把暴力破解的一半信息送出去。让作者 slug 与登录名不同,或在后台修改 user_nicename。

总结

作者页的判断标准是:这个页面对读者是否有独立价值。多作者站里,产出稳定、有简介有头像的作者页值得保留并补全;产出寥寥、简介为空的作者页应当 noindex。行动清单:判断单/多作者 → 用 count_user_posts() 设阈值 → 建 author.php 补全头像、简介、文章数、社交链接 → 用 wp_robots 条件输出 noindex(不要同时在 robots.txt 屏蔽)→ 多作者站补 Person 结构化数据 → 修改作者 slug 避免泄漏用户名 → 在 Search Console 观察。日期类归档的取舍思路类似,可参考 主题日期归档是否该保留。

U
UFO_PF作者

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

留下你的想法

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