深入理解 WordPress `block_editor_settings` 过滤器源码:如何禁用特定的区块或修改编辑器功能。

各位观众,晚上好!很高兴今天能跟大家一起聊聊 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;
}

这段代码的核心逻辑如下:

  1. 定义默认设置: 创建一个包含默认编辑器设置的数组 $default_settings。这里面最重要的就是 available_blocks,它包含了所有已注册的区块类型。
  2. 合并设置: 使用 wp_parse_args() 函数将传入的 $settings 数组与 $default_settings 数组合并。这样,我们就可以覆盖默认设置,或者添加新的设置。
  3. 应用过滤器: 使用 apply_filters( 'block_editor_settings', $settings ) 应用 block_editor_settings 过滤器。这就是我们今天要重点关注的地方。任何函数都可以通过 add_filter() 注册到这个过滤器,从而修改 $settings 数组。
  4. 返回设置: 将最终的 $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;
}

这段代码做了什么?

  1. 注册过滤器: 使用 add_filter() 函数将 disable_paragraph_block() 函数注册到 block_editor_settings 过滤器。
  2. 指定要禁用的区块: 定义一个变量 $disabled_block,存储要禁用的区块名称。
  3. 过滤区块列表: 修改 $settings['allowed_block_types'] 数组,只保留那些名称不等于 $disabled_block 的区块。这里我们使用 array_filter 和匿名函数来实现过滤。
  4. 返回修改后的设置: 将修改后的 $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 可以取两种值:

  1. true: 允许所有已注册的区块。这是默认值。
  2. 一个区块名称数组: 只允许数组中列出的区块。

因此,禁用区块的另一种更简洁的写法是:

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_typesblock_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 编辑器。

希望今天的讲解对你有所帮助。 现在,去动手试试吧! 记住,实践是检验真理的唯一标准。 祝你玩得开心! 咱们下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注