Gutenberg — это новый брендовый интерфейс от Automattic, который призван изменить способ взаимодействия пользователя с WordPress.
Если вы готовы к таким глобальным изменениям — милости прошу под кат, где мы посмотрим, как правильно готовить сам Gutenberg и плагины, взаимодействующие с ним.
Отключение Gutenberg
Полное отключение Gutenberg
Это то, что я бы не рекомендовал делать из вашего плагина. Вместо этого вы можете показать уведомление пользователям вашего плагина о том, что ваш плагин не работает с Gutenberg, чтобы они могли вернуться к классическому редактору.
Полное отключение может быть выполнено путём установки плагина Classic Editor или созданием настройки внутри вашего плагина, которая отключит Gutenberg:
add_filter( 'gutenberg_can_edit_post_type', '__return_false' );
Этот фильтр находится внутри функции gutenberg_can_edit_post_type()
, которая проверяет нужно ли загружать Gutenberg для текущего типа поста. Если функция всегда будет возвращать false
— это полностью отключит редактор Gutenberg.
Отключение Gutenberg для определённого CPT
Если в вашем плагине есть произвольный тип поста, то можно отключить Gutenberg только для него с помощью определённой конфигурации при регистрации CPT.
Поддержка визуального редактора
Gutenberg не будет подгружаться, если произвольный тип поста не поддерживает визуальный редактор:
$args = array( 'label' => __( 'Simple Giveaways', 'giveasap' ), 'labels' => $labels, 'supports' => array( 'title', //'editor', отключаем Gutenberg 'thumbnail', ), 'hierarchical' => false, // ... ); register_post_type( 'giveasap', $args );
Поддержка REST API
Если вам всё-таки необходимо поле с визуальным редактором, но не требуется поддержка REST API, то избавиться от Gutenberg можно, отключив опцию show_in_rest
:
$args = array( 'label' => __( 'Simple Giveaways', 'giveasap' ), // ... 'show_in_rest' => false, // Отключение Gutenberg // ... ); register_post_type( 'giveasap', $args );
Передав настройку show_in_rest
, равную false
, вы отключите редактор Gutenberg для текущего CPT.
Поддержка произвольного типа поста
Вы можете заюзать указанный выше фильтр gutenberg_can_edit_post_type
, сделав внутри колбека проверку на нужный вам CPT:
add_filter( 'gutenberg_can_edit_post_type', function( $can_edit, $post_type ){ if ( $can_edit && 'giveasap' === $post_type ) { return false; } return $can_edit; }, 20, 2 );
При помощи данного сниппета мы проверяем, что текущий пост — это giveasap
и возвращаем false
только для него.
Отключение Gutenberg при помощи метабоксов
Для отключения Gutenberg при регистрации вашего метабокса укажите, что редактор вам не нужен при помощи передачи параметра __block_editor_compatible_meta_box=false
:
add_meta_box( 'giveasap_users', __( 'Users', 'giveasap' ), 'giveasap_metabox_users', array( 'giveasap' ), 'side', 'high', array( // Отключение Gutenberg. '__block_editor_compatible_meta_box' => false, ) );
Подробнее про метабоксы в Gutenberg можно почитать в официальном руководстве.
Поддержка Gutenberg
Альтернативой отключению Gutenberg является его поддержка в вашем плагине.
Регистрация блока
Для регистрации нового блока напишите такой кусок РНР кода:
add_action( 'init', function() { wp_register_script( 'guten-tuts', plugins_url( 'block.js', __FILE__ ), array( 'wp-blocks', 'wp-element', 'wp-i18n' ) ); register_block_type( 'guten-tuts/alert', array( 'editor_script' => 'guten-tuts', ) ); // Our Dynamic block. register_block_type( 'guten-tuts/alertdynamic', array( 'render_callback' => 'guten_tuts_dynamic_alert' ) ); } );
При регистрации блока не забудьте указать зависимости. В данном примере — это wp-block
и wp-element
.
JavaScript файл блока
Создаём файл block.js
и в его начало вставляем следующий JavaScript код:
var el = wp.element.createElement, __ = wp.i18n.__, registerBlockType = wp.blocks.registerBlockType, RichText = wp.blocks.RichText, blockStyle = { backgroundColor: '#900', color: '#fff', padding: '20px' };
Статический блок
Для его создания пишем следующее:
registerBlockType( 'guten-tuts/alert', { title: __( 'Guten Tuts - Alert' ), icon: 'megaphone', category: 'layout', attributes: { text : { type: 'array', source: 'children', selector: 'div', } }, edit: function( props ) { var content = props.attributes.text; function onChangeText( newText ) { props.setAttributes( { text: newText } ); } return el( RichText, { tagName: 'div', className: props.className, onChange: onChangeText, value: content, isSelected: props.isSelected, style: blockStyle } ); }, save: function( props ) { var text = props.attributes.text; return el( 'div', { style: blockStyle, className: props.className }, text ); }, } );
В самом редакторе он будет выглядеть так:
Динамический блок
Для его создания регистрируем новый колбек guten_tuts_dynamic_alert
:
register_block_type( 'guten-tuts/alertdynamic', array( 'render_callback' => 'guten_tuts_dynamic_alert' ) );
Сам колбек представляет из себя следующую функцию:
function guten_tuts_dynamic_alert( $attributes ) { if ( ! isset( $attributes['text'] ) || ! $attributes['text'] ) { return; } ob_start(); ?> <div style="background:red; color:white; padding:1em;"><?php echo esc_html( $attributes['text'] ); ?></div> <?php return ob_get_clean(); }
Полный код динамического блока:
registerBlockType( 'guten-tuts/alertdynamic', { title: __( 'Guten Tuts - Dynamic Alert' ), icon: 'megaphone', category: 'layout', attributes: { text : { type: 'string', selector: 'div', }, }, edit: function( props ) { var content = props.attributes.text; blockStyle['width'] = '100%'; function onChangeText( e ) { var newText = e.target.value; props.setAttributes( { text: newText } ); } return el( 'input', { className: props.className + ' widefat', onChange: onChangeText, value: content, isSelected: props.isSelected, style: blockStyle } ); }, save: function( props ) { return null; }, } );
В самом редакторе динамический блок будет выглядеть так:
А отрендеренные версии обоих блоков на сайте во фронтенде будут выглядеть так:
Вместо заключения
Как видите, ничего сложного здесь нет, стоит только начать делать блоки под Gutenberg и ваш мир никогда больше не будет прежним. Дерзайте!
Ссылки
Источник: https://www.kobzarev.com/wordpress/gutenberg-hooks/