WordPress 块绑定:模式覆盖 pattern-overrides 数据源原理与 3 步配置
【免费下载链接】wordpress-developWordPress Develop, Git-ified. Synced from git://develop.git.wordpress.org/, including branches and tags! This repository is just a mirror of the WordPress subversion repository. Please include a link to a pre-existing ticket on https://core.trac.wordpress.org/ with every pull request.项目地址: https://gitcode.com/GitHub_Trending/wo/wordpress-develop
先说结论:WordPress 块绑定(Block Bindings)解决的是"区块属性值从哪来"的问题,其中core/pattern-overrides数据源专门负责模式覆盖。做主题的同事经常遇到同一类痛点:静态区块把文案写死在 block content 里,改一处主标题,要在每个用到这个区块的模板里挨个动刀。块绑定就是为了让这些值改在一个地方。
主题里大量复用的 Pattern 区块,正是模式覆盖要统一接管的对象
场景:区块为什么需要接上数据
主题里很多区块的内容是写死的:主标题、CTA 按钮文字、配图 alt。文案一改,所有引用该区块的位置都要重开。块绑定把"属性值"和"数据源"解耦:区块里留一份默认值,渲染时由注册过的数据源回调给出真实值。源找不到值,就退回默认值。
读源码:先看注册这一侧
register_block_bindings_source()定义在 src/wp-includes/block-bindings.php,作用是往注册表里登记一个数据源:名字加一个取值回调。回调签名固定为function( $source_args, $block_instance, $attribute_name ): mixed,返回什么,哪个属性就变成什么。下面这段是最小可用的自定义源注册示例,挂在init上即可:
function my_plugin_get_custom_source_value( array $source_args, $block_instance, string $attribute_name ) { $value = $source_args['key']; return "The value passed to the block is: $value"; } function my_plugin_register_block_bindings_sources() { register_block_bindings_source( 'my-plugin/my-custom-source', array( 'label' => __( 'My Custom Source', 'my-plugin' ), 'get_value_callback' => 'my_plugin_get_custom_source_value', ) ); } add_action( 'init', 'my_plugin_register_block_bindings_sources' );这段代码做的事:区块metadata.bindings里传的参数原样进$source_args,回调把它拼成字符串返回,渲染时段落内容就被这个返回值替换。两个硬约束:源名必须带命名空间前缀且只能用小写字母、数字、/和连字符;注册成功返回WP_Block_Bindings_Source对象,失败返回false。
不同 Pattern 区块的文案可以共用同一份覆盖逻辑
再看内置 pattern-overrides 的取值实现
内置源在 src/wp-includes/block-bindings/pattern-overrides.php 注册,关键在取值那几行:
function _block_bindings_pattern_overrides_get_value( array $source_args, $block_instance, string $attribute_name ) { if ( empty( $block_instance->attributes['metadata']['name'] ) ) { return null; } $metadata_name = $block_instance->attributes['metadata']['name']; return _wp_array_get( $block_instance->context, array( 'pattern/overrides', $metadata_name, $attribute_name ), null ); }这段代码在干什么:先用metadata.name确定"我是 Pattern 里的哪个区块",再按pattern/overrides → {metadata.name} → {属性名}的路径从上下文取值。metadata.name是区块在 Pattern 内的唯一键,缺了它根本不知道查哪份覆盖对象,所以直接返回null——语义是"没有可查的值",渲染管线会保留区块原始属性。这个上下文由 Pattern 区块提供:core/block的 block.json 里声明了"providesContext": { "pattern/overrides": "content" },也就是 Pattern 区块的content属性直接成为子区块可读取的覆盖数据。
三步让模式覆盖生效
改完这三处就生效,按顺序来:
- 确认版本 ≥ 6.5。块绑定 API 在 6.5 引入,低于这个版本
register_block_bindings_source()不存在,先升级或加条件判断。 - 在区块的
metadata.bindings中声明core/pattern-overrides。下面这段可直接复制:
{ "metadata": { "name": "my-pattern/heading", "bindings": { "content": { "source": "core/pattern-overrides", "args": { "key": "headline" } } } } }- 为数据源准备回退值。区块内必须保留一份完整的原始属性值;覆盖上下文里没有对应条目时,编辑器就回退到它。回退不是独立配置项,就是区块自己写死的那份值。
绑定属性速查:各区块支持哪些属性
| 区块 | 可绑定属性 | 版本差异 |
|---|---|---|
段落core/paragraph | content | 6.5 起支持 |
标题core/heading | content | 6.5 起支持 |
图片core/image | id、url、title、alt、caption | 6.5 起支持 |
按钮core/button | url、text、linkTarget、rel | 6.5 起支持 |
列表项core/list-item | content | 7.1 新增 |
图标core/icon | icon | 7.2 新增 |
6.9 起,支持列表由get_block_bindings_supported_attributes()集中管理,并开放block_bindings_supported_attributes过滤器,第三方可以往表里加属性;之前这套判定散落在处理器内部,不可扩展。
两个真实场景
品牌站统一换文案。首页用 Pattern 区块引用一次主视觉区,不同品牌方或环境给 Pattern 区块传入不同的覆盖对象:主标题、按钮text、CTAurl全部声明绑定core/pattern-overrides。区块 JSON 里保留一套通用文案作回退,换文案只发生在覆盖对象里,区块定义不用动。
多语言站点按语言注入覆盖上下文。同一份 Pattern 区块在法语环境下渲染出法语的标题和按钮文字,alt、caption也能绑,避免英文 alt 混进法语页面。语言判断放在主题侧,渲染前把当前语言的覆盖对象挂进pattern/overrides上下文即可。
常见坑与排查
- 版本低于 6.5:块绑定 API 不存在,升级或包一层
function_exists()。 metadata.name缺失:取值函数直接返回null,覆盖静默失效。编辑器保存 Pattern 时会自动写这个键,手工拼 block content 时最容易漏。- 上下文结构不对:
pattern/overrides是区块名 → 属性名 → 值三层嵌套,路径是pattern/overrides / {metadata.name} / {属性名},少一层查不到。 - 返回值语义:回调返回
null时保留原属性值;返回空字符串''会把内容清成空,两者不是一回事。
小结
记住三件事就够:先确认 WordPress 版本 ≥ 6.5;自定义源从 block-bindings.php 的register_block_bindings_source()入手;内置源看 pattern-overrides.php 的_block_bindings_pattern_overrides_get_value()。需要深挖时,注册表与源的实现分别是 class-wp-block-bindings-registry.php 和 class-wp-block-bindings-source.php;官方文档入口在 developer.wordpress.org 的 Block Bindings 与 Pattern Blocks 两节。
【免费下载链接】wordpress-developWordPress Develop, Git-ified. Synced from git://develop.git.wordpress.org/, including branches and tags! This repository is just a mirror of the WordPress subversion repository. Please include a link to a pre-existing ticket on https://core.trac.wordpress.org/ with every pull request.项目地址: https://gitcode.com/GitHub_Trending/wo/wordpress-develop
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考