分析 WordPress `use_block_editor_for_post_type()` 函数源码:如何为自定义文章类型启用或禁用 Gutenberg。

大家好,我是你们今天的WordPress Gutenberg“助教”——代码小能手。今天咱们来聊聊WordPress的use_block_editor_for_post_type()这个“开关”,它能让你轻松决定你的自定义文章类型要不要拥抱Gutenberg的“怀抱”。

第一幕:use_block_editor_for_post_type() 闪亮登场

首先,咱们先来看看这个函数的庐山真面目。use_block_editor_for_post_type()其实就是一个简单的过滤器,它允许你根据文章类型来开启或关闭Gutenberg编辑器。

/**
 * Determines whether a specific post type should use the block editor.
 *
 * @since 5.0.0
 *
 * @param bool   $use_block_editor  Whether the post type should use the block editor.
 * @param string $post_type         The post type being checked.
 *
 * @return bool Whether the post type should use the block editor.
 */
function use_block_editor_for_post_type( $use_block_editor, $post_type ) {
    return apply_filters( 'use_block_editor_for_post_type', $use_block_editor, $post_type );
}

别被注释里的英文吓到,其实它就是说:这个函数接收两个参数,一个是$use_block_editor(布尔值,默认是否使用Gutenberg),另一个是$post_type(文章类型名称),然后通过apply_filters应用一个名为use_block_editor_for_post_type的过滤器。

第二幕:过滤器“大显身手”

真正的“魔法”在于这个apply_filters。它允许你在主题或插件中“拦截”这个判断过程,并根据你的需要返回true(启用Gutenberg)或false(禁用Gutenberg)。

第三幕:实战演练:启用Gutenberg

假设你有一个自定义文章类型叫做'my_custom_post_type',你想让它用上Gutenberg。你可以这样写代码:

add_filter( 'use_block_editor_for_post_type', 'enable_gutenberg_for_my_post_type', 10, 2 );

function enable_gutenberg_for_my_post_type( $use_block_editor, $post_type ) {
    if ( 'my_custom_post_type' === $post_type ) {
        return true; // 启用Gutenberg
    }
    return $use_block_editor; // 其他文章类型保持默认
}

代码解释:

  • add_filter( 'use_block_editor_for_post_type', 'enable_gutenberg_for_my_post_type', 10, 2 );:这行代码告诉WordPress,我们要“监听”use_block_editor_for_post_type这个过滤器,并用我们自己的函数enable_gutenberg_for_my_post_type来处理。10是优先级,2是函数接收的参数数量。
  • enable_gutenberg_for_my_post_type( $use_block_editor, $post_type ):这是我们自己的函数,它接收两个参数:$use_block_editor是WordPress默认的Gutenberg启用状态,$post_type是要判断的文章类型。
  • if ( 'my_custom_post_type' === $post_type ) { return true; }:如果文章类型是'my_custom_post_type',我们就返回true,告诉WordPress:嘿,这个文章类型要用Gutenberg!
  • return $use_block_editor;:如果文章类型不是'my_custom_post_type',我们就返回WordPress默认的Gutenberg启用状态,这样就不会影响其他文章类型了。

第四幕:反方向操作:禁用Gutenberg

如果你想禁用Gutenberg,只需要把true改成false即可:

add_filter( 'use_block_editor_for_post_type', 'disable_gutenberg_for_my_post_type', 10, 2 );

function disable_gutenberg_for_my_post_type( $use_block_editor, $post_type ) {
    if ( 'my_custom_post_type' === $post_type ) {
        return false; // 禁用Gutenberg
    }
    return $use_block_editor; // 其他文章类型保持默认
}

第五幕:更灵活的姿势:批量操作

有时候,你可能需要一次性控制多个文章类型的Gutenberg状态。你可以这样做:

add_filter( 'use_block_editor_for_post_type', 'control_gutenberg_for_multiple_post_types', 10, 2 );

function control_gutenberg_for_multiple_post_types( $use_block_editor, $post_type ) {
    $enabled_post_types = array( 'post', 'page', 'my_custom_post_type' ); // 启用Gutenberg的文章类型
    $disabled_post_types = array( 'another_custom_post_type' ); // 禁用Gutenberg的文章类型

    if ( in_array( $post_type, $enabled_post_types, true ) ) {
        return true; // 启用Gutenberg
    }

    if ( in_array( $post_type, $disabled_post_types, true ) ) {
        return false; // 禁用Gutenberg
    }

    return $use_block_editor; // 其他文章类型保持默认
}

