本文约 4,413 字,预计阅读 12 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:教程类站点最受伤的一次调整
做工具类、数码类、建站教程类站点的朋友,对带有步骤折叠的 HowTo 富媒体结果一定不陌生:搜索结果下面直接挂着”预计时长 10 分钟””总成本 200 元”和三四个展开步骤,点击率相当可观。但随着 Google 对富媒体形态的整体收缩,HowTo 也加入了被下线的一批——从搜索结果层面看,普通站点已经拿不到这类展示。很多站长因此直接把 HowTo JSON-LD 从模板里删干净,连带把步骤区的语义结构也拆了。但从内容资产的角度,这是一次过度调整:步骤型内容本身依然是稀缺的高价值内容,机器可读性不只服务富媒体 UI,还服务于页面摘要、知识抽取和 AI 概览类的场景。真正要做的是把”写教程”和”标 HowTo”这两件事分开优化。
原理分析:HowTo 的数据模型与 Google 侧的取舍
HowTo 的数据模型本身很清晰,schema.org 里并没有因为 Google 下线而废弃它。核心节点包括 HowTo(含 name、totalTime、estimatedCost、supply、tool、step),其中每个 step 是 HowToStep,带 name、text、url 和可选的 image;轮播式的多步组合则可用 HowToSection 包裹多组 HowToStep。这套结构第三方解析器、知识工具、内部搜索都还在用。
Google 下线的理由是产品侧的产品决策——折叠步骤把搜索结果页拉长,挤压了自然结果的可见性,同时被大量低质教程滥用。这与你写得是否正确无关。看清这一点后,留下 HowTo 标记的成本收益比就变了:
| 场景 | 是否建议保留 HowTo 标记 |
|---|---|
| 纯教程站,追求 Google 搜索结果看点上浮 | 收益已消失,可做可不做 |
| 内容会被第三方工具、检索增强服务复用 | 建议保留,语义结构有外部价值 |
| 页面步骤区本身结构清晰,希望被稳定解析 | 建议保留 |
| 步骤是凑数的、或页面主体不是教程 | 一律删除 |
需要强调的是,只要保留,就必须严格遵守 schema.org 与 Google 通用规范的交叉要求:totalTime 要符合 ISO 8601 时长格式(如 PT10M),estimatedCost 要挂 MonetaryAmount 并带 currency,每个 HowToStep 的文字必须在页面上真实可见。标记的精细化程度可参考Organization / WebSite 站点级结构化数据里关于同一实体用 @id 串联的做法。
保姆级实操
第一步:把教程正文先重构成稳定的 DOM 结构
标记是给已有结构贴标签,不是凭空造结构。正文里应有一级标题区(总览:要多久、要多少钱、要准备什么),然后是若干 h2/h3 对应到每个步骤,每步配一张图。Gutenberg 里可以用 Group + Heading + Image 的原生区块完成,不必依赖插件短代码。
第二步:按 data model 写一份 JSON-LD
注意时长用 ISO 8601,成本用 MonetaryAmount,步骤锚点能落到真实页面锚点。
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "如何在 WordPress 中启用 Redis 对象缓存",
"description": "通过安装 Redis 服务端与对象缓存插件,为 WordPress 提供持久化对象缓存。",
"totalTime": "PT15M",
"estimatedCost": {
"@type": "MonetaryAmount",
"currency": "CNY",
"value": "0"
},
"supply": [
{ "@type": "HowToSupply", "name": "已安装 Redis 的服务器" },
{ "@type": "HowToSupply", "name": "WordPress 管理员账号之外的 FTP 或 SSH 权限" }
],
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "确认 Redis 实例可用",
"text": "在服务器上执行 redis-cli ping,返回 PONG 说明实例正常。",
"url": "https://mimangfei.com/redis-object-cache/#step-1"
},
{
"@type": "HowToStep",
"position": 2,
"name": "安装对象缓存插件并落地 drop-in",
"text": "安装 Redis Object Cache 插件并启用,object-cache.php 会被写入 wp-content 目录。",
"url": "https://mimangfei.com/redis-object-cache/#step-2"
}
]
}
第三步:让 WordPress 自动从区块内容生成标记
手写 JSON-LD 的问题是改了正文忘了改标记。可以从文章内容里解析 Heading 区块来自动生成 step,保证两侧永不同步错误。
add_filter( 'render_block', function ( $content, $block ) {
if ( 'core/heading' === $block['blockName'] ) {
$level = $block['attrs']['level'] ?? 2;
if ( 3 === (int) $level ) {
$text = wp_strip_all_tags( $content );
$slug = sanitize_title( $text );
$id = 'step-' . $slug;
return preg_replace( '/<h3(.*?)>/', '<h3$1 id="' . esc_attr( $id ) . '">', $content, 1 );
}
}
return $content;
}, 10, 2 );
第四步:把视频和软件内的说明同步校验
如果你的教程同时做了视频版本,VideoObject 与 HowTo 最好共用同一份描述,避免两份内容互相打架;两者的 description 建议用同一段摘要,详见VideoObject 结构化数据提交中的字段写法。
第五步:用 Schema Markup Validator 而不是 Rich Results Test 做主校验
因为 Google 已不生成 HowTo 富媒体结果,Rich Results Test 会提示该类型不被支持。此时应该以 validator.schema.org 为主,确认词汇表层面无错。
常见踩坑
- continue 用
[...]省略 step:有人为了减少代码量手动折叠步骤数组,解析器收到的是不完整对象,直接报错。 - 步骤顺序用
@position与数组位置不一致:两者必须同序,position从 1 开始。 - 把整篇 inode 长文塞进一个 step:HowTo 的价值在粒度均匀,一个 step 承担 3000 字会失去结构化意义。
estimatedCost写成裸字符串200:必须是MonetaryAmount对象,否则成本字段被忽略。- 步骤图片地址是相对路径:
image字段要求绝对 URL,相对路径会被判定无效。 - 案例:某摄影教程站把 60 多篇教程都用插件批量输出 HowTo,内容是”第一步:准备器材;第二步:开始拍摄”这种空话。Google 下线 HowTo 展示后,该站不仅没损失展示,反而因为步骤区被用户吐槽”没说人话”导致停留时长下滑——复盘时发现真正受影响的是内容质量,而不是标记。整改时他们重写了步骤文本并保留 HowTo 标记,页面平均停留时长回升 40 秒。这说明:撤掉 UI 之后,被检验的是内容本身。
- 同一页面既标 Article 又标 HowTo 却没体现主次:应让两者共享同一
mainEntityOfPage,保持语义一致。
总结
判断标准:如果删除 HowTo 标记能让你的维护成本下降且内容不受影响,那就删;如果你的教程有真实的外部复用场景、且结构能被自动解析器读懂,那就保留,但别指望它带来搜索结果层面的展示增量。行动清单:把教程正文重构成 Heading 分级清晰的 DOM → 用截面代码自动生成 step → 时长用 ISO 8601、成本用 MonetaryAmount → 以 Schema Markup Validator 为准 → 每季度抽查一篇的代表性页面。想让美国 performance 与富媒体运营不被断掉,可接着看Rich Results Test 与 Schema Markup Validator 校验流程。
