检查是否正在使用古腾堡


13

如何检查当前使用的编辑器是否是WordPress插件中的Gutenberg?

我需要这样做是因为Gutenberg缺乏post_submitbox_misc_actions,所以我需要一个后备功能,仅当当前编辑器是Gutenberg时才使用。


您的意思是说像带有功能_存在(未测试)的is_gutenberg_page()吗?
birgire

Answers:


10

is_gutenberg_page()功能,当您激活古腾堡,所以你可以检查会出现:

if( function_exists( 'is_gutenberg_page' ) )

这只会检查是否激活了古腾堡,并且函数本身将检查当前编辑器是否设置为加载古腾堡。因此,代码变为:

if( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() )

当然,必须从管理面板页面以及内部数据何时可以调用该功能进行检查。因此,您必须使用合适的钩子进行检查。例如,如果使用init钩子进行检查,它将无法正常工作

古腾堡(Gutenberg)本身is_gutenberg_page()gutenberg_init()函数检查函数,该函数是使用replace_editor钩子加载的。因此,replace_editor钩子是执行此检查的好地方。

但是,我建议使用admin_enqueue_scripts进行检查,因为:

  1. admin_enqueue_scriptsis_gutenberg_page()古腾堡(Gutenberg)进行相同检查后发射的第一个钩子。

  2. 由于古腾堡(Gutenberg)的性质,您更有可能出于自己的目的加载外部脚本/样式。

  3. admin_enqueue_scripts是一个众所周知的钩子,仅从管理面板页面触发。因此前端不受此影响。

样本CODE(已测试):

add_action( 'admin_enqueue_scripts', 'wpse_gutenberg_editor_test' );
function wpse_gutenberg_editor_test() {
    if( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) { 
        // your gutenberg editor related CODE here
    }   
    else {
        // this is not gutenberg.
        // this may not even be any editor, you need to check the screen.
    }   
}

2
这仅适用于Gutenberg插件,如果未安装该插件,则无法在wp5中使用
maxime schoeni

1
is_block_editorwp5.0 +是必需的
Jacob Raccuia

5

该函数is_gutenberg_page来自Gutenberg插件,而该is_block_editor方法从5.0开始可用。下面的此功能将两者组合为一个检查功能。

下面的代码来自Freemius SDK,是团队的支持者

function is_gutenberg_page() {
    if ( function_exists( 'is_gutenberg_page' ) &&
            is_gutenberg_page()
    ) {
        // The Gutenberg plugin is on.
        return true;
    }
    $current_screen = get_current_screen();
    if ( method_exists( $current_screen, 'is_block_editor' ) &&
            $current_screen->is_block_editor()
    ) {
        // Gutenberg page on 5+.
        return true;
    }
    return false;
}

这是前进的正确答案。
Jacob Raccuia

4
  1. Gutenberg已集成在WordPress 5.0中,现在您可以使用use_block_editor_for_post功能进行检查。

    if(use_block_editor_for_post($post)){
      //Block editor is active for this post.
    }
    
  2. 另外,在创建新帖子时,您可以使用use_block_editor_for_post_type函数来检查gutenberg对于该帖子类型是否处于活动状态。

    if(use_block_editor_for_post_type($postType)){
    //Gutenberg is active.
    }
    

2

has_blocks 是检查内容的一种方式,但也请注意,如果您只是在检查管理区域中是否使用了块编辑器屏幕,则可以执行以下检查(以说明新的块编辑器和Gutenberg插件) :

if (is_admin()) {
    global $current_screen;
    if (!isset($current_screen)) {$current_screen = get_current_screen();}
    if ( ( method_exists($current_screen, 'is_block_editor') && $current_screen->is_block_editor() )
      || ( function_exists('is_gutenberg_page')) && is_gutenberg_page() ) ) {
        // DO SOMETHING HERE
    }
}

很好,但是我认为您不需要致电global $current_screen
西蒙·科萨

没错,我倾向于以这种方式编写示例代码,因为我不知道它们将位于什么上下文中-它们可能很容易因此而中断...我为此添加了一个额外的is_admin和isset检查。
majick

在当前的WP版本(5.0.2)中,上述代码段是在附加到该current_screen钩子的函数中执行时不起作用的,因为is_block_editor它的设置时间晚于该代码段。它只有在以后的时间(即load-(page))执行时才有效。这似乎是WP中的错误。
marcochiesi

1

Gutenberg 3.6引入了诸如has_blocks和的功能has_block。它们代替了不推荐使用的gutenberg_post_has_blocks功能。

如果has_blocks返回true,则在编辑帖子时会使用Gutenberg。

has_blocks()如果$post已经设置了全局变量(例如查询循环之类),则可以不带参数使用,也可以直接使用has_blocks( $content )


0

在WP 5.0及更高版本中,/ wp-includes / blocks.php中存在函数“ has_blocks”,因此您可以使用:

    if ( function_exists('has_blocks')) {
        $this->isGutenberg = true;
    }
    else {
        $this->isGutenberg = false;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.