проверьте, используется ли в настоящее время Гутенберг

13

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

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

NerdOfLinux
источник
Вы имеете в виду как is_gutenberg_page () с function_exists (не проверено)?
birgire

Ответы:

10

Есть is_gutenberg_page()функция, которая будет присутствовать при активации Gutenberg, поэтому вы можете проверить:

if( function_exists( 'is_gutenberg_page' ) )

Это будет только проверять, активирован ли Gutenberg, а сама функция проверяет, установлен ли текущий редактор для загрузки Gutenberg. Итак, КОД становится:

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

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

Гутенберг сам проверяет is_gutenberg_page()функцию из gutenberg_init()функции, которая загружается с помощью replace_editorхука. Так что replace_editorкрюк - хорошее место для этой проверки.

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

  1. admin_enqueue_scriptsэто первый крюк, который срабатывает после той же is_gutenberg_page()проверки, которую делает Гутенберг.

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

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

Пример кода (проверено):

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.
    }   
}
Fayaz
источник
2
Это работает только с плагином Gutenberg, он не работает в wp5, если плагин не установлен
maxime schoeni
1
is_block_editorтребуется для wp5.0 +
Джейкоб Раккуя
5

Функция is_gutenberg_pageвзята из плагина Гутенберга, а 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;
}
Бенджамин Интал
источник
Это правильный ответ, двигаясь вперед.
Джейкоб Раккуя
3
  1. Гутенберг был интегрирован в 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функцию для проверки , если Гутенберг активен к этому типу.

    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
    }
}
majick
источник
Это здорово, но я не думаю, что тебе нужно звонить global $current_screen.
Симон Коссар
правда, я склонен кодировать примеры таким образом, так как я не знаю, в каком контексте они будут - они могут легко сломаться в зависимости от этого ... Я просто добавил дополнительный is_admin и проверку isset для этой цели.
Маджик
В текущей версии WP (5.0.2) приведенный выше фрагмент не работает, когда он выполняется в функции, присоединенной к current_screenхуку, потому что is_block_editorон установлен позже. Это работает, только если оно выполнено позднее (т.е. load-(page)). Это похоже на ошибку в WP.
Marcochiesi
1

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

Если has_blocksвозвращает true, то Гутенберг был использован при редактировании поста.

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

Андрей
источник
0

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

    if ( function_exists('has_blocks')) {
        $this->isGutenberg = true;
    }
    else {
        $this->isGutenberg = false;
    }
Драган Антонич
источник