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

Необходимые 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
для проверки, потому что:
admin_enqueue_scripts
— это первый хук, который срабатывает после той же проверкиis_gutenberg_page()
, которую сам Gutenberg выполняет.Из-за природы Gutenberg, скорее всего, вам понадобится загружать внешние скрипты/стили для ваших целей.
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.
// это может даже не быть редактором, вам нужно проверить экран, если требуется проверка для другого редактора.
}
}

Это работает только с плагином Gutenberg, не работает в WordPress 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()
) {
// Плагин 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;
}

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

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

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() ) ) {
// ВЫПОЛНИТЕ ЗДЕСЬ НЕОБХОДИМЫЕ ДЕЙСТВИЯ
}
}

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

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

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

Объект 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/

Gutenberg 3.6 представил такие функции, как has_blocks
и has_block
. Они заменяют устаревшую функцию gutenberg_post_has_blocks
.
Если has_blocks
возвращает true, значит, при редактировании поста использовался Gutenberg.
Вы можете использовать has_blocks()
без параметров, если глобальная переменная $post
уже установлена (например, в цикле запросов), или проверить содержимое поста напрямую с помощью has_blocks( $content )
.

Я поделился пользовательской функцией, которую вы можете использовать для проверки, включен ли Гутенберг или нет.
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;
}

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

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

Проверка активности 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;
}
}
}
