需求场景
Bricks 官方群里有用户问:Bricks 的面包屑能不能用 PHP 过滤器自定义?他的具体需求是——文章归档在 Uncategorized(未分类)分类下,面包屑里会显示 Home / Uncategorized / 文章标题,而他想把中间的 /Uncategorized/ 替换成一个指向其他页面(非归档页)的链接。
Bricks 的面包屑元素在输出时会触发一个官方未文档化的过滤器 bricks/breadcrumbs/items,我们可以用它拿到的面包屑项数组做任意修改。
bricks/breadcrumbs/items 过滤器
在子主题 functions.php 或代码片段插件中添加:
add_filter( 'bricks/breadcrumbs/items', function ( array $breadcrumb_items ): array {
if ( ! is_singular( 'post' ) ) {
return $breadcrumb_items;
}
if ( isset( $breadcrumb_items[1] ) ) {
$breadcrumb_items[1] = str_replace( 'category/uncategorized/', '', $breadcrumb_items[1] );
}
return $breadcrumb_items;
});
效果:在前端单篇文章页上,把面包屑里所有 category/uncategorized/ 字符串替换成空字符串——Uncategorized 这个链接的 URL 中 category/uncategorized/ 部分被清掉,剩下的就指向站点首页,视觉上 Uncategorized 变成了“首页”链接。
代码逻辑:
is_singular( 'post' ):只在单篇文章页生效,其他页面原样返回(用你自己的条件替换即可,比如只针对某个自定义文章类型);$breadcrumb_items[1]:面包屑数组的第 2 项(索引 1)通常就是“分类”那一项。注意数组的键不一定是 0/1/2 连续的,稳妥做法是先array_values()重排或遍历检查,原教程按索引 1 处理即可覆盖多数场景;str_replace:字符串替换,只改这一处 URL 片段,不动面包屑其他部分。
BricksExtras 面包屑的写法
如果你用的是 BricksExtras 的 Site Breadcrumbs 元素(作者也推荐它,因为配置项更多),过滤器名不同,逻辑一样:
add_filter( 'bricksextras/breadcrumbs/', function ( array $breadcrumbsFlat ): array {
if ( ! is_singular( 'post' ) ) {
return $breadcrumbsFlat;
}
if ( isset( $breadcrumbsFlat[1] ) ) {
$breadcrumbsFlat[1] = str_replace( 'category/uncategorized/', '', $breadcrumbsFlat[1] );
}
return $breadcrumbsFlat;
});
原理说明
这两个过滤器暴露的都是“面包屑项数组”,每个元素是带 URL 的 HTML 片段或纯文本。修改面包屑本质就是改这个数组:替换字符串、删除某项、插入新项(比如在分类前插入“产品”链接)都是同一个套路。
一个小提醒:如果后台设置里把面包屑的“首页”项文字改了(比如显示站点名),替换后的效果会相应变化;想精确控制,可以打印 $breadcrumb_items 数组(error_log( print_r( $breadcrumb_items, true ) ))先看清结构再动手。
小结
本文是“官方未文档化钩子”的典型用法:Bricks 很多元素内部都有这种隐藏过滤器,bricks/breadcrumbs/items 就是面包屑的修改入口。掌握了“拿数组 → 改数组 → 返回数组”的三步套路,面包屑想怎么定制都行——换分类名、合并层级、给归档链接加参数,全在一个过滤器里解决。
顺带一提:用 BricksExtras 的用户记得用 bricksextras/breadcrumbs/ 这个过滤器名,两个生态的钩子互不相通。