这段代码定义了两个数组:$enabled_post_types$disabled_post_types,分别存储了要启用和禁用Gutenberg的文章类型。然后,通过in_array()函数判断当前文章类型是否在这些数组中,从而决定是否启用或禁用Gutenberg。

第六幕:优先级的问题:谁说了算?

还记得add_filter()函数中的那个10吗?那是优先级!优先级越低的过滤器越先执行。这意味着,如果你有多个过滤器控制同一个文章类型的Gutenberg状态,优先级最低的那个过滤器会“胜出”。

例如,如果你先用优先级为10的过滤器启用了'my_custom_post_type'的Gutenberg,然后又用优先级为5的过滤器禁用了它,那么最终'my_custom_post_type'的Gutenberg会被禁用,因为优先级为5的过滤器先执行。

第七幕:兼容性考量:老版本WordPress怎么办?

use_block_editor_for_post_type()函数是在WordPress 5.0版本引入的。如果你需要兼容更老的版本,可以使用以下代码:

function my_theme_setup() {
    if ( version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) {
        // WordPress 5.0 之前的版本
        // 使用经典编辑器
        add_filter( 'use_block_editor_for_post_type', '__return_false' );
    } else {
        // WordPress 5.0 及之后的版本
        // 使用 use_block_editor_for_post_type() 函数
        add_filter( 'use_block_editor_for_post_type', 'my_custom_gutenberg_control', 10, 2 );

        function my_custom_gutenberg_control( $use_block_editor, $post_type ) {
            if ( 'my_custom_post_type' === $post_type ) {
                return true; // 启用Gutenberg
            }
            return $use_block_editor; // 其他文章类型保持默认
        }
    }
}
add_action( 'after_setup_theme', 'my_theme_setup' );

这段代码首先检查WordPress的版本,如果低于5.0,就直接禁用Gutenberg;否则,就使用use_block_editor_for_post_type()函数来控制Gutenberg的状态。

第八幕:表格总结:一目了然

为了方便大家理解,我用一个表格来总结一下use_block_editor_for_post_type()的用法:

操作 代码示例 说明
启用Gutenberg php add_filter( 'use_block_editor_for_post_type', 'enable_gutenberg_for_my_post_type', 10, 2 ); function enable_gutenberg_for_my_post_type( $use_block_editor, $post_type ) { if ( 'my_custom_post_type' === $post_type ) { return true; } return $use_block_editor; } | 为'my_custom_post_type'文章类型启用Gutenberg。
禁用Gutenberg php add_filter( 'use_block_editor_for_post_type', 'disable_gutenberg_for_my_post_type', 10, 2 ); function disable_gutenberg_for_my_post_type( $use_block_editor, $post_type ) { if ( 'my_custom_post_type' === $post_type ) { return false; } return $use_block_editor; } | 为'my_custom_post_type'文章类型禁用Gutenberg。
批量控制Gutenberg php add_filter( 'use_block_editor_for_post_type', 'control_gutenberg_for_multiple_post_types', 10, 2 ); function control_gutenberg_for_multiple_post_types( $use_block_editor, $post_type ) { $enabled_post_types = array( 'post', 'page' ); if ( in_array( $post_type, $enabled_post_types, true ) ) { return true; } return $use_block_editor; } 根据文章类型数组批量启用或禁用Gutenberg。
兼容老版本WordPress php function my_theme_setup() { if ( version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) { add_filter( 'use_block_editor_for_post_type', '__return_false' ); } else { add_filter( 'use_block_editor_for_post_type', 'my_custom_gutenberg_control', 10, 2 ); } } 针对WordPress 5.0之前的版本禁用Gutenberg。

第九幕:一些“小贴士”

  • 确保你的代码放在主题的functions.php文件或一个自定义插件中。
  • 在注册自定义文章类型之前或之后添加过滤器都可以,但最好在init动作中执行,确保在WordPress核心加载后执行。
  • 如果你发现Gutenberg的状态和你预期的不一样,检查一下你的代码中是否有多个过滤器在控制同一个文章类型,并注意它们的优先级。
  • 如果你使用了插件来创建自定义文章类型,确保插件没有自带Gutenberg的控制选项,避免冲突。

第十幕:结语

好了,今天的“Gutenberg开关”讲座就到这里。希望通过今天的讲解,大家能够熟练掌握use_block_editor_for_post_type()函数,灵活地控制自定义文章类型的Gutenberg状态。记住,代码的世界充满了乐趣,多多尝试,你也能成为Gutenberg“调音师”!下次再见!

发表回复

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