从 WordPress 5.8 版本开始,我们建议使用 block.json 元数据文件作为在 PHP(服务端)和 JavaScript(客户端)中注册块类型的标准方式。以下是一个定义创建通知块的插件的元数据的示例 block.json 文件。
示例:
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "my-plugin/notice",
"title": "Notice",
"category": "text",
"parent": [ "core/group" ],
"icon": "star",
"description": "Shows warning, error or success notices...",
"keywords": [ "alert", "message" ],
"version": "1.0.3",
"textdomain": "my-plugin",
"attributes": {
"message": {
"type": "string",
"source": "html",
"selector": ".message"
}
},
"providesContext": {
"my-plugin/message": "message"
},
"usesContext": [ "groupId" ],
"selectors": {
"root": ".wp-block-my-plugin-notice"
},
"supports": {
"align": true
},
"styles": [
{ "name": "default", "label": "Default", "isDefault": true },
{ "name": "other", "label": "Other" }
],
"example": {
"attributes": {
"message": "This is a notice!"
}
},
"variations": [
{
"name": "example",
"title": "Example",
"attributes": {
"message": "This is an example!"
}
}
],
"editorScript": "file:./index.js",
"script": "file:./script.js",
"viewScript": [ "file:./view.js", "example-shared-view-script" ],
"editorStyle": "file:./index.css",
"style": [ "file:./style.css", "example-shared-style" ],
"viewStyle": [ "file:./view.css", "example-view-style" ],
"render": "file:./render.php"
}
使用元数据文件的优点
块定义允许在 JavaScript、PHP 和其他语言之间共享代码,用于处理存储为 JSON 的块类型。使用 block.json 元数据文件注册块除了上述功能外还提供多种好处。
从性能角度来看,当主题支持懒加载资源时,使用 block.json 注册的块将自动优化其资源队列。在 style 或 script 属性中列出的前端 CSS 和 JavaScript 资源仅在页面中存在该块时才会被队列化,从而减少页面大小。
此外,由于 块类型 REST API 端点 只能列出在服务端注册的块,因此建议在服务端注册块;使用 block.json 文件可以简化此注册过程。
WordPress 插件目录 可以检测 block.json 文件,突出显示插件中包含的块,并提取其元数据。如果您希望将您的块提交到块目录,则您插件中的所有块都必须具有 block.json 文件,以便块目录能够识别它们。
通过使用定义的架构定义文件可以改进开发工作。支持的编辑器可以提供帮助,例如工具提示、自动完成和架构验证。要使用架构,请将以下内容添加到 block.json 的顶部。
"$schema": "https://schemas.wp.org/trunk/block.json"
查看 块的注册 以了解如何使用其元数据注册块。块 API
本节描述了可以添加到 block.json 文件的所有属性,用于定义块类型的行为和元数据。
API 版本
- 类型:
number - 可选
- 本地化:否
- 属性:
apiVersion - 默认值:
1
{ "apiVersion": 3 }
块使用的块 API 版本。最新版本是 3,它是在 WordPress 6.3 中引入的。
查看 API 版本文档 以获取更多信息。
名称
- 类型:
string - 必需
- 本地化:否
- 属性:
name
{ "name": "core/heading" }
块的名称是一个唯一字符串,用于标识块。名称必须结构化为 namespace/block-name,其中 namespace 是您的插件或主题的名称。
注意:块名称只能包含小写字母数字字符、破折号,以及最多一个正斜杠来指定插件唯一的命名空间前缀。它必须以字母开头。
注意:此名称在注释分隔符中用作 <!-- wp:my-plugin/book -->。core 命名空间中的块类型在序列化时不包括命名空间。
标题
- 类型:
string - 必需
- 本地化:是
- 属性:
title
{ "title": "Heading" }
这是您块的显示标题,可以使用我们的翻译函数进行翻译。标题将显示在插入器和其他编辑器区域中。
注意:为了保持您的块标题在 UI 中可读和可访问,请避免使用非常长的标题。
类别
- 类型:
string - 可选
- 本地化:否
- 属性:
category
{ "category": "text" }
块被分组到类别中,以帮助用户浏览和发现它们。
核心提供的类别有:
- text
- media
- design
- widgets
- theme
- embed
插件和主题还可以注册 自定义块类别。
实现应预期并容忍未知类别,并提供一些合理的回退行为(例如“text”类别)。
父级
- 类型:
string[] - 可选
- 本地化:否
- 属性:
parent
{ "parent": [ "my-block/product" ] }
设置 parent 可以让块要求它仅在嵌套在指定的块内时可用。例如,您可能希望允许“添加到购物车”块仅在“产品”块内可用。
祖先
- 类型:
string[] - 可选
- 本地化:否
- 属性:
ancestor - 自:
WordPress 6.0.0
{ "ancestor": [ "my-block/product" ] }
ancestor 属性使块在祖先块子树的任何位置内指定的块类型中可用。这允许例如将“评论内容”块放置在“列”块内,只要“列”位于“评论模板”块的某个位置内。与 parent 属性相比,指定其 ancestor 的块可以放置在子树中的任何位置,而具有指定 parent 的块必须是直接子项。
允许块
- 类型:
string[] - 可选
- 本地化:否
- 属性:
allowedBlocks - 自:
WordPress 6.5.0
{ "allowedBlocks": [ "my-block/product" ] }
allowedBlocks 指定哪些块类型可以是块的直接子项。例如,“列表”块可以只允许“列表项”块作为子项。
图标
- 类型:
string - 可选
- 本地化:否
- 属性:
icon
{ "icon": "smile" }
应指定图标属性以便于识别块。这些可以是 WordPress 的 Dashicons 中的任何一个(slug 在非 JS 上下文中也作为回退使用)。
注意:也可以在客户端使用 SVG 元素的源覆盖此属性。此外,此属性可以用 JavaScript 定义为包含背景和前景颜色的对象。当适用时(例如在插入器中),这些颜色将出现在图标旁边。自定义 SVG 图标会自动包装在 wp.primitives.SVG 组件中以添加可访问性属性(aria-hidden、role 和 focusable)。
描述
- 类型:
string - 可选
- 本地化:是
- 属性:
description
{
"description": "Introduce new sections and organize content to help visitors"
}
这是您块的简短描述,可以使用我们的翻译函数进行翻译。这将在块检查器中显示。
关键词
- 类型:
string[] - 可选
- 本地化:是
- 属性:
keywords - 默认值:
[]
{ "keywords": [ "keyword1", "keyword2" ] }有时块可以拥有别名,以便用户在搜索时发现它。例如,图像块也希望被“photo”发现。您可以通过提供无限数量的术语(这些术语会被翻译)来实现。
版本
- 类型:
string - 可选
- 本地化:否
- 属性:
version - 自:
WordPress 5.8.0
{ "version": "1.0.3" }块的当前版本号,例如 1.0 或 1.0.3。它与插件的版本管理类似。此字段可与块资源一起使用以控制缓存无效化,当块作者省略该字段时,则使用已安装的 WordPress 版本。
文本域
- 类型:
string - 可选
- 本地化:否
- 属性:
textdomain - 自:
WordPress 5.7.0
{ "textdomain": "my-plugin" }插件/块的 gettext 文本域。更多信息可在 文本域 部分找到,位于 如何国际化您的插件 页面。
属性
- 类型:
object - 可选
- 本地化:否
- 属性:
attributes - 默认值:
{}
{
"attributes": {
"cover": {
"type": "string",
"source": "attribute",
"selector": "img",
"attribute": "src"
},
"author": {
"type": "string",
"source": "html",
"selector": ".book-author"
}
}
}属性提供块的结构化数据需求。当它们被序列化时,它们可以以不同的形式存在,但它们在一个公共接口下共同声明。
有关更多详细信息,请参见 属性文档。
提供上下文
- 类型:
object - 可选
- 本地化:否
- 属性:
providesContext - 默认值:
{}
为当前类型的块的子代提供可访问的上下文,形式为一个对象,将上下文名称映射到块自身的属性之一。
有关更多详细信息,请参见 块上下文文档。
{
"providesContext": {
"my-plugin/recordId": "recordId"
}
}上下文
- 类型:
string[] - 可选
- 本地化:否
- 属性:
usesContext - 默认值:
[]
从祖先提供者继承的上下文值名称数组。
有关更多详细信息,请参见 块上下文文档。
{
"usesContext": [ "message" ]
}选择器
- 类型:
object - 可选
- 本地化:否
- 属性:
selectors - 默认值:
{} - 自:
WordPress 6.3.0
任何自定义 CSS 选择器,以 root、feature 或 sub-feature 为键,用于生成 theme.json(全局样式)样式表中的块样式。
提供自定义选择器允许更精细地控制哪些样式适用于哪些块元素,例如仅将排版样式应用于内部标题,而颜色仍然应用于外部块包装器等。
有关更多详细信息,请参见 选择器文档。
{
"selectors": {
"root": ".my-custom-block-selector",
"color": {
"text": ".my-custom-block-selector p"
},
"typography": {
"root": ".my-custom-block-selector > h2",
"text-decoration": ".my-custom-block-selector > h2 span"
}
}
}支持
- 类型:
object - 可选
- 本地化:否
- 属性:
supports - 默认值:
{}
它包含一组选项,用于控制编辑器中使用的功能。有关更多详细信息,请参见 支持文档。
块样式
- 类型:
array - 可选
- 本地化:是(仅
label) - 属性:
styles - 默认值:
[]
{
"styles": [
{ "name": "default", "label": "Default", "isDefault": true },
{ "name": "other", "label": "Other" }
]
}块样式可用于为块提供替代样式。它的工作原理是为块的包装器添加类名。使用 CSS,主题开发人员可以针对所选的块样式类名。
插件和主题还可以为现有块注册 自定义块样式。
示例
- 类型:
object - 可选
- 本地化:否
- 属性:
example
{
"example": {
"attributes": {
"message": "This is a notice!"
}
}
}它为块提供结构化示例数据。此数据用于构建块的预览,以便在用户将鼠标悬停在块上时显示在 Inspector 帮助面板中。
有关更多详细信息,请参见 示例文档。
变体
- 类型:
object[]|WPDefinedPath(了解更多) - 可选
- 本地化:是(仅每个变体的
title、description和keywords) - 属性:
variations - 自:
WordPress 5.9.0
{
"variations": [
{
"name": "example",
"title": "Example",
"attributes": {
"level": 2,
"message": "This is an example!"
},
"scope": [ "block" ],
"isActive": [ "level" ]
}
]
}块变体是允许块拥有相似版本但共享某些共同功能的 API。每个块变体通过设置一些初始属性或内部块与其他变体区分开来。然后在插入块时应用这些属性和/或内部块。
注意:在 JavaScript 中,您可以为 isActive 属性提供函数,并为 icon 提供 React 元素。在 block.json 文件中两者仅支持字符串
从版本 6.7 开始,可以在 block.json 中指定一个 PHP 文件,在服务器端生成块变体列表:
{ "variations": "file:./variations.php" }该 PHP 文件预期要 return 包含块变体的数组。从 PHP 文件返回的变体中找到的字符串不会自动本地化;相反,像往常一样使用 __() 函数。
例如:
<?php
// Generate variations for a Social Icon kind of block.
return array(
array(
'isDefault' => true,
'name' => 'wordpress',
'title' => 'WordPress',
'icon' => 'wordpress',
'attributes' => array(
'service' => 'wordpress',
),
'isActive' => array( 'service' )
),
array(
'name' => 'mail',
'title' => __( 'Mail' ),
'keywords' => array(
__( 'email' ),
__( 'e-mail' )
),
'icon' => 'mail',
'attributes' => array(
'service' => 'mail',
),
'isActive' => array( 'mail' )
),
);
有关更多详细信息,请参见 变体文档。
块钩子
- 类型:
object - 可选
- 属性:
blockHooks - 自:
WordPress 6.4.0
{
"blockHooks": {
"my-plugin/banner": "after"
}
}Block Hooks 是一个 API,允许一个块自动插入到给定块类型的所有实例旁边,其相对位置也由“挂钩”的块指定。也就是说,一个块可以选择在给定块类型之前或之后插入,或者作为其第一个或最后一个子块(即分别追加或附加到其子块列表)。挂钩的块将同时出现在前端和编辑器中(以便用户进行自定义)。
键是挂钩到的块的名称 (string),值是挂钩到的位置 (string)。有关可用配置的更多信息,请查看 Block Hooks 文档。
编辑器脚本
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
editorScript
{ "editorScript": "file:./index.js" }
块类型编辑器脚本定义。它们仅在编辑器的上下文中加载。
可以传递使用 wp_register_script 函数注册的脚本句柄、相对于 block.json 文件的 JavaScript 文件路径,或两者的混合列表 (了解更多)。
注意:自 WordPress 6.1.0 起,存在传递编辑器脚本数组的选项。
脚本
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
script
{ "script": "file:./script.js" }
块类型前端和编辑器脚本定义。它们将在编辑器和查看站点内容时同时加载。
可以传递使用 wp_register_script 函数注册的脚本句柄、相对于 block.json 文件的 JavaScript 文件路径,或两者的混合列表 (了解更多)。
注意:自 WordPress 6.1.0 起,存在传递脚本数组的选项。
查看脚本
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
viewScript - 版本:
WordPress 5.9.0
{ "viewScript": [ "file:./view.js", "example-shared-view-script" ] }
块类型前端脚本定义。它们仅在查看站点内容时加载。
可以传递使用 wp_register_script 函数注册的脚本句柄、相对于 block.json 文件的 JavaScript 文件路径,或两者的混合列表 (了解更多)。
注意:自 WordPress 6.1.0 起,存在传递查看脚本数组的选项。
查看脚本模块
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
viewScriptModule - 版本:
WordPress 6.5.0
{ "viewScriptModule": [ "file:./view.js", "example-shared-script-module-id" ] }
块类型前端脚本模块定义。它们仅在查看站点内容时加载。
可以传递使用 wp_register_script_module 函数注册的脚本模块 ID、相对于 block.json 文件的 JavaScript 模块路径,或两者的混合列表 (了解更多)。
WordPress 脚本和 WordPress 脚本模块目前不兼容。如果前端查看资源依赖于 WordPress 脚本,应使用 viewScript。如果它们依赖于 WordPress 脚本模块(即当前的交互性 API),则应使用 viewScriptModule。更多功能将逐步为脚本模块提供。
注意:自 WordPress 6.5.0 起可用。
编辑器样式
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
editorStyle
{ "editorStyle": "file:./index.css" }
块类型编辑器样式定义。它们仅在编辑器的上下文中加载。
可以传递使用 wp_register_style 函数注册的样式句柄、相对于 block.json 文件的 CSS 文件路径,或两者的混合列表 (了解更多)。
注意:自 WordPress 5.9.0 起,存在传递编辑器样式数组的选项。
样式
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
style
{ "style": [ "file:./style.css", "example-shared-style" ] }
块类型前端和编辑器样式定义。它们将在编辑器和查看站点内容时同时加载。
可以传递使用 wp_register_style 函数注册的样式句柄、相对于 block.json 文件的 CSS 文件路径,或两者的混合列表 (了解更多)。
注意:自 WordPress 5.9.0 起,存在传递样式数组的选项。
查看样式
- 类型:
WPDefinedAsset|WPDefinedAsset[](了解更多) - 可选
- 本地化:否
- 属性:
viewStyle - 版本:
WordPress 6.5.0
{ "viewStyle": [ "file:./view.css", "example-view-style" ] }
块类型前端样式定义。它们仅在查看站点内容时加载。
可以传递使用 wp_register_style 函数注册的样式句柄、相对于 block.json 文件的 CSS 文件路径,或两者的混合列表 (了解更多)。
仅前端样式对于交互式块特别有用,用于样式化仅在用户执行某些操作后才可见的部分,并且这些样式在编辑器中永远不需要。您可以从使用 style 属性将所有通用样式放在一个样式表中开始。只有当您需要特定于编辑器的样式或特定于前端的样式时,您才可以扩展到 editorStyle 和 viewStyle,但仍将您的样式的通用部分保留在主样式表中。
渲染
- 类型:
WPDefinedPath(了解更多) - 可选
- 本地化:否
- 属性:
render - 版本:
WordPress 6.1.0
{ "render": "file:./render.php" }
在服务器上渲染块类型以显示在前端时使用的 PHP 文件。以下变量暴露给该文件:
$attributes(array):块的属性。$content(string):块的默认内容。$block(WP_Block):块实例。
使用 render 定义的 render.php 文件的一个示例实现可能如下所示:
<div <?php echo get_block_wrapper_attributes(); ?>>
<?php echo esc_html( $attributes['label'] ); ?>
</div>
注意:此文件在服务器渲染页面 HTML 时,对于块类型的每个实例都会加载。在文件中声明函数或类时必须考虑到这一点。避免错误风险的最简单方法是从另一个文件消费该共享逻辑。
资源
WPDefinedPath
WPDefinedPath 类型是字符串的子类型,其值表示相对于 block.json 文件所在位置的路径到 JavaScript、CSS 或 PHP 文件。提供的路径必须以 file: 前缀开头。这种方法基于 npm 如何处理包的 本地路径。
示例:
在 block.json 中:
{
"render": "file:./render.php"
}
WPDefinedAsset
它扩展了 WPDefinedPath 以支持 JavaScript 和 CSS 文件。另一种替代文件路径的方法是引用已注册的资产(使用 WordPress 辅助工具)的脚本句柄、脚本模块 ID 或样式句柄。
示例:
在 block.json 中:
{
"editorScript": "file:./index.js",
"script": "file:./script.js",
"viewScriptModule": [
"file:./view.js",
"example-registered-script-module-id"
],
"editorStyle": "file:./index.css",
"style": [ "file:./style.css", "example-shared-style" ],
"viewStyle": [ "file:./view.css", "example-view-style" ]
}
在 WordPress 的上下文中,当使用 PHP 注册块时,它会自动注册 block.json 文件中发现的所有脚本、脚本模块和样式,并使用文件路径而不是资产句柄。
这就是为什么 WPDefinedAsset 类型必须提供一种方法来镜像使用 wp_register_script、wp_register_script_module 和 wp_register_style 注册脚本、脚本模块和样式所需的参数,然后将这些参数分配为与块关联的句柄或脚本模块 ID。
可以提供具有以下形状的对象:
handle(string) – 脚本的名称。如果省略,将自动生成。dependencies(string[]|{ id: string, import?: 'dynamic'|'static' }[]) – 此脚本依赖的已注册脚本句柄数组。脚本模块可以使用简单字符串表示静态依赖项,或使用对象形式表示动态依赖项。动态依赖项是可能在运行时使用也可能不使用的依赖项,通常与动态import('module-id')语法一起使用。默认值:[]。version(string|false|null) – 指定脚本版本号(如果有的话)的字符串,该版本号作为查询字符串添加到 URL 中以进行缓存清除。如果版本设置为false,则会自动添加等于当前安装的 WordPress 版本的版本号。如果设置为null,则不添加版本号。默认值:false。
定义存储在一个以 .asset.php 结尾的单独的 PHP 文件中,该文件位于 block.json 中列出的 JS/CSS 文件旁边。WordPress 将通过模式匹配自动检测此文件。此选项是首选的,因为预计它将使用 @wordpress/scripts 包自动生成这些资产文件的选项。
示例:
build/
├─ block.json
├─ index.js
└─ index.asset.php
在 block.json 中:
{ "editorScript": "file:./index.js" }
在 build/index.asset.php 中:
<?php
return array(
'dependencies' => array(
'react',
'wp-blocks',
'wp-i18n',
),
'version' => '3be55b05081a63d8f9d0ecb466c42cfd',
);
前端加载队列
从 WordPress 5.8 版本开始,可以指示 WordPress 仅在块类型在前端渲染时为其加载脚本和样式。这适用于 block.json 文件中的以下资产字段:
scriptviewScriptstyleviewStyle(在 WordPress 6.5.0 中添加)
国际化
WordPress 字符串发现系统可以自动翻译此文档中标记为可翻译的字段。首先,您需要在提供块元数据的 block.json 文件中设置 textdomain 属性。
示例:
{
"title": "My block",
"description": "My block is fantastic",
"keywords": [ "fantastic" ],
"textdomain": "my-plugin"
}
PHP
在 PHP 中,当执行 register_block_type 时,本地化属性将在 WordPress 后端自动包装在 _x 函数调用中。这些翻译作为内联脚本添加到插件的脚本句柄或 WordPress 核心的 wp-block-library 脚本句柄中。
register_block_type 处理可翻译值的方式大致等同于以下代码片段:
<?php
$metadata = array(
'title' => _x( 'My block', 'block title', 'my-plugin' ),
'description' => _x( 'My block is fantastic!', 'block description', 'my-plugin' ),
'keywords' => array( _x( 'fantastic', 'block keyword', 'my-plugin' ) ),
);
实现遵循现有的 get_plugin_data 函数,该函数解析插件内容以检索插件的元数据,并动态应用翻译。
JavaScript
在 JavaScript 中,您可以使用 @wordpress/blocks 包中的 registerBlockType 方法,并将从 block.json 加载的元数据对象作为第一个参数传递。所有本地化属性都会自动包装在 _x(来自 @wordpress/i18n 包)函数调用中,工作方式类似于 PHP。
示例:
import { registerBlockType } from '@wordpress/blocks';
import Edit from './edit';
import metadata from './block.json';
registerBlockType( metadata, {
edit: Edit,
// ...other client-side settings
} );
向后兼容性
现有的注册机制(服务器端和前端)将继续工作,它将作为基于 block.json 的注册的底层实现细节。
一旦所有细节准备就绪,核心块将逐步迁移,第三方块将在控制台看到警告,以鼓励它们重构使用的块注册 API。
出于向后兼容性的原因,以下属性仅在客户端支持。其中一些可能在将来被替代 API 替换:
edit– 有关更多详细信息,请参阅 编辑和保存 文档。save– 有关更多详细信息,请参阅 编辑和保存 文档。transforms– 有关更多详细信息,请参阅 转换 文档。deprecated– 有关更多详细信息,请参阅 已弃用的块 文档。merge– 目前未记录。其作用是处理将多个块合并为一个。getEditWrapperProps– 同样未记录。其作用是将额外的属性注入到块的编辑组件包装器中。
示例:
import { registerBlockType } from '@wordpress/blocks';
registerBlockType( 'my-plugin/block-name', {
edit: function () {
// Edit definition goes here.
},
save: function () {
// Save definition goes here.
},
getEditWrapperProps: function () {
// Implementation goes here.
},
} );
对于 WordPress 支持的 动态块,仍然应该可以使用服务器上的 register_block_type 函数注册 render_callback 属性。