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

各位观众老爷们,大家好! 今天咱们聊聊 WordPress 里一个非常重要,但又常常被忽略的过滤器:block_editor_settings。 这玩意儿就像 WordPress 古堡的秘密通道,允许你深入到区块编辑器的核心,调整它的行为,甚至完全禁用某些区块。

一、什么是 block_editor_settings

简单来说,block_editor_settings 是 WordPress 提供的一个过滤器(filter),允许你修改传递给区块编辑器的配置信息。 这些配置信息包括:

  • 可用区块列表: 决定了哪些区块可以在编辑器中使用。
  • 区块样式: 影响区块的默认样式和可用样式选项。
  • 编辑器设置: 诸如是否启用全屏模式、是否显示欢迎引导等。
  • 国际化字符串: 用于翻译区块编辑器界面。

你可以把它想象成区块编辑器启动前的一道检查关卡,你可以拦截并修改送给区块编辑器的“指令”。

二、block_editor_settings 过滤器在哪里?

这个过滤器主要在 wp-includes/block-editor.php 文件中的 get_block_editor_settings() 函数里被应用。 虽然你可能不会直接修改这个文件(这是不推荐的做法!),但了解它的位置可以帮助你理解这个过滤器的工作原理。

三、如何使用 block_editor_settings

使用 block_editor_settings 过滤器非常简单,你需要做的就是:

  1. 创建一个 WordPress 插件或者在你的主题的 functions.php 文件中添加代码。
  2. 使用 add_filter() 函数来挂载你的自定义函数到 block_editor_settings 过滤器上。
  3. 在你的自定义函数中,接收并修改 $settings 数组。
  4. 返回修改后的 $settings 数组。

下面是一个简单的例子:

<?php
/**
 * Plugin Name: My Custom Block Editor Settings
 * Description: Modifies the block editor settings.
 * Version: 1.0.0
 */

add_filter( 'block_editor_settings', 'my_custom_block_editor_settings' );

function my_custom_block_editor_settings( $settings ) {
  // 在这里修改 $settings 数组
  return $settings;
}

四、禁用特定区块:让你的用户告别“花里胡哨”

这是 block_editor_settings 最常见的用途之一。 有时候,你可能不希望用户使用某些区块,例如,你可能认为“社交媒体分享”区块与你的网站风格不符,或者“最新文章”区块会降低页面加载速度。 你可以通过 block_editor_settings 轻松地禁用这些区块。

下面是禁用核心“社交媒体分享”区块和“最新文章”区块的代码:

<?php
/**
 * Plugin Name: Disable Specific Blocks
 * Description: Disables specific blocks in the block editor.
 * Version: 1.0.0
 */

add_filter( 'block_editor_settings', 'disable_specific_blocks' );

function disable_specific_blocks( $settings ) {
    $disabled_blocks = array(
        'core/social-links', // 社交媒体分享区块
        'core/latest-posts'   // 最新文章区块
    );

    $settings['disabled_blocks'] = isset( $settings['disabled_blocks'] ) ? array_merge( $settings['disabled_blocks'], $disabled_blocks ) : $disabled_blocks;

    return $settings;
}

这段代码做了什么?

  1. 我们定义了一个 $disabled_blocks 数组,其中包含了要禁用的区块名称。 区块名称通常以 core/ 开头,后面跟着区块的标识符。 你可以通过查看区块的源代码或者使用 console.log( wp.blocks.getBlockTypes() ) 在浏览器的开发者控制台中找到区块的名称。
  2. 我们检查 $settings 数组中是否已经存在 disabled_blocks 键。 如果存在,我们将新的禁用区块添加到现有的禁用区块列表中。 如果不存在,我们直接将 $disabled_blocks 数组赋值给 settings['disabled_blocks']
  3. 我们返回修改后的 $settings 数组。

重要提示: disabled_blocks 是一个累积的设置。 这意味着如果你同时使用了多个插件来禁用区块,WordPress 会将它们合并在一起。 因此,在禁用区块之前,最好先检查是否已经禁用了该区块,以避免重复禁用。

五、修改编辑器配置:打造你的专属编辑器

除了禁用区块,你还可以使用 block_editor_settings 来修改编辑器的其他配置,例如:

  • 启用/禁用全屏模式:
<?php
add_filter( 'block_editor_settings', 'customize_block_editor_settings' );

function customize_block_editor_settings( $settings ) {
    $settings['fullscreenMode'] = false; // 禁用全屏模式
    return $settings;
}
  • 隐藏欢迎引导:
<?php
add_filter( 'block_editor_settings', 'customize_block_editor_settings' );

function customize_block_editor_settings( $settings ) {
    $settings['show_welcome_guide'] = false; // 隐藏欢迎引导
    return $settings;
}
  • 设置默认区块模板: (这个比较复杂,后面会详细讲)

六、高级技巧:利用 block_editor_settings 实现更强大的功能

block_editor_settings 过滤器不仅仅可以用来禁用区块和修改简单的配置,它还可以用来实现更强大的功能,例如:

  • 根据用户角色显示不同的区块:

