各位观众,晚上好!很高兴今天能跟大家一起聊聊 WordPress 编辑器里一个非常强大的过滤器:block_editor_settings
。 今天咱们的任务是深入扒一扒它的源码,看看这玩意儿到底能干啥,怎么用它来禁用特定的区块,或者修改编辑器的各种功能。准备好了吗?咱们这就开始!
一、block_editor_settings
:WordPress 编辑器的幕后大佬
首先,我们要搞清楚 block_editor_settings
到底是个什么东西。简单来说,它就是一个过滤器,允许你修改传递给 WordPress 编辑器的配置参数。这些配置参数控制了编辑器的大部分行为,比如:
- 可用的区块列表
- 编辑器面板的设置
- 各种插件和工具的启用/禁用
想象一下,WordPress 编辑器就像一个乐高玩具,而 block_editor_settings
就是那个告诉你哪些乐高积木可以用,以及怎么组装这些积木的说明书。通过修改这个说明书,我们就可以定制编辑器的行为,让它更符合我们的需求。
二、源码探秘:block_editor_settings
的真面目
要真正理解 block_editor_settings
,最好的方法就是看看它的源码。这个过滤器是在 wp-includes/block-editor.php
文件中定义的。我们来简化一下相关的代码片段:
// wp-includes/block-editor.php
function get_block_editor_settings( $settings = array() ) {
$default_settings = array(
'available_blocks' => WP_Block_Type_Registry::get_instance()->get_all_registered(),
'isRTL' => is_rtl(),
'l10n' => array(),
// 其他默认设置...
);
$settings = wp_parse_args( $settings, $default_settings );
$settings = apply_filters( 'block_editor_settings', $settings );
return $settings;
}
这段代码的核心逻辑如下:
- 定义默认设置: 创建一个包含默认编辑器设置的数组
$default_settings
。这里面最重要的就是available_blocks
,它包含了所有已注册的区块类型。 - 合并设置: 使用
wp_parse_args()
函数将传入的$settings
数组与$default_settings
数组合并。这样,我们就可以覆盖默认设置,或者添加新的设置。 - 应用过滤器: 使用
apply_filters( 'block_editor_settings', $settings )
应用block_editor_settings
过滤器。这就是我们今天要重点关注的地方。任何函数都可以通过add_filter()
注册到这个过滤器,从而修改$settings
数组。 - 返回设置: 将最终的
$settings
数组返回给编辑器,编辑器会根据这些设置来初始化自身。
三、实战演练:禁用特定区块
现在,我们来动手实践一下,看看如何使用 block_editor_settings
禁用特定的区块。假设我们想禁用“段落”区块(core/paragraph
)。我们可以这样操作:
add_filter( 'block_editor_settings', 'disable_paragraph_block' );
function disable_paragraph_block( $settings ) {
$disabled_block = 'core/paragraph';
$settings['allowed_block_types'] = array_filter(
WP_Block_Type_Registry::get_instance()->get_all_registered() ? array_keys( WP_Block_Type_Registry::get_instance()->get_all_registered() ) : true,
function ( $block_name ) use ( $disabled_block ) {
return $block_name !== $disabled_block;
}
);
return $settings;
}
这段代码做了什么?
- 注册过滤器: 使用
add_filter()
函数将disable_paragraph_block()
函数注册到block_editor_settings
过滤器。 - 指定要禁用的区块: 定义一个变量
$disabled_block
,存储要禁用的区块名称。 - 过滤区块列表: 修改
$settings['allowed_block_types']
数组,只保留那些名称不等于$disabled_block
的区块。这里我们使用array_filter
和匿名函数来实现过滤。 - 返回修改后的设置: 将修改后的
$settings
数组返回。
现在,刷新你的 WordPress 编辑器,你会发现“段落”区块已经消失了!
四、高级用法:修改编辑器功能
除了禁用区块,block_editor_settings
还可以用来修改编辑器的其他功能。例如,我们可以修改编辑器的字体大小选项:
add_filter( 'block_editor_settings', 'customize_font_sizes' );
function customize_font_sizes( $settings ) {
$settings['__experimentalFeatures']['typography']['fontSizes'] = array(
array(
'name' => '小',
'size' => 12,
'slug' => 'small',
),
array(
'name' => '正常',
'size' => 16,
'slug' => 'normal',
),
array(
'name' => '大',
'size' => 20,
'slug' => 'large',
),
);
return $settings;
}
这段代码修改了 $settings['__experimentalFeatures']['typography']['fontSizes']
数组,定义了三个新的字体大小选项:“小”、“正常”和“大”。注意,__experimentalFeatures
前缀表示这些功能可能还在实验阶段,可能会在未来的 WordPress 版本中发生变化。
五、一些需要注意的点
在使用 block_editor_settings
过滤器时,有一些需要注意的点:
- 性能: 尽量避免在过滤器函数中进行复杂的计算或数据库查询,这可能会影响编辑器的性能。
- 兼容性: 确保你的代码与不同的 WordPress 版本和插件兼容。
- 调试: 使用
var_dump()
或error_log()
函数来调试你的代码,查看$settings
数组的内容。
六、block_editor_settings
的应用场景
block_editor_settings
过滤器有很多实际的应用场景:
- 简化编辑器: 隐藏不常用的区块,让编辑器更简洁易用。
- 定制主题: 修改编辑器的默认样式和功能,使其更符合主题的设计风格。
- 限制用户权限: 禁用某些区块或功能,限制用户的编辑权限。
- 集成第三方插件: 将第三方插件的功能集成到编辑器中。
七、allowed_block_types
的两种取值方式
在禁用区块的例子中,我们使用了 $settings['allowed_block_types']
这个键。 值得注意的是,allowed_block_types
可以取两种值:
true
: 允许所有已注册的区块。这是默认值。- 一个区块名称数组: 只允许数组中列出的区块。
因此,禁用区块的另一种更简洁的写法是:
add_filter( 'block_editor_settings', 'disable_paragraph_block_simplified' );
function disable_paragraph_block_simplified( $settings ) {
$disabled_block = 'core/paragraph';
$allowed_blocks = array_keys( WP_Block_Type_Registry::get_instance()->get_all_registered() );
$settings['allowed_block_types'] = array_diff( $allowed_blocks, array( $disabled_block ) );
return $settings;
}
这段代码首先获取所有已注册的区块名称,然后使用 array_diff()
函数从列表中移除要禁用的区块。 这种写法更加简洁易懂。
八、一些常用的 $settings
键
除了 allowed_block_types
,block_editor_settings
过滤器还可以修改很多其他的 $settings
键。 下面列出一些常用的键及其作用:
键名 | 作用 | 取值类型 |
---|---|---|
allowed_block_types |
允许使用的区块类型。 | true 或 区块名称数组 |
default_block |
默认使用的区块类型。 | 字符串 (区块名称) |
isRTL |
是否为 RTL (从右到左) 语言。 | 布尔值 |
l10n |
本地化字符串。 | 数组 |
__experimentalFeatures |
实验性功能设置。 | 数组 |
__experimentalBlockPatterns |
区块模版。 | 数组 |
imageEditing |
图片编辑设置。 | 数组 |
codeEditingEnabled |
是否启用代码编辑器。 | 布尔值 |
autosaveInterval |
自动保存间隔 (秒)。 | 整数 |
disableCustomColors |
是否禁用自定义颜色。 | 布尔值 |
disableCustomFontSizes |
是否禁用自定义字体大小。 | 布尔值 |
九、一个更复杂的例子:根据用户角色启用/禁用区块
现在我们来一个更复杂的例子:根据用户角色来启用或禁用特定的区块。 假设我们想让管理员可以使用所有的区块,而普通编辑只能使用“段落”和“图片”区块。
add_filter( 'block_editor_settings', 'filter_blocks_by_user_role' );
function filter_blocks_by_user_role( $settings ) {
$current_user = wp_get_current_user();
if ( in_array( 'administrator', (array) $current_user->roles ) ) {
// 管理员可以使用所有区块
return $settings;
} else {
// 普通编辑只能使用 "core/paragraph" 和 "core/image" 区块
$settings['allowed_block_types'] = array( 'core/paragraph', 'core/image' );
return $settings;
}
}
这段代码首先获取当前用户的信息,然后判断用户是否具有 administrator
角色。 如果是管理员,则直接返回原始的 $settings
数组,允许使用所有区块。 否则,将 $settings['allowed_block_types']
设置为一个只包含 "core/paragraph" 和 "core/image" 区块的数组。
十、总结:block_editor_settings
,你值得拥有!
block_editor_settings
过滤器是 WordPress 编辑器定制的瑞士军刀。 掌握了它,你就可以轻松地修改编辑器的行为,让它更符合你的需求。 从禁用区块到修改字体大小,再到根据用户角色进行权限控制,block_editor_settings
可以帮助你打造一个更强大、更易用的 WordPress 编辑器。
希望今天的讲解对你有所帮助。 现在,去动手试试吧! 记住,实践是检验真理的唯一标准。 祝你玩得开心! 咱们下次再见!