ThemesCorners
博客
11 分钟阅读作者 ThemesCorners

WordPress Block Bindings 与 Patterns:2026 年最佳实践

按照 WordPress 核心团队的设计意图使用 Block Bindings API 与 theme.json 模式——而不是把自己逼进死角。

Block Bindings API 在 WordPress 6.5 中首次登场,悄然成为多年来最重要的内容创作功能。到了 WordPress 6.8,它已经稳定、文档完整,并被所有现代主题支持——包括我们的。本文是我们当初做迁移时希望有人能告诉我们的内容。

块绑定到底解决了什么

一个 block binding 是块属性与数据源之间的契约。块本身保持通用——core/paragraphcore/imagecore/heading——绑定让它的内容来自别处:文章 meta、自定义字段、设置面板、API。

过去的方法是手写 serverSide 渲染的自定义块。两者都脆弱。有了绑定,编辑器预览、前台与块模式转换器都会自动使用同一个数据源。

最小可用的绑定源

在你的插件或 functions.php 中:

add_action('init', function () {
    register_block_bindings_source('themescorners/author-bio', [
        'label' => __('作者简介', 'themescorners'),
        'get_value_callback' => function ($args, $block) {
            $userId = get_the_author_meta('ID');
            return get_user_meta($userId, 'bio', true);
        },
    ]);
});

在块模式或内容里:

<!-- wp:paragraph {"metadata":{"bindings":{"content":{"source":"themescorners/author-bio"}}}} -->
<p>占位简介</p>
<!-- /wp:paragraph -->

完毕。这个段落在前台渲染作者简介,在编辑器里也展示(且锁定编辑)。

最佳实践 #1——优先绑定,不要做自定义块

每次你想调 registerBlockType 之前,先问自己:能不能用一个带绑定的 core/group 替代?以我们的经验,这个问题能砍掉大约 70% 的自定义块。自定义代码更少、编辑器风险更小、模式兼容性更完整。

最佳实践 #2——把回调控制在 1ms 以内

get_value_callback 在每次渲染时按绑定执行一次。在 20 篇文章、每篇 3 个绑定的列表里,就是 60 次调用。如果每次都没缓存地调 get_post_meta(),单页就多了 60 条 SQL 查询。激进缓存:

'get_value_callback' => function ($args, $block) {
    static $cache = [];
    $postId = get_the_ID();
    return $cache[$postId] ??= get_post_meta($postId, '_tc_price', true);
},

最佳实践 #3——用 theme.json 注册模式,而不是 PHP

到 2026 年,分发模式的规范方式是 theme.json/patterns/*.php 文件。除非你确实需要动态逻辑,否则跳过 PHP 里的 register_block_pattern()

// patterns/hero-with-cta.php
/**
 * Title: Hero with CTA
 * Slug: themescorners/hero-with-cta
 * Categories: featured
 * Block Types: core/post-content
 */
?>
<!-- wp:cover {"url":"..."} -->
...
<!-- /wp:cover -->

文件被自动注册、可翻译、并在插入器中可见。无需 PHP 钩子。

最佳实践 #4——给模式加版本

当你修改一个模式后,所有已插入该模式的页面仍保留旧的序列化区块标记。要干净地迁移,把模式当作数据库迁移对待:

  1. 用新 slug 发布新模式(hero-v2)。
  2. block.json 里加 migration,结构有变时把旧块名重映射过去。
  3. 准备好之后用 block_pattern_categories 过滤器把旧 slug 从插入器隐藏。
  4. 旧模式文件至少保留一个大版本——还在引用它的页面如果你立刻删除,会悄无声息地丢失标记。

最佳实践 #5——给编辑器用的模式加 templateLock

如果一个模式代表固定布局(例如三栏特性区),在外层 group 上设置 "templateLock":"all"。编辑者可以改文字和图片,但不能破坏布局。能显著减少支持工单。

接下来

WordPress 6.9(目前 beta)加入了类型化绑定源——你的回调声明数据类型(stringimageurl),编辑器自动用合适的输入控件。今天就用绑定的话,把源结构设计成迁移到 6.9 只需要在每个源里加一个键。字段是 "type",与 "label" 并列。

延伸阅读

相关文章