你可以根据当前用户的角色来动态地调整可用的区块列表。 例如,你可以允许管理员使用所有区块,但限制编辑只能使用某些特定的区块。

<?php
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( 'editor', (array) $current_user->roles ) ) {
        // 如果当前用户是编辑,只允许使用某些区块
        $allowed_blocks = array(
            'core/paragraph',
            'core/heading',
            'core/image'
        );

        $settings['allowed_block_types'] = $allowed_blocks;
    }

    return $settings;
}

注意: allowed_block_types 是另一个重要的设置,它指定了允许使用的区块类型。 与 disabled_blocks 不同,allowed_block_types 是一个白名单,只有出现在这个列表中的区块才会被允许使用。

  • 自定义区块样式:

你可以使用 block_editor_settings 来添加或修改区块的样式。 例如,你可以为“按钮”区块添加一个新的样式选项,允许用户选择不同的颜色主题。 这需要配合 register_block_style 函数使用,比较复杂,我们先简单了解一下。

<?php
function my_plugin_register_block_styles() {
    register_block_style(
        'core/button',
        array(
            'name'  => 'my-custom-style',
            'label' => __( 'My Custom Style', 'my-plugin' ),
        )
    );
}
add_action( 'init', 'my_plugin_register_block_styles' );

add_filter( 'block_editor_settings', 'add_custom_block_styles_to_settings' );

function add_custom_block_styles_to_settings( $settings ) {
    // 可以在这里读取已注册的区块样式,并根据需要进行修改
    // 具体实现比较复杂,这里只提供一个思路
    return $settings;
}

这个例子只是展示了如何注册一个自定义的区块样式。 要将这个样式添加到区块编辑器的设置中,你需要更复杂的逻辑,例如,从数据库中读取已注册的区块样式,并将它们添加到 $settings['styles'] 数组中。

  • 设置默认区块模板:

这个功能允许你为新的文章或页面预定义一组区块。 例如,你可以为“产品”页面创建一个默认模板,其中包含“标题”、“描述”、“价格”和“图片”等区块。 这可以大大提高编辑效率,并确保所有产品页面都具有一致的结构。

<?php
add_filter( 'block_editor_settings', 'set_default_block_template' );

function set_default_block_template( $settings ) {
    global $post_type;

    if ( 'product' === $post_type ) {
        $settings['template'] = array(
            array( 'core/heading', array( 'level' => 2, 'placeholder' => 'Product Name' ) ),
            array( 'core/paragraph', array( 'placeholder' => 'Product Description' ) ),
            array( 'core/paragraph', array( 'placeholder' => 'Product Price' ) ),
            array( 'core/image' )
        );
        $settings['template_lock'] = 'all'; // 禁止移动或删除模板中的区块
    }

    return $settings;
}

这段代码做了什么?

  1. 我们首先检查当前文章类型是否为“product”。
  2. 如果是,我们定义一个 $template 数组,其中包含了要预定义的区块列表。 每个区块都用一个数组表示,数组的第一个元素是区块名称,第二个元素是区块的属性。
  3. 我们将 $template 数组赋值给 $settings['template']
  4. 我们还可以使用 $settings['template_lock'] 来锁定模板中的区块,防止用户移动或删除它们。 template_lock 可以设置为 'all'(锁定所有区块)、'insert'(只允许插入新区块)或 false(不锁定)。

七、常见问题及注意事项

  • 不要直接修改 wp-includes/block-editor.php 文件: 这是非常不推荐的做法,因为你的修改会在 WordPress 更新时被覆盖。 你应该始终使用插件或主题的 functions.php 文件来修改 block_editor_settings
  • 注意插件冲突: 如果多个插件都使用了 block_editor_settings 过滤器,它们可能会发生冲突。 你应该仔细测试你的插件,确保它与其他插件兼容。 可以使用 remove_filter() 移除其他插件的过滤器,或者调整过滤器的优先级。
  • 使用 console.log() 调试: 如果你不确定你的代码是否生效,可以使用 console.log() 在浏览器的开发者控制台中输出 $settings 数组。 这可以帮助你了解 WordPress 传递给区块编辑器的配置信息,并检查你的修改是否正确。
  • 了解区块的结构: 要禁用或修改区块,你需要了解区块的结构,包括区块的名称、属性和样式。 你可以通过查看区块的源代码或者使用 console.log( wp.blocks.getBlockTypes() ) 在浏览器的开发者控制台中找到这些信息。
  • 缓存问题: 修改 block_editor_settings 后,你可能需要清除缓存才能看到效果。 这包括 WordPress 的对象缓存、浏览器缓存和服务器缓存。

八、总结

block_editor_settings 过滤器是一个非常强大的工具,可以让你深入到 WordPress 区块编辑器的核心,调整它的行为,甚至完全禁用某些区块。 通过灵活运用这个过滤器,你可以打造一个更符合你需求的编辑器,提高编辑效率,并确保网站的内容质量。

希望今天的讲座对大家有所帮助。 记住,玩转 block_editor_settings 的关键在于实践和探索。 多多尝试,你会发现更多有趣的功能! 下次再见!

发表回复

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