检查Gutenberg当前是否正在使用

时间:2018-07-29 作者:NerdOfLinux

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

我需要这个,因为古腾堡post_submitbox_misc_actions, 因此,我需要一个后备方案,只有当前的编辑器是古腾堡时才会使用。

8 个回复
SO网友:Fayaz

必要的API函数/方法:

您需要WP_Screen::is_block_editor() 方法检查您当前是否在Gutenberg编辑器中(自WordPress 5.0以来)。

此外,如果您将Gutenberg作为一个单独的插件安装,那么您将拥有is_gutenberg_page() 功能可用于执行相同的检查。

因此,对于整体解决方案,您需要将这两者结合起来。

当然,这必须在管理面板页面以及内部数据准备好调用函数时进行检查。所以you\'ll have to do the check using a suitable hook. 例如,如果使用init 钩子,它will not work

古腾堡亲自检查is_gutenberg_page() 功能来自gutenberg_init() 函数,使用replace_editor 钩所以replace_editor 钩子是检查的好地方。

然而,我建议使用admin_enqueue_scripts 用于进行检查,因为:

  1. admin_enqueue_scripts 是在相同的is_gutenberg_page() 检查古腾堡的自我形象。

    由于Gutenberg的特性,您更有可能为自己的目的加载外部脚本/样式。

  2. admin_enqueue_scripts 是一个众所周知的钩子,它只从管理面板页面启动。因此前端不受其影响。

    话虽如此,if all you need is to enqueue some scripts/styles, 那么您可以使用enqueue_block_editor_assets 编辑器资源挂钩和enqueue_block_assets 编辑器和前端资源的挂钩(自WordPress 5.0以来)。

    我在这里不提供相关代码,因为问题中没有直接询问它,但对于大多数目的来说,它可能已经足够了。

    解决方案:

    古腾堡检查的示例代码

    add_action( \'admin_enqueue_scripts\', \'wpse_gutenberg_editor_action\' );
    function wpse_is_gutenberg_editor() {
        if( function_exists( \'is_gutenberg_page\' ) && is_gutenberg_page() ) { 
            return true;
        }   
        
        $current_screen = get_current_screen();
        if ( method_exists( $current_screen, \'is_block_editor\' ) && $current_screen->is_block_editor() ) {
            return true;
        }
        return false;
    }
    function wpse_gutenberg_editor_action() {
        if( wpse_is_gutenberg_editor() ) { 
            // your gutenberg editor related CODE here
        }   
        else {
            // this is not gutenberg.
            // this may not even be an editor, you need to check the screen if you need to check for another editor.
        }
    }
    

SO网友:Benjamin Intal

功能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;
}

SO网友:Ankit

古腾堡已经集成到WordPress 5.0中,现在您可以使用use_block_editor_for_post 作用

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

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

SO网友:majick

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
    }
}

SO网友:Andrei

Gutenberg 3.6 引入了如下功能has_blockshas_block. 它们取代了不推荐使用的gutenberg_post_has_blocks 作用

如果has_blocks 返回比编辑帖子时使用的Gutenberg更真实的值。

您可以使用has_blocks() 如果$post 已设置全局(对于查询循环之类的内容)或直接使用has_blocks( $content )

SO网友:Jagir bahesh

在这里,我分享了一个自定义函数,您可以使用它来检查Gutenberg是否启用。

if ( is_gutenberg_enable() ) {
    // Do your code
}
这是一个自定义函数:

/**
 * Check if Gutenberg is enable.
 * Must be used not earlier than plugins_loaded action fired.
 *
 * @return bool
 */
function is_gutenberg_enable() {

    $gutenberg    = false;
    $block_editor = false;

    if ( has_filter( \'replace_editor\', \'gutenberg_init\' ) ) {
        // Gutenberg is installed and activated.
        $gutenberg = true;
    }

    if ( version_compare( $GLOBALS[\'wp_version\'], \'5.0-beta\', \'>\' ) ) {
        // Block editor.
        $block_editor = true;
    }

    if ( ! $gutenberg && ! $block_editor ) {
        return false;
    }

    include_once ABSPATH . \'wp-admin/includes/plugin.php\';

    if ( ! is_plugin_active( \'classic-editor/classic-editor.php\' ) ) {
        return true;
    }

    $use_block_editor = ( get_option( \'classic-editor-replace\' ) === \'no-replace\' );

    return $use_block_editor;
}

SO网友:KMcAloon

这个WP_Screen Object 现在包含此的布尔属性。以下内容适用于我:

if( ! function_exists( \'get_current_screen\' ) ) {
  return false;
}

$screen = get_current_screen();
$is_block_editor = $screen->is_block_editor;
请参见https://developer.wordpress.org/reference/classes/wp_screen/is_block_editor/

SO网友:Dragan Antonić

在WP 5.0及更高版本中,/WP includes/blocks中有一个函数“has_blocks”。php,因此您可以使用:

    if ( function_exists(\'has_blocks\')) {
        $this->isGutenberg = true;
    }
    else {
        $this->isGutenberg = false;
    }

结束

相关推荐