搜索全站
Google SEO 16 分钟阅读

Organization 与 WebSite 站点级结构化数据:品牌与全站实体标注

品牌名被 Google 认成别的词、Logo 一直不显示、知识面板信息混乱——多半是站点级实体没标清楚。讲清 Organization 与 WebSite 的必填推荐字段、@id 串联方法与 WordPress 落地代码。

U
UFO_PF 2022-01-16 · 阅读 16 分钟
Or GOOGLE SEO
阅读提示
本文约 6,210 字,预计阅读 16 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:站标了文章 schema,却没标”这个站是谁”

大多数站长接触结构化数据是从 Article、Product 开始的,于是出现一种很典型的断层:每篇文章都标得整整齐齐,唯独”谁在运营这个站”这件事从头到尾没声明过。后果体现在几个不起眼却很贵的地方——品牌词搜索时右侧知识面板显示的信息残缺甚至张冠李戴;Logo 换了三个月,Google 仍在用旧图;同一家公司被 Google 当成两个互不相干的实体,权重分散在两边。修补的方法就是补上站点级的两个节点:Organization 描述主体是谁、logo 与 contactPoint 讲清楚联系方式,WebSite 描述域名本身,publisher 把文章归属到组织。这两个节点通常只在首页输出一次,却会被全站其它节点通过 @id 引用,属于典型的”低投入高杠杆”工程。

原理分析:节点不是孤岛,靠 @id 织成一张图

现代 JSON-LD 的主流写法不是每个页面各写各的孤立对象,而是在同一份 @graph 里放多个节点,彼此用 @id 互相指向。首页里典型的两个锚点是:

节点 @id 建议 必填字段 推荐字段
Organization https://站点/#organization name、url、logo sameAs、contactPoint、address、founder
WebSite https://站点/#website name、url publisher(@id)、potentialAction、inLanguage

sameAs 是一组权威第三方主页地址(公司官方 LinkedIn、GitHub、维基词条、行业目录等),它承担的功能是”实体对齐”——告诉 Google 这个组织和那些页面上的实体是同一个。这里有个务实的提醒:只填真实的、你自己控制的官方页面,不要把员工个人账号堆进去,也不要列一堆 SEO 外链式的垃圾目录页,这类做法已经被证明无效甚至有害。

关于 WebSite.potentialAction 与 SearchAction 需要说清楚一个变化:Google 在 2023 年下线了”站点链接搜索框(sitelinks searchbox)”这一展示形态,也就是说现在即使你写了完整的 SearchAction,也不再能从 Google 搜索结果里拿到站内搜索框。但它仍是一个合规、其它消费方能读懂的声明,且 target 里的 {search_term_string} 占位符写法依旧被广泛支持。所以建议是:保留但不依赖,不要为它单独做技术改造。为了保证它在 GSC 里不报错,potentialAction 的 target 必须是完整可达的搜索 URL,且 query-input 声明要与占位符一致。

最后要注意输出位置的一致性:Organization 一般只在首页输出,文章页通过 publisher.@id 指向它即可,全站重复输出同一份 Organization 会造成节点冗余,处理手法见避免结构化数据重复输出的方案。

保姆级实操

第一步:在首页输出一份 @graph,包含两个锚点

手写时用 @graph 把 Organization 与 WebSite 放在同一个 <script> 里,避免多段 script 各自为政。

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://mimangfei.com/#organization",
      "name": "迷芒飞",
      "alternateName": "Mimangfei",
      "url": "https://mimangfei.com/",
      "logo": {
        "@type": "ImageObject",
        "@id": "https://mimangfei.com/#logo",
        "url": "https://mimangfei.com/wp-content/uploads/logo.png",
        "width": 512,
        "height": 512
      },
      "sameAs": [
        "https://x.com/mimangfei",
        "https://github.com/mimangfei"
      ],
      "contactPoint": [
        {
          "@type": "ContactPoint",
          "contactType": "customer support",
          "email": "hello@example.com",
          "availableLanguage": ["Chinese", "English"]
        }
      ]
    },
    {
      "@type": "WebSite",
      "@id": "https://mimangfei.com/#website",
      "url": "https://mimangfei.com/",
      "name": "迷芒飞",
      "publisher": { "@id": "https://mimangfei.com/#organization" },
      "inLanguage": "zh-CN",
      "potentialAction": {
        "@type": "SearchAction",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://mimangfei.com/?s={search_term_string}"
        },
        "query-input": "required name=search_term_string"
      }
    }
  ]
}

