场景:需要统计关联文章数
很多 Bricks 站点的内容结构都依赖 ACF 的 Relationship 字段:比如「国家 → 城市」这种一对多的关系,一个国家文章通过 related_cities 字段关联了若干篇城市文章。此时你想在国家的卡片或详情页上输出「该国家下共有 N 个城市」这样的统计数字,直接用 Bricks 自带的动态数据是拿不到的——默认只能输出关联文章列表,不能输出数量。
这个免费教程提供一个自定义函数,在任何需要的地方输出关联文章的数量,还能在查询循环(Query Loop)里针对每一篇循环项动态计算。
Step 1:注册统计函数
把下面的代码加到子主题的 functions.php(不要带开头的 PHP 标签)或代码片段插件(如 Code Snippets)里:
/**
* Get the count of related posts for the current post
* or a specific post ID
*
* @param string $field_name The relationship field name slug.
* @param int $post_id Optional. The ID of the post. Defaults to current post ID.
* @return int Number of related posts
*/
function bl_get_related_posts_count( string $field_name, int $post_id = 0 ): int {
$post_id = $post_id ?: get_the_ID();
$related_posts = get_field( $field_name, $post_id );
if ( ! $related_posts || ! is_array( $related_posts ) ) {
return 0;
}
return count( $related_posts );
}
用法示例:bl_get_related_posts_count( 'related_cities' ),其中 related_cities 就是你的 Relationship 字段名。如果字段为空或不是数组(比如单篇关联文章时 ACF 返回单个 ID),函数会安全地返回 0,不会报错。
Step 2:白名单 + echo 动态数据
Bricks 出于安全考虑,{echo:...} 动态数据标签默认只能调用白名单内的函数。要把自己的函数放行,再加一段:
add_filter( 'bricks/code/echo_function_names', function() {
return [
'bl_get_related_posts_count'
];
} );
然后在 Bricks 编辑器里,任意元素的动态数据输入框填入:
{echo:bl_get_related_posts_count(related_cities)}
即可实时输出当前文章的关联数量。如果页面有多个查询循环,函数默认取「当前循环项」的文章 ID,所以每个卡片都会显示各自对应的数字。
原理说明
get_field( $field_name, $post_id )是 ACF 的核心取字段函数,第二个参数传文章 ID 可以脱离「当前文章」上下文取值——这是函数支持$post_id参数的原因。- Relationship 字段返回的是数组(多选时),
count()直接得到数量;单选返回单个 ID 或字符串,函数里先判断is_array()再计数,避免count()报错。 bricks/code/echo_function_names是 Bricks 官方的函数白名单过滤器,只有注册过的函数才能通过{echo:...}在构建器里执行。
小结
这个技巧的核心就两步:一个健壮的统计函数 + 一次白名单注册。之后在 Bricks 的任何动态数据位置(标题、按钮、徽章数字)都能输出关联数量,还能搭配条件逻辑做「有关联才显示」的复合判断。如果字段是 Meta Box 的 Relationship,思路完全一致,把 get_field 换成 rwmb_meta 即可。
小结:ACF Relationship 的数量统计不需要任何插件,两个函数搞定。关键是记住 bricks/code/echo_function_names 白名单这一步,忘了它 {echo:...} 不会生效。