本文约 3,958 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:URL 是 /seo/baidu/deadlink/,页面上却看不出层级
很多站点的 URL 明明是三级结构,页面上却只有一个返回首页的链接,用户不知道自己在哪个栏目下,百度也只能靠 URL 猜测层级。另一种情况是主题自带面包屑,但输出的是纯文本 首页 > SEO > 百度SEO,没有结构化数据,百度在结果页里就无法展现那排可点击的层级路径,白白损失了结果页里的额外展示位和点击入口。
原理分析:面包屑给百度传递两类信息
第一类是站内层级关系。面包屑明确告诉爬虫:这个页面属于哪个栏目,栏目属于哪个更大的类目。对于 URL 结构不规范(比如用 ID 或随机字符串做路径)的站点,面包屑几乎是唯一的层级信号来源。
第二类是结果页的展现增强。百度支持 BreadcrumbList 结构化数据,正确标注后,搜索结果里可能用层级路径替代部分 URL 显示,例如”迷忙飞 › 百度SEO › 死链提交”。这种展现比裸 URL 更易读,点击率通常更高。
| 实现方式 | 百度可识别层级 | 结果页增强 | 维护成本 |
|---|---|---|---|
| 纯文本面包屑 | 可(弱) | 无 | 低 |
| 微数据 Microdata | 可 | 有 | 中 |
| JSON-LD | 可(推荐) | 有 | 低 |
| 无面包屑 | 仅靠 URL | 无 | — |
推荐用 JSON-LD 输出,因为它不侵入 HTML 结构,改主题时不会破坏标记,也便于在插件之间保持一致。百度搜索资源平台的”结构化数据”模块可以查看站点结构化数据的收录与解析情况,提交后需要等待一段时间才能看到结果。
保姆级实操
步骤1:确认层级定义
一般为「首页 › 分类 › 当前文章」。多层级分类建议只显示直接父级,避免面包屑过长。
步骤2:不用插件输出 JSON-LD
在主题的 functions.php 里挂到 wp_head,按页面类型生成对应数据:
// functions.php:输出 BreadcrumbList 结构化数据(JSON-LD)
add_action( 'wp_head', function() {
if ( is_front_page() ) {
return;
}
$items = array();
$pos = 1;
$items[] = array(
'@type' => 'ListItem',
'position' => $pos++,
'name' => get_bloginfo( 'name' ),
'item' => home_url( '/' ),
);
if ( is_single() ) {
$cats = get_the_category();
if ( $cats ) {
$cat = $cats[0];
$items[] = array(
'@type' => 'ListItem',
'position' => $pos++,
'name' => $cat->name,
'item' => get_category_link( $cat->term_id ),
);
}
$items[] = array(
'@type' => 'ListItem',
'position' => $pos++,
'name' => get_the_title(),
);
} elseif ( is_category() ) {
$items[] = array(
'@type' => 'ListItem',
'position' => $pos++,
'name' => single_cat_title( '', false ),
);
} else {
return;
}
$data = array(
'@context' => 'https://schema.org',
'@type' => 'BreadcrumbList',
'itemListElement' => $items,
);
echo '<script type="application/ld+json">'
. wp_json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES )
. '</script>' . "\n";
} );
步骤3:同时输出可见的面包屑 HTML
结构化数据不能替代可见导航,用户看到的层级同样重要:
// 在 single.php / category.php 顶部调用
function mimangfei_breadcrumb_html() {
$html = '<nav class="breadcrumb" aria-label="面包屑导航">';
$html .= '<a href="' . esc_url( home_url( '/' ) ) . '">首页</a> › ';
if ( is_single() ) {
$cats = get_the_category();
if ( $cats ) {
$html .= '<a href="' . esc_url( get_category_link( $cats[0]->term_id ) ) . '">'
. esc_html( $cats[0]->name ) . '</a> › ';
}
$html .= '<span>' . esc_html( get_the_title() ) . '</span>';
} elseif ( is_category() ) {
$html .= '<span>' . esc_html( single_cat_title( '', false ) ) . '</span>';
}
$html .= '</nav>';
echo $html;
}
步骤4:最后一级不加链接
当前页面自身不应是链接,这是结构化数据的规范要求,也避免自链。
步骤5:不要用文章标题以外的词做末级名称
末级 name 应与页面主体一致,写成”正文页”或”详情页”等于没有信息。
步骤6:在搜索资源平台验证
提交站点后,在百度搜索资源平台的”结构化数据”里查看解析状态与生效数量。也可以用百度的结构化数据校验工具粘贴单页 URL 做即时检查。
步骤7:与 URL 结构保持一致
如果 URL 是扁平的 /post-123.html,面包屑却显示三级层级,二者冲突会让百度无所适从。层级表达的一致性同样适用于 分类页与标签页收录策略 里提到的聚合页。
常见踩坑
- 只有结构化数据没有可见面包屑:属于标记与页面不符,可能被判定为无效标注。
- 末级带链接:规范要求最末一级只有 name,不应给 item。
- position 从 0 开始:BreadcrumbList 的 position 应从 1 开始递增。
- 多分类时输出多个父级:面包屑会出现分叉,建议只取主分类。
- 案例:某站点手工在主题里写了一段 Microdata 面包屑,改主题时新模板没有保留
itemprop属性,导致结构化数据静默失效半年无人发现,结果页里层级展现全部消失。改用 JSON-LD 集中输出后,不再受模板改动影响。 - 与主题自带面包屑重复输出:装了 Rank Math 又自己加一段,页面出现两套 BreadcrumbList,百度可能解析错误。
- 面包屑里放关键词堆砌:把末级写成堆词标题,与页面主题不符。
总结
面包屑的最低要求是”用户能看出自己在哪”,进阶要求是”百度能用它做结果页增强”。实现上用 JSON-LD 输出 BreadcrumbList,位置从 1 开始、末级不带 item,同时保留一份可见 HTML。上线后在搜索资源平台的结构化数据模块核对解析结果,避免”写了但没生效”的静默失败。层级清晰之后,配合 站内锚文本建设方法 让栏目页承接类目词,整站的层级表达才算完整。