第二步:用 WordPress 钩子按页面类型输出

只在首页输出站点级图谱,其余页面用引用方式复用,代码放在子主题的 functions.php:

add_action( 'wp_head', function () {
    if ( ! is_front_page() ) {
        return;
    }
    $home = home_url( '/' );
    $graph = [
        '@context' => 'https://schema.org',
        '@graph'   => [
            [
                '@type' => 'Organization',
                '@id'   => $home . '#organization',
                'name'  => get_bloginfo( 'name' ),
                'url'   => $home,
                'logo'  => [
                    '@type'  => 'ImageObject',
                    'url'    => get_site_icon_url( 512, $home . 'wp-content/uploads/logo.png' ),
                    'width'  => 512,
                    'height' => 512,
                ],
            ],
            [
                '@type'    => 'WebSite',
                '@id'      => $home . '#website',
                'url'      => $home,
                'name'     => get_bloginfo( 'name' ),
                'inLanguage' => get_bloginfo( 'language' ),
                'publisher' => [ '@id' => $home . '#organization' ],
            ],
        ],
    ];
    echo '<script type="application/ld+json">' . wp_json_encode( $graph, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) . '</script>';
}, 5 );

第三步:文章页只做引用,不重复定义

Article 节点里用 "publisher": { "@id": "https://mimangfei.com/#organization" } 即可。这样无论多少篇文章,组织实体的唯一权威定义始终只有一处,改 logo 只需改首页那一行。

第四步:接管 Yoast 输出(如果你在用它)

Yoast 本身就会产出这两个节点,自己手写会形成双份。此时应该走它的图碎片接口,而不是无视它另起炉灶。

add_filter( 'wpseo_schema_graph_pieces', function ( $pieces, $context ) {
    // 移除 Yoast 自带的 Organization 碎片,改用自己的首页输出
    foreach ( $pieces as $k => $piece ) {
        if ( stripos( get_class( $piece ), 'Organization' ) !== false ) {
            unset( $pieces[ $k ] );
        }
    }
    return $pieces;
}, 11, 2 );

第五步:用 Rich Results Test 与 validator.schema.org 双检

前者确认没有必填项缺失,后者确认 contactPoint、SearchAction 之类的词汇用法没有拼错。两套工具的取舍逻辑见Rich Results Test 与 Schema Markup Validator 校验流程。

常见踩坑

  1. logo 只给了一个 URL 字符串:Google 明确推荐用 ImageObject 并给出宽高,纯字符串虽不报错但不利于图片采纳。
  2. sameAs 塞了一堆无关目录站:实体对齐讲究少量高置信,杂乱反而稀释。
  3. 把个人站标成 Organization 而不是 Person:个人博客用 Person 更贴合,混标会让作者实体与出版者实体打架。
  4. url 用了带 www 而 sitemap 里不带 www:两套规范化要求必须一致,先定 www 策略再写 JSON-LD。
  5. potentialAction 的 {search_term_string} 写成 {searchTerms}:旧写法已弃用,识别不到就不会通过。
  6. 案例:某 SaaS 站改版时把公司名从英文名改成中文名,只改了页面 HTML,没动 JSON-LD 里的 Organization。结果半年内 Google 同时对”英文旧名”和”中文新名”建立了两个实体,品牌词搜索的知识面板时而是旧名(带着三年前的 Logo),时而是新名,用户反馈”以为是山寨站”。修复办法是在 Organization 里补 "alternateName": "旧英文名",明确声明同一实体的历史别名,四周后两边合并。
  7. 只在首页输出却没在任何页面引用:不被引用的实体价值极低,务必在文章、面包屑、产品节点里通过 @id 指回来。

总结

判断标准:Google 有没有把你当成”一个稳定、可识别、有外部佐证的主体”。行动清单:首页输出 @graph → Organization 与 WebSite 各占一个 @id → logo 用 ImageObject 并给宽高 → sameAs 只留真实官方主页 → 文章页用 publisher.@id 引用而非重定义 → 与 Yoast 冲突时走 wpseo_schema_graph_pieces 去重 → 双工具校验。站点级 schema 是一次性投入,之后几乎不用维护,是全站最划算的一处标记。若你的站点有多个线下门店,下一步可以接着做LocalBusiness 结构化数据(本地业务)。

U
UFO_PF作者

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

留下你的想法

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