# 区块锁定 API

区块锁定 API 允许您限制编辑器内特定区块的操作。该 API 可用于防止用户移动、删除或编辑某些区块，从而确保布局一致性和内容完整性。

## 锁定移动或删除特定区块的功能

用户可通过编辑器锁定和解锁区块。锁定界面提供防止区块在内容画布内移动或被删除的选项：

![锁定界面示意图](https://raw.githubusercontent.com/WordPress/gutenberg/HEAD/docs/assets/Locking%20interface.png?raw=true)

请注意，通过启用"应用于内部所有区块"选项，您可以将锁定选项应用于容器区块内的嵌套区块。但除此之外，无法批量锁定区块。

## 锁定编辑特定区块的功能

除了锁定移动或删除区块的功能外，[导航区块](https://github.com/WordPress/gutenberg/pull/44739)和[可重用区块](https://github.com/WordPress/gutenberg/pull/39950)还具备额外功能：锁定编辑区块内容的能力。这将禁止对这两种区块类型内部的任何区块进行修改。

## 对模式或模板应用区块锁定

在构建模式或模板时，主题作者可以使用相同的界面工具设置区块的默认锁定状态。例如，主题作者可以锁定页眉的不同组成部分。请注意，默认情况下具有编辑权限的用户可以解锁这些区块。[这里有一个包含不同锁定方式区块的模式示例](https://gist.github.com/annezazu/acee30f8b6e8995e1b1a52796e6ef805)，以及关于[创建包含锁定区块的模板](https://make.wordpress.org/core/2022/02/09/core-editor-improvement-curated-experiences-with-locking-apis-theme-json/)的更多背景信息。您可以在编辑器内直接构建这些模式（包括添加锁定选项），然后按照[注册文档](/docs/reference-guides/block-api/block-patterns.md)进行操作。

## 在模式或模板中应用仅内容编辑

此功能在 WordPress 6.1 中引入。与禁用移动或删除区块功能的区块锁定不同，仅内容编辑功能专为模式或模板层级设计，它会隐藏所有设计工具，同时仍允许编辑区块内容。这为简化用户界面和保留设计提供了绝佳方案。启用该选项后会发生以下变化：

- 非内容子区块（容器、间距器、列等）将从列表视图隐藏，在画布上不可点击，且完全不可编辑。
- 检查器将显示所有"内容"子区块列表，点击列表中的区块可显示其设置面板。
- 主列表视图仅显示内容区块，所有区块均处于同一层级（忽略实际嵌套关系）。
- 整体内容锁定容器内的子区块会自动启用移动/删除锁定。
- 无法插入额外子区块，进一步保护设计和布局。
- 区块工具栏设有"修改"链接，用户可切换此选项来获取更全面的设计工具。目前无法通过编程方式移除该选项。

该选项可应用于 Columns、Cover 和 Group 区块，以及在其 block.json 中具有 templateLock 属性的第三方区块。要启用此功能，需使用 `"templateLock":"contentOnly"`。[此处是具备此功能的模式示例](https://gist.github.com/annezazu/d62acd2514cea558be6cea97fe28ff3c)。更多信息请[查阅相关文档](/docs/reference-guides/block-api/block-templates.md#locking)。

注意：目前没有管理内容锁定的可视化界面，必须通过代码层级进行管理。

## 更改权限以控制锁定能力

机构和插件开发者可通过限制用户[锁定和解锁区块的权限](https://make.wordpress.org/core/2022/05/05/block-locking-settings-in-wordpress-6-0/)，提供更精细的定制体验。默认情况下，所有管理员都具备锁定和解锁区块的权限。

开发者可通过向 [block_editor_settings_all](https://developer.wordpress.org/reference/hooks/block_editor_settings_all/) 钩子添加过滤器来配置区块锁定权限。该钩子向回调函数传递两个参数：

- `$settings` - 编辑器的可配置设置数组
- `$context` - WP_Block_Editor_Context 实例，包含当前编辑器信息的对象

具体而言，开发者可通过设置 `$settings['canLockBlocks']` 值为 `true` 或 `false` 来修改权限，通常需要执行一个或多个条件判断。

以下示例在编辑页面时为所有用户禁用区块锁定权限：

```php
add_filter( 'block_editor_settings_all', function( $settings, $context ) {
	if ( $context->post && 'page' === $context->post->post_type ) {
		$settings['canLockBlocks'] = false;
	}

	return $settings;
}, 10, 2 );
```

另一种常见使用场景是仅允许可编辑网站视觉设计（主题编辑）的用户锁定或解锁区块。目前最佳方案是通过检测 `edit_theme_options` 权限来实现，如下列代码片段所示：

```php
add_filter( 'block_editor_settings_all', function( $settings ) {
	$settings['canLockBlocks'] = current_user_can( 'edit_theme_options' );

	return $settings;
} );
```

开发者可使用任何类型的条件判断来确定锁定/解锁区块的权限。这仅是通过过滤钩子实现功能的冰山一角。