gutenbergdocs/docs/reference-guides/block-api/block-metadata.md
2025-10-22 01:40:18 +08:00

838 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 前端资源加载优化
自 WordPress 5.8 版本起,开发者可配置仅在前端渲染时加载指定区块类型的脚本与样式。此功能适用于 `block.json` 文件中的以下资源字段:
- `script`
- `viewScript`
- `style`
- `viewStyle`WordPress 6.5.0 版本新增)
## 国际化支持
WordPress 字符串发现系统可自动翻译本文档中标记为可翻译的字段。首先需在提供区块元数据的 `block.json` 文件中设置 `textdomain` 属性。
**示例:**
```json
{
"title": "我的区块",
"description": "我的区块非常出色",
"keywords": [ "出色" ],
"textdomain": "我的插件"
}
```
### PHP 实现
在 PHP 中,当执行 `register_block_type` 时,本地化属性将在 WordPress 后端自动包裹在 `_x` 函数调用中。这些翻译会以内联脚本形式添加到插件的脚本句柄或 WordPress 核心的 `wp-block-library` 脚本句柄。
`register_block_type` 处理可翻译值的方式大致等效于以下代码段:
```php
<?php
$metadata = array(
'title' => _x( '我的区块', '区块标题', '我的插件' ),
'description' => _x( '我的区块非常出色!', '区块描述', '我的插件' ),
'keywords' => array( _x( '出色', '区块关键词', '我的插件' ) ),
);
```
该实现遵循现有的 [get_plugin_data](https://developer.wordpress.org/reference/functions/get_plugin_data) 函数逻辑,通过解析插件内容获取元数据,并动态应用翻译。
### JavaScript 实现
在 JavaScript 中,可通过 `@wordpress/blocks` 包的 `registerBlockType` 方法,传入从 `block.json` 加载的元数据对象作为首参数。所有本地化属性会自动包裹在 `_x`(来自 `@wordpress/i18n` 包)函数调用中,其运作机制与 PHP 端类似。
**示例:**
```js
import { registerBlockType } from '@wordpress/blocks';
import Edit from './edit';
import metadata from './block.json';
registerBlockType( metadata, {
edit: Edit,
// ...其他客户端设置
} );
```
## 向后兼容性
现有注册机制(服务端与前端)将继续生效,它将作为基于 `block.json` 注册方式的底层实现细节。
待所有细节完善后,核心区块将进行迭代迁移,第三方区块将在控制台中收到警告提示,建议重构现有区块注册 API。
以下属性将继续在客户端保持向后兼容,部分属性未来可能被替代 API 取代:
- `edit` - 详见[编辑与保存](/docs/reference-guides/block-api/block-edit-save.md)文档
- `save` - 详见[编辑与保存](/docs/reference-guides/block-api/block-edit-save.md)文档
- `transforms` - 详见[转换器](/docs/reference-guides/block-api/block-registration.md#transforms-optional)文档
- `deprecated` - 详见[废弃区块](/docs/reference-guides/block-api/block-deprecation.md)文档
- `merge` - 当前未收录文档,用于处理多区块合并功能
- `getEditWrapperProps` - 同样未收录文档,用于向区块编辑组件包装器注入额外属性
**示例**
```js
import { registerBlockType } from '@wordpress/blocks';
registerBlockType( '我的插件/区块名称', {
edit: function () {
// 编辑定义
},
save: function () {
// 保存定义
},
getEditWrapperProps: function () {
// 实现逻辑
},
} );
```
对于 WordPress 支持的[动态区块](/docs/how-to-guides/block-tutorial/creating-dynamic-blocks.md),仍可通过服务端的 [`register_block_type`](https://developer.wordpress.org/reference/functions/register_block_type/) 函数注册 `render_callback` 属性。
# 在 block.json 中定义元数据
自 WordPress 5.8 版本起,我们建议使用 `block.json` 元数据文件作为通过 PHP服务端和 JavaScript客户端注册区块类型的标准方式。以下是一个示例 `block.json` 文件,用于为插件创建通知区块定义元数据。
**示例:**
```json
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "my-plugin/notice",
"title": "通知",
"category": "text",
"parent": [ "core/group" ],
"icon": "star",
"description": "显示警告、错误或成功通知...",
"keywords": [ "警示", "消息" ],
"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": "默认", "isDefault": true },
{ "name": "other", "label": "其他" }
],
"example": {
"attributes": {
"message": "这是一个通知!"
}
},
"variations": [
{
"name": "example",
"title": "示例",
"attributes": {
"message": "这是一个示例!"
}
}
],
"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"
}
```
## 使用元数据文件的优势
通过 JSON 格式存储区块类型时,区块定义支持在 JavaScript、PHP 和其他语言之间共享代码。而使用 `block.json` 元数据文件注册区块还能带来额外优势。
从性能角度来看,当主题支持资源懒加载时,通过 `block.json` 注册的区块将自动实现资源队列优化。在 `style``script` 属性中列出的前端 CSS 和 JavaScript 资源仅当区块出现在页面上时才会加入队列,从而减小页面体积。
此外,由于[区块类型 REST API 接口](https://developer.wordpress.org/rest-api/reference/block-types/)仅能列出在服务端注册的区块,因此建议在服务端注册区块;使用 `block.json` 文件可简化此注册过程。
[WordPress 插件目录](https://wordpress.org/plugins/)能够检测 `block.json` 文件,高亮显示插件中包含的区块,并提取其元数据。若希望将区块提交至区块目录,则插件中包含的所有区块都必须具备 `block.json` 文件,以便区块目录识别它们。
通过使用预定义的架构描述文件可改善开发体验。支持的编辑器能够提供工具提示、自动补全和架构验证等辅助功能。要使用此架构,请在 `block.json` 文件顶部添加以下内容:
```json
"$schema": "https://schemas.wp.org/trunk/block.json"
```
<div class="callout callout-info">
请查阅<a href="https://developer.wordpress.org/block-editor/getting-started/fundamentals-block-development/registration-of-a-block">区块注册文档</a>了解如何使用元数据注册区块。
</div>
## 区块 API
本节描述所有可添加到 `block.json` 文件中用于定义区块类型行为和元数据的属性。
### API 版本
- 类型:`number`
- 可选性:可选
- 本地化:不支持
- 属性:`apiVersion`
- 默认值:`1`
```json
{ "apiVersion": 3 }
```
区块所使用的 Block API 版本。最新版本为 `3`,随 WordPress 6.3 引入。
详见 [API 版本文档](/docs/reference-guides/block-api/block-api-versions.md) 获取更多详细信息。
### 编辑器脚本
- 类型:`WPDefinedAsset`|`WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`editorScript`
```json
{ "editorScript": "file:./index.js" }
```
区块类型的编辑器脚本定义。这些脚本仅会在编辑器环境中加入队列。
可以传递使用 [`wp_register_script`](https://developer.wordpress.org/reference/functions/wp_register_script/) 函数注册的脚本句柄、相对于 `block.json` 文件的 JavaScript 文件路径,或包含两者混合的列表([了解更多](#wpdefinedasset))。
_注意从 WordPress `6.1.0` 版本开始支持传递编辑器脚本数组。_
### 脚本
- 类型:`WPDefinedAsset`|`WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`script`
```json
{ "script": "file:./script.js" }
```
区块类型的前端和编辑器脚本定义。这些脚本会在编辑器环境和网站前端查看内容时同时加入队列。
可以传递使用 [`wp_register_script`](https://developer.wordpress.org/reference/functions/wp_register_script/) 函数注册的脚本句柄、相对于 `block.json` 文件的 JavaScript 文件路径,或包含两者混合的列表([了解更多](#wpdefinedasset))。
_注意从 WordPress `6.1.0` 版本开始支持传递脚本数组。_
### 视图脚本
- 类型:`WPDefinedAsset`|`WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`viewScript`
- 自:`WordPress 5.9.0`
```json
{ "viewScript": [ "file:./view.js", "example-shared-view-script" ] }
```
区块类型的前端脚本定义。这些脚本仅会在网站前端查看内容时加入队列。
可以传递使用 [`wp_register_script`](https://developer.wordpress.org/reference/functions/wp_register_script/) 函数注册的脚本句柄、相对于 `block.json` 文件的 JavaScript 文件路径,或包含两者混合的列表([了解更多](#wpdefinedasset))。
_注意从 WordPress `6.1.0` 版本开始支持传递视图脚本数组。_
### 视图脚本模块
- 类型:`WPDefinedAsset`|`WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`viewScriptModule`
- 自:`WordPress 6.5.0`
```json
{ "viewScriptModule": [ "file:./view.js", "example-shared-script-module-id" ] }
```
区块类型的前端脚本模块定义。这些模块仅会在网站前端查看内容时加入队列。
可以传递使用 [`wp_register_script_module`](https://developer.wordpress.org/reference/functions/wp_register_script_module/) 函数注册的脚本模块 ID、相对于 `block.json` 文件的 JavaScript 模块路径,或包含两者混合的列表([了解更多](#wpdefinedasset))。
目前 WordPress 脚本与 WordPress 脚本模块不兼容。如果前端视图资源依赖于 WordPress 脚本,应使用 `viewScript`;如果依赖于 WordPress 脚本模块(当前为交互性 API则应使用 `viewScriptModule`。脚本模块的[更多功能](https://core.trac.wordpress.org/ticket/60647)将逐步开放。
_注意此功能自 WordPress `6.5.0` 版本起可用。_
### 编辑器样式
- 类型:`WPDefinedAsset`|`WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`editorStyle`
```json
{ "editorStyle": "file:./index.css" }
```
区块类型的编辑器样式定义。这些样式仅会在编辑器环境中加入队列。
可以传递使用 [`wp_register_style`](https://developer.wordpress.org/reference/functions/wp_register_style/) 函数注册的样式句柄、相对于 `block.json` 文件的 CSS 文件路径,或包含两者混合的列表([了解更多](#wpdefinedasset))。
_注意从 WordPress `5.9.0` 版本开始支持传递编辑器样式数组。_
### 名称
- 类型:`字符串`
- 必需
- 是否本地化:否
- 属性:`name`
```json
{ "name": "core/heading" }
```
区块名称是用于标识区块的唯一字符串。名称必须遵循 `命名空间/区块名称` 的结构,其中命名空间是插件或主题的名称。
**注意:** 区块名称只能包含小写字母数字字符、连字符,且最多只能包含一个正斜杠用于表示插件唯一的命名空间前缀。名称必须以字母开头。
**注意:** 此名称在注释分隔符中使用,格式为 `<!-- wp:my-plugin/book -->`。属于 `core` 命名空间的区块类型在序列化时不包含命名空间。
### 标题
- 类型:`字符串`
- 必需
- 是否本地化:是
- 属性:`title`
```json
{ "title": "标题" }
```
这是区块的显示标题,可以通过翻译函数进行翻译。标题将显示在插入器及编辑器的其他区域中。
**注意:** 为了确保区块标题在用户界面中易于阅读和访问,请尽量避免使用过长的标题。
### 分类
- 类型:`字符串`
- 可选
- 是否本地化:否
- 属性:`category`
```json
{ "category": "文本" }
```
区块按分类进行分组,以帮助用户浏览和发现它们。
核心提供的分类包括:
- 文本
- 媒体
- 设计
- 小工具
- 主题
- 嵌入
插件和主题还可以注册[自定义区块分类](/docs/reference-guides/filters/block-filters.md#managing-block-categories)。
实现应预期并容忍未知分类,并提供合理的回退行为(例如使用“文本”分类)。
### 父级
- 类型:`字符串数组`
- 可选
- 是否本地化:否
- 属性:`parent`
```json
{ "parent": [ "my-block/product" ] }
```
设置 `parent` 可以让一个区块仅在嵌套于指定区块内时才可用。例如,可以允许“加入购物车”区块仅在“产品”区块内可用。
### 祖先
- 类型:`字符串数组`
- 可选
- 是否本地化:否
- 属性:`ancestor`
- 自:`WordPress 6.0.0`
```json
{ "ancestor": [ "my-block/product" ] }
```
`ancestor` 属性使区块可以在指定区块类型的子树中的任何位置使用。例如,可以在“列”区块中放置“评论内容”区块,只要“列”区块位于“评论模板”区块的子树中。与 `parent` 属性相比,指定了 `ancestor` 的区块可以放置在子树的任何位置,而指定了 `parent` 的区块必须是直接子级。
### 允许的区块
- 类型:`字符串数组`
- 可选
- 是否本地化:否
- 属性:`allowedBlocks`
- 自:`WordPress 6.5.0`
```json
{ "allowedBlocks": [ "my-block/product" ] }
```
`allowedBlocks` 指定哪些区块类型可以作为该区块的直接子级。例如,“列表”区块可以仅允许“列表项”区块作为子级。
### 图标
- 类型:`字符串`
- 可选
- 是否本地化:否
- 属性:`icon`
```json
{ "icon": "smile" }
```
应指定图标属性以便更容易识别区块。图标可以是 [WordPress 的 Dashicons](https://developer.wordpress.org/resource/dashicons/) 中的任意图标(在非 JavaScript 环境中,图标别名也可作为回退)。
**注意:** 也可以通过客户端使用 SVG 元素的源来覆盖此属性。此外,此属性可以通过 JavaScript 定义为包含背景色和前景色的对象。这些颜色将在适用时与图标一起显示,例如在插入器中。自定义 SVG 图标会自动包装在 [wp.primitives.SVG](/packages/primitives/README.md) 组件中以添加可访问性属性aria-hidden、role 和 focusable
### 描述
- 类型:`字符串`
- 可选
- 是否本地化:是
- 属性:`description`
```json
{
"description": "引入新板块并组织内容,以帮助访客更好地浏览"
}
```
这是区块的简短描述,可以通过翻译函数进行翻译。此描述将显示在区块检查器中。
### 关键词
- 类型:`string[]`
- 可选
- 支持本地化:是
- 属性:`keywords`
- 默认值:`[]`
```json
{ "keywords": [ "keyword1", "keyword2" ] }
```
有时,一个区块可以设置别名,帮助用户在搜索时发现它。例如,图片区块可能还希望通过“照片”一词被搜索到。您可以通过提供不限数量的术语数组(这些术语会被翻译)来实现此功能。
### 版本
- 类型:`string`
- 可选
- 支持本地化:否
- 属性:`version`
- 自:`WordPress 5.8.0`
```json
{ "version": "1.0.3" }
```
区块的当前版本号,例如 1.0 或 1.0.3。这与插件版本管理类似。此字段可能与区块资源一起用于控制缓存失效,如果区块作者未提供此字段,则使用已安装的 WordPress 版本号代替。
### 文本域
- 类型:`string`
- 可选
- 支持本地化:否
- 属性:`textdomain`
- 自:`WordPress 5.7.0`
```json
{ "textdomain": "my-plugin" }
```
插件/区块的 [gettext](https://www.gnu.org/software/gettext/) 文本域。更多信息请参见[如何国际化您的插件](https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/)页面中的[文本域](https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#text-domains)部分。
### 属性
- 类型:`object`
- 可选
- 支持本地化:否
- 属性:`attributes`
- 默认值:`{}`
```json
{
"attributes": {
"cover": {
"type": "string",
"source": "attribute",
"selector": "img",
"attribute": "src"
},
"author": {
"type": "string",
"source": "html",
"selector": ".book-author"
}
}
}
```
属性提供了区块的结构化数据需求。它们在序列化时可以以不同形式存在,但在通用接口下统一声明。
更多详情请参阅[属性文档](/docs/reference-guides/block-api/block-attributes.md)。
### 提供上下文
- 类型:`object`
- 可选
- 支持本地化:否
- 属性:`providesContext`
- 默认值:`{}`
以对象形式提供上下文,将上下文名称映射到区块自身的某个属性,供该类型区块的子级访问。
更多详情请参阅[区块上下文文档](/docs/reference-guides/block-api/block-context.md)。
```json
{
"providesContext": {
"my-plugin/recordId": "recordId"
}
}
```
### 上下文
- 类型:`string[]`
- 可选
- 支持本地化:否
- 属性:`usesContext`
- 默认值:`[]`
要从祖先提供者继承的上下文值名称数组。
更多详情请参阅[区块上下文文档](/docs/reference-guides/block-api/block-context.md)。
```json
{
"usesContext": [ "message" ]
}
```
### 选择器
- 类型:`object`
- 可选
- 支持本地化:否
- 属性:`selectors`
- 默认值:`{}`
- 自:`WordPress 6.3.0`
在生成 theme.json全局样式样式表的区块样式时使用的任何自定义 CSS 选择器,按 `root`、功能或子功能作为键。提供自定义选择器可以更精细地控制样式应用于哪些区块元素,例如,仅将排版样式应用于内部标题,而颜色样式仍应用于外部区块包装器等。
更多详情请参阅[选择器文档](/docs/reference-guides/block-api/block-selectors.md)。
```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`
- 默认值:`{}`
包含一组用于控制编辑器中使用的功能的选项。更多详情请参阅[支持功能文档](/docs/reference-guides/block-api/block-supports.md)。
### 区块样式
- 类型:`数组`
- 可选
- 支持本地化:是(仅限 `label` 字段)
- 属性:`styles`
- 默认值:`[]`
```json
{
"styles": [
{ "name": "default", "label": "默认", "isDefault": true },
{ "name": "other", "label": "其他" }
]
}
```
区块样式可用于为区块提供替代样式,其实现原理是通过在区块包装器上添加类名。主题开发者可以利用 CSS 针对已选定的区块样式类名进行样式定制。
插件和主题还可以为现有区块注册[自定义区块样式](/docs/reference-guides/block-api/block-styles.md)。
### 示例配置
- 类型:`对象`
- 可选
- 支持本地化:否
- 属性:`example`
```json
{
"example": {
"attributes": {
"message": "这是一个通知!"
}
}
}
```
该配置用于为区块提供结构化的示例数据。当用户将鼠标悬停在区块上时,这些数据将用于在检查器帮助面板中构建区块预览效果。
更多详细信息请参阅[示例配置文档](/docs/reference-guides/block-api/block-registration.md#example-optional)。
### 区块变体
- 类型:`对象数组|WP预定义路径`[了解更多](#wpdefinedpath)
- 可选
- 支持本地化:是(仅限各变体的 `title`、`description` 和 `keywords` 字段)
- 属性:`variations`
- 版本要求:`WordPress 5.9.0` 及以上
```json
{
"variations": [
{
"name": "example",
"title": "示例",
"attributes": {
"level": 2,
"message": "这是一个示例!"
},
"scope": [ "block" ],
"isActive": [ "level" ]
}
]
}
```
区块变体 API 允许一个区块拥有多个相似版本,这些版本共享某些通用功能。每个区块变体通过设置不同的初始属性或内部区块来相互区分。当插入区块时,这些属性和/或内部区块会被自动应用。
*注意:在 JavaScript 中可为 `isActive` 属性提供函数,为 `icon` 属性提供 React 元素。而在 `block.json` 文件中,这两个属性仅支持字符串类型*
从 6.7 版本开始,可以在 `block.json` 中指定一个 PHP 文件来在服务端生成区块变体列表:
```json
{ "variations": "file:./variations.php" }
```
该 PHP 文件需要返回包含区块变体的数组。从 PHP 文件返回的变体中的字符串不会自动本地化,需照常使用 `__()` 函数进行处理。
例如:
```php
<?php
// 为社交图标类区块生成变体
return array(
array(
'isDefault' => true,
'name' => 'wordpress',
'title' => 'WordPress',
'icon' => 'wordpress',
'attributes' => array(
'service' => 'wordpress',
),
'isActive' => array( 'service' )
),
array(
'name' => 'mail',
'title' => __( '邮件' ),
'keywords' => array(
__( '邮箱' ),
__( '电子邮件' )
),
'icon' => 'mail',
'attributes' => array(
'service' => 'mail',
),
'isActive' => array( 'mail' )
),
);
```
更多详细信息请参阅[变体文档](/docs/reference-guides/block-api/block-variations.md)。
### 区块钩子
- 类型:`对象`
- 可选
- 属性:`blockHooks`
- 版本要求:`WordPress 6.4.0` 及以上
```json
{
"blockHooks": {
"my-plugin/banner": "after"
}
}
```
区块钩子 API 允许区块自动插入到指定区块类型的所有实例旁,其相对位置也由被"挂钩"的区块指定。即区块可以选择插入到指定区块类型的前后,或作为其首个子区块/最后一个子区块(即分别在其子区块列表的开头或末尾添加)。被挂钩的区块将同时在前端和编辑器中显示(以便用户进行自定义)。
配置中的键是要挂钩的区块名称(`字符串`),值是要挂钩的位置(`字符串`)。请参阅[区块钩子文档](/docs/reference-guides/block-api/block-registration.md#block-hooks-optional)了解更多可用配置信息。
### 样式
- 类型:`WPDefinedAsset` | `WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`style`
```json
{ "style": [ "file:./style.css", "example-shared-style" ] }
```
区块类型的前端和编辑器样式定义。这些样式将在编辑器和前端查看内容时同时加载。
可以传递通过 [`wp_register_style`](https://developer.wordpress.org/reference/functions/wp_register_style/) 函数注册的样式句柄、相对于 `block.json` 文件的 CSS 文件路径,或包含两者的混合列表([了解更多](#wpdefinedasset))。
*注意:从 WordPress `5.9.0` 版本开始,支持传递样式数组。*
### 查看样式
- 类型:`WPDefinedAsset` | `WPDefinedAsset[]`[了解更多](#wpdefinedasset)
- 可选
- 是否本地化:否
- 属性:`viewStyle`
- 自版本:`WordPress 6.5.0`
```json
{ "viewStyle": [ "file:./view.css", "example-view-style" ] }
```
区块类型的前端样式定义。这些样式仅在前端查看内容时加载。
可以传递通过 [`wp_register_style`](https://developer.wordpress.org/reference/functions/wp_register_style/) 函数注册的样式句柄、相对于 `block.json` 文件的 CSS 文件路径,或包含两者的混合列表([了解更多](#wpdefinedasset))。
仅前端样式特别适用于交互式区块,用于样式化仅在用户执行某些操作后可见的部分,且这些样式在编辑器中永远不需要。你可以先使用 `style` 属性将所有通用样式放在一个样式表中。仅当需要特定于编辑器的样式或特定于前端的样式时,可以扩展使用 `editorStyle``viewStyle`,但仍将样式的主要通用部分保留在主样式表中。
### 渲染
- 类型:`WPDefinedPath`[了解更多](#wpdefinedpath)
- 可选
- 是否本地化:否
- 属性:`render`
- 自版本:`WordPress 6.1.0`
```json
{ "render": "file:./render.php" }
```
在服务器上渲染区块类型以在前端显示时使用的 PHP 文件。该文件暴露以下变量:
- `$attributes``array`):区块属性。
- `$content``string`):区块默认内容。
- `$block``WP_Block`):区块实例。
使用 `render` 定义的 `render.php` 文件的示例实现可能如下:
```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 处理包的[本地路径](https://docs.npmjs.com/files/package.json#local-paths)的方式。
**示例:**
`block.json` 中:
```json
{
"render": "file:./render.php"
}
```
### `WPDefinedAsset`
它扩展了 `WPDefinedPath`,适用于 JavaScript 和 CSS 文件。文件路径的替代方案可以是脚本句柄、脚本模块 ID 或样式句柄,引用使用 WordPress 辅助函数已注册的资源。
**示例:**
`block.json` 中:
```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`](https://developer.wordpress.org/reference/functions/wp_register_script/)、[`wp_register_script_module`](https://developer.wordpress.org/reference/functions/wp_register_script_module/) 和 [`wp_register_style`](https://developer.wordpress.org/reference/functions/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`。
该定义存储在一个单独的 PHP 文件中,该文件以 `.asset.php` 结尾,并位于 `block.json` 中列出的 JS/CSS 文件旁边。WordPress 将通过模式匹配自动检测此文件。此选项是首选,因为预计它将与 `@wordpress/scripts` 包一起自动生成这些资源文件。
**示例:**
```
build/
├─ block.json
├─ index.js
└─ index.asset.php
```
`block.json` 中:
```json
{ "editorScript": "file:./index.js" }
```
`build/index.asset.php` 中:
```php
<?php
return array(
'dependencies' => array(
'react',
'wp-blocks',
'wp-i18n',
),
'version' => '3be55b05081a63d8f9d0ecb466c42cfd',
);
```