Проверить, используется ли Gutenberg в данный момент

29 июл. 2018 г., 19:48:38
Просмотры: 14.1K
Голосов: 18

Как я могу проверить, что в данный момент используется редактор Gutenberg в WordPress плагине?

Мне это нужно, потому что в Gutenberg отсутствует хук post_submitbox_misc_actions, поэтому мне нужен запасной вариант, который будет использоваться только если текущий редактор - Gutenberg.

1
Комментарии

Вы имеете в виду что-то вроде is_gutenberg_page() с function_exists (не тестировалось)?

birgire birgire
29 июл. 2018 г. 20:18:26
Все ответы на вопрос 9
3
15

Необходимые API-функции/методы:

Вам понадобится метод WP_Screen::is_block_editor() для проверки, находитесь ли вы в редакторе Gutenberg (начиная с WordPress 5.0).

Также, если вы устанавливаете Gutenberg как отдельный плагин, то у вас будет доступна функция is_gutenberg_page() для аналогичной проверки.

Таким образом, для комплексного решения вам нужно объединить эти два подхода.

Конечно, эту проверку нужно выполнять на страницах админ-панели и когда внутренние данные готовы для вызова функции. Поэтому вам нужно выполнить проверку с использованием подходящего хука. Например, если вы проверите это с помощью хука init, это не сработает.

Сам Gutenberg проверяет функцию is_gutenberg_page() из функции gutenberg_init(), которая загружается с использованием хука replace_editor. Поэтому хук replace_editor — хорошее место для выполнения этой проверки.

Однако я бы предложил использовать admin_enqueue_scripts для проверки, потому что:

  1. admin_enqueue_scripts — это первый хук, который срабатывает после той же проверки is_gutenberg_page(), которую сам Gutenberg выполняет.

  2. Из-за природы Gutenberg, скорее всего, вам понадобится загружать внешние скрипты/стили для ваших целей.

  3. admin_enqueue_scripts — это хорошо известный хук, который срабатывает только на страницах админ-панели. Таким образом, фронтенд не затрагивается.

При этом, если все, что вам нужно, — это загрузить некоторые скрипты/стили, то вы можете использовать хук enqueue_block_editor_assets для редактора и хук enqueue_block_assets для скриптов/стилей как редактора, так и фронтенда (начиная с WordPress 5.0).

Я не привожу здесь соответствующий код, так как он не был прямо запрошен в вопросе, но для большинства целей его может быть достаточно.

Решение:

Пример кода для проверки Gutenberg

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() ) { 
        // ваш код, связанный с редактором Gutenberg, здесь
    }   
    else {
        // это не Gutenberg.
        // это может даже не быть редактором, вам нужно проверить экран, если требуется проверка для другого редактора.
    }
}
30 июл. 2018 г. 17:40:41
Комментарии

Это работает только с плагином Gutenberg, не работает в WordPress 5, если плагин не установлен

maxime schoeni maxime schoeni
17 нояб. 2018 г. 16:01:23

is_block_editor необходим для WordPress 5.0 и выше

Jacob Raccuia Jacob Raccuia
15 янв. 2019 г. 08:07:35

ОБНОВЛЕНИЕ: теперь должно работать для WordPress 5.0+ и если Gutenberg установлен как плагин.

Fayaz Fayaz
23 нояб. 2021 г. 02:44:58
1
11

Функция is_gutenberg_page принадлежит плагину Gutenberg, в то время как метод is_block_editor доступен начиная с версии 5.0. Приведённая ниже функция объединяет обе проверки в единую функцию.

Данный код взят из Freemius SDK, благодарность их команде:

function is_gutenberg_page() {
    if ( function_exists( 'is_gutenberg_page' ) &&
            is_gutenberg_page()
    ) {
        // Плагин Gutenberg активен.
        return true;
    }
    $current_screen = get_current_screen();
    if ( method_exists( $current_screen, 'is_block_editor' ) &&
            $current_screen->is_block_editor()
    ) {
        // Редактор Gutenberg в версии 5.0 и выше.
        return true;
    }
    return false;
}
7 янв. 2019 г. 10:45:23
Комментарии

Это правильный ответ на будущее.

Jacob Raccuia Jacob Raccuia
15 янв. 2019 г. 08:07:14
1
  1. Гутенберг был интегрирован в WordPress 5.0, и теперь вы можете проверить его активность с помощью функции use_block_editor_for_post.

    if(use_block_editor_for_post($post)){
      //Блочный редактор активен для этой записи.
    }
    
  2. Альтернативно, при создании новой записи вы можете использовать функцию use_block_editor_for_post_type для проверки активности Гутенберга для данного типа записи.

    if(use_block_editor_for_post_type($postType)){
    //Гутенберг активен.
    }
    
