Полезные хуки редактора Gutenberg

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/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: