在 WordPress 6.5 之前,想让区块显示「自定义字段(post meta)」这类动态数据,十有八九得自己写个动态区块(Dynamic Block)。现在有了 Block Bindings API(区块绑定,6.5+),你可以把数据直接「绑」到核心区块的属性上,前端渲染时自动替换——免写自定义区块。
一、它解决什么痛点
很多站点的电影评分、发布日期、阅读量这类信息,本质就是几个 post meta 字段。过去为了显示它们,得专门造一个区块。Block Bindings 的思路是:核心区块(段落、标题、图片、按钮)已经够用了,只差把属性接到数据源。比如把「段落」的内容接到自定义字段,把「图片」的 url 接到外部 API 返回的随机图。
注意版本门槛:Block Bindings API 需要 WordPress 6.5 及以上;core/post-data 与 core/term-data 等数据源是后续版本(6.7/6.9)才加入的。生产环境先确认站点版本。
二、核心数据源(开箱即用)
WordPress 内置了几个绑定源,无需自己注册就能用:
- core/post-meta:把区块属性绑到文章自定义字段(最常用);
- core/post-data:文章数据,如发布日期、永久链接;
- core/term-data:分类/标签等术语数据;
- core/pattern-overrides:让同步图案(Synced Pattern)的局部内容可按实例覆盖。
三、绑定自定义字段到段落(最简实战)
先在主题的 functions.php 或插件里注册一个可暴露给 REST 的 post meta:
register_meta( 'post', 'my_custom_field', array(
'show_in_rest' => true,
'single' => true,
'type' => 'string',
) );
然后在区块的 metadata.bindings 里把它接到段落的 content 属性:
{
"metadata": {
"bindings": {
"content": {
"source": "core/post-meta",
"args": { "key": "my_custom_field" }
}
}
}
}
受保护的字段为什么用不了
post meta 的键不能以「下划线」开头(如 _example_key 是受保护字段),且必须设 show_in_rest => true,否则 Block Bindings 读不到。这是常见踩坑点。
四、进阶:注册自定义绑定源
内置源不够用时,用 register_block_bindings_source() 在 init 钩子里注册自己的源。核心是一个 get_value_callback 回调,返回要填进区块属性的值:
add_action( 'init', function () {
register_block_bindings_source( 'wpmovies/visualization-date', array(
'label' => '上映日期',
'get_value_callback' => function ( $source_args, $block_instance ) {
$post_id = $block_instance->context['postId'];
return isset( $source_args['key'] )
? get_post_meta( $post_id, $source_args['key'], true )
: '';
},
'uses_context' => array( 'postId' ),
) );
} );
返回值还能用 block_bindings_source_value 过滤器再加工,比如把原始日期格式化成「年/月/日」。
查看 Block Bindings 官方手册常见问题
所有区块属性都能绑吗?
不是。目前仅部分核心区块的特定属性支持(如图片的 url/alt、段落/标题的 content、按钮的 url/text)。可用 block_bindings_supported_attributes_ 过滤器为自定义区块扩展。
和动态区块(Dynamic Block)比谁更好?
简单显示类需求用 Block Bindings 更轻;需要复杂渲染逻辑、交互的,仍应写动态区块。两者不互斥。
绑定的数据会被缓存吗?
绑定在区块渲染时求值,属于服务端动态输出,配合整页缓存时需确认缓存策略不会把动态值固化。








评论 (0)