2 февр. 2019 г. 08:26:45
Комментарии

Мой вариант был https://pastebin.com/Fv3gYdhp

aubreypwd aubreypwd
29 июл. 2020 г. 17:24:23
3

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() ) ) {
        // ВЫПОЛНИТЕ ЗДЕСЬ НЕОБХОДИМЫЕ ДЕЙСТВИЯ
    }
}
13 нояб. 2018 г. 03:00:20
Комментарии

Это отлично, но я не думаю, что вам нужно использовать global $current_screen.

Simon Cossar Simon Cossar
10 дек. 2018 г. 01:55:36

верно, я обычно пишу примеры кода таким образом, так как не знаю, в каком контексте они будут использоваться — они могут легко сломаться в зависимости от этого... я просто добавил дополнительные проверки is_admin и isset для этой цели.

majick majick
10 дек. 2018 г. 05:49:40

В текущей версии WP (5.0.2) приведённый выше фрагмент не работает, когда он выполняется в функции, прикреплённой к хуку current_screen, потому что is_block_editor устанавливается позже. Он работает только если выполняется в более позднее время (например, load-(page)). Похоже, это баг в WP.

marcochiesi marcochiesi
8 янв. 2019 г. 20:13:46
0

Объект WP_Screen теперь содержит булево свойство для этого. Следующий код работает у меня:

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/

28 дек. 2020 г. 20:08:02
0

Gutenberg 3.6 представил такие функции, как has_blocks и has_block. Они заменяют устаревшую функцию gutenberg_post_has_blocks.

Если has_blocks возвращает true, значит, при редактировании поста использовался Gutenberg.

Вы можете использовать has_blocks() без параметров, если глобальная переменная $post уже установлена (например, в цикле запросов), или проверить содержимое поста напрямую с помощью has_blocks( $content ).

29 авг. 2018 г. 12:22:12
3

Я поделился пользовательской функцией, которую вы можете использовать для проверки, включен ли Гутенберг или нет.

if ( is_gutenberg_enable() ) {
    // Ваш код
}

Это пользовательская функция:

/**
 * Проверяет, включен ли Гутенберг.
 * Должна использоваться не раньше, чем сработает действие plugins_loaded.
 *
 * @return bool
 */
function is_gutenberg_enable() {

    $gutenberg    = false;
    $block_editor = false;

    if ( has_filter( 'replace_editor', 'gutenberg_init' ) ) {
        // Гутенберг установлен и активирован.
        $gutenberg = true;
    }

    if ( version_compare( $GLOBALS['wp_version'], '5.0-beta', '>' ) ) {
        // Блочный редактор.
        $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;
}
25 окт. 2020 г. 15:01:00
Комментарии

Это один из форков скрипта kagg-design? Включать plugin.php из wp-admin — действительно хорошая идея?

Rup Rup
25 окт. 2020 г. 15:37:02

Он немного отличается. По стандарту, нам следует избегать plugin.php, но в некоторых случаях его можно использовать. Здесь я использовал его для проверки плагина.

Jagir bahesh Jagir bahesh
25 окт. 2020 г. 16:18:04

@Rup вы можете просто использовать if ( ! class_exists( 'Classic_Editor' ) ) { вместо подключения plugin.php.

NextGenThemes NextGenThemes
8 авг. 2022 г. 05:12:12
0

Начиная с версии WP 5.0 и выше, в файле /wp-includes/blocks.php доступна функция 'has_blocks', поэтому вы можете использовать:

    if ( function_exists('has_blocks')) {
        $this->isGutenberg = true;
    }
    else {
        $this->isGutenberg = false;
    }
2 дек. 2019 г. 02:02:56
0

Проверка активности Gutenberg.

Неправильный вызов класса if ( zwp_is_block_editor() ) {

Ошибка 
       if ( zwp_is_block_editor() ) {
             class Auto_Save_Images_BLock_Editor
             {
                 ..............
             }
             new Auto_Save_Images_BLock_Editor();
       }

Правильно
       if ( ! zwp_is_block_editor() ) {
             class Auto_Save_Images_Classic_Editor
             {
                 ..............
             }
             new Auto_Save_Images_Classic_Editor();
       }



if ( ! function_exists( 'zwp_is_block_editor' ) ) {

    function zwp_is_block_editor() {
        // Получаем текущий экран, если функция доступна
        $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
        $is_block_editor = $screen ? $screen->is_block_editor() : false;

        if ( $is_block_editor ) {
            // Здесь код для блочного редактора
            return true;
        } else {
            // Здесь код для классического редактора
            return false;
        }

    }
}
4 авг. 2023 г. 17:52:55