本文约 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 校验流程。
常见踩坑
logo只给了一个 URL 字符串:Google 明确推荐用ImageObject并给出宽高,纯字符串虽不报错但不利于图片采纳。sameAs塞了一堆无关目录站:实体对齐讲究少量高置信,杂乱反而稀释。- 把个人站标成
Organization而不是Person:个人博客用Person更贴合,混标会让作者实体与出版者实体打架。 url用了带 www 而 sitemap 里不带 www:两套规范化要求必须一致,先定 www 策略再写 JSON-LD。potentialAction的{search_term_string}写成{searchTerms}:旧写法已弃用,识别不到就不会通过。- 案例:某 SaaS 站改版时把公司名从英文名改成中文名,只改了页面 HTML,没动 JSON-LD 里的 Organization。结果半年内 Google 同时对”英文旧名”和”中文新名”建立了两个实体,品牌词搜索的知识面板时而是旧名(带着三年前的 Logo),时而是新名,用户反馈”以为是山寨站”。修复办法是在 Organization 里补
"alternateName": "旧英文名",明确声明同一实体的历史别名,四周后两边合并。 - 只在首页输出却没在任何页面引用:不被引用的实体价值极低,务必在文章、面包屑、产品节点里通过
@id指回来。
总结
判断标准:Google 有没有把你当成”一个稳定、可识别、有外部佐证的主体”。行动清单:首页输出 @graph → Organization 与 WebSite 各占一个 @id → logo 用 ImageObject 并给宽高 → sameAs 只留真实官方主页 → 文章页用 publisher.@id 引用而非重定义 → 与 Yoast 冲突时走 wpseo_schema_graph_pieces 去重 → 双工具校验。站点级 schema 是一次性投入,之后几乎不用维护,是全站最划算的一处标记。若你的站点有多个线下门店,下一步可以接着做LocalBusiness 结构化数据(本地业务)。
