✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Отформатируйте содержимое публикации с помощью registerFormatType.

26

Вы можете легко добавить пользовательские кнопки на панель инструментов в WordPress Gutenberg, но знаете ли вы, что вы также можете добавить элементы управления типом формата в меню форматирования?

В этом руководстве мы рассмотрим, как добавить элемент управления форматом registerFormatType, который позволит нам выбрать цвет выделения выделенного текста с помощью семантического <mark>тега HTML.

Весь код, использованный в этом руководстве, можно найти в бесплатном плагине «Highlighter».

Стоит отметить, что вы можете не только применять форматы к выделенному тексту в своих блоках, но также можете использовать их для вставки других объектов непосредственно в блоки, таких как встроенные изображения и значки.

Применение типа формата с помощью плагина Highlighter.

Видео выше показывает плагин Highlighter и наш тип формата в действии. Давайте перейдем к нему.

Предпосылки

Настройте файлы плагина

Если вы выполнили предварительные условия и следовали руководству по плагину, нам нужно удалить кучу этих файлов.

  • В папке src удалите все, кроме файлов index.jsи .style.scss
  • Удалите содержимое файла index.jsand style.scssполностью.
  • В /buildпапке удалить все файлы. Мы восстановим их позже.
  • Удалить block.json. Мы не строим блок сегодня, поэтому нам это не нужно.

Поставить сценарии в очередь

В основной файл плагина (wholesome-plugin.phpесли вы дословно следовали предыдущему руководству) добавьте следующий код, чтобы поставить в очередь JavaScript и CSS для вашего плагина.

<?php

function setup(): void {

    load_plugin_textdomain( 'wholesome-highlighter', false, ROOT_DIR. 'languages' );

    add_action( 'enqueue_block_editor_assets', __NAMESPACE__. 'enqueue_block_editor_assets', 10 );

    add_action( 'enqueue_block_assets', __NAMESPACE__. 'enqueue_block_styles', 10 );
}

function enqueue_block_editor_assets(): void {

    $asset_path = ROOT_DIR. '/build/index.asset.php';

    if (! file_exists( $asset_path)) {
        throw new Error(
            esc_html__( 'You need to run `npm start` or `npm run build` in the root of the plugin "wholesome-highlighter" first.', 'wholesome-highlighter') );
    }

    $scripts = '/build/index.js';
    $assets  = include $asset_path;

    wp_enqueue_script(
        PLUGIN_SLUG. '-block-scripts',
        plugins_url( $scripts, ROOT_FILE ),
        $assets['dependencies'],
        $assets['version'],
        false
    );

    wp_set_script_translations(
        PLUGIN_SLUG. '-block-scripts',
        'wholesome-highlighter',
        ROOT_DIR. 'languages'
    );
}
add_action( 'plugins_loaded', __NAMESPACE__. 'setup' );

function enqueue_block_styles(): void {

    $styles = '/build/style-index.css';

    wp_enqueue_style(
        PLUGIN_SLUG. '-block-styles',
        plugins_url( $styles, ROOT_FILE ),
        array(),
        filemtime( ROOT_DIR. $styles) );
}

add_action( 'plugins_loaded', __NAMESPACE__. 'setup' );
  1. Зарегистрируйте тип формата

Откройте /src/index.jsфайл и добавьте следующий код.


import { RichTextToolbarButton } from '@wordpress/block-editor';
import { __ } from '@wordpress/i18n';

const HighlighterButton = ({ isActive, onChange, value}) => {
    return (<RichTextToolbarButton
            icon='edit'
            isActive={ isActive }
            title={ __( 'Highlight', 'wholesome-highlighter') }
        />) };

Это создаст нашу кнопку выделения, которая появится в меню формата. Теперь мы будем использовать registerFormatTypeдля регистрации формат.

Во-первых, нам нужно отредактировать наш импорт, чтобы он также импортировал registerFormatTypeиз файлов @wordpress/rich-text.

import { registerFormatType, toggleFormat } from '@wordpress/rich-text';

Затем зарегистрируйте формат, добавив имя формата (wholesome/highlighter) и передав объект со следующими свойствами. toggleFormatбудет использоваться позже для нашего события клика.

  • className: имя класса, которое будет добавлено к тегу, окружающему выделенный текст.
  • edit: Кнопка, которую мы ранее зарегистрировали.
  • tagName: Тип тега, который будет применен к выделенному тексту. В данном случае мы используем <mark>семантически правильную разметку для выделения текста.
  • title: Название формата.

registerFormatType(
    'wholesome/highlighter', {
        className: 'wholesome-highlight',
        edit: HighlighterButton,
        tagName: 'mark',
        title: __( 'Highlight', 'wholesome-highlighter' ),
    }
);

Обработка клика

Теперь, когда мы добавили кнопку в меню формата, все, что нам нужно сделать, это обработать событие щелчка.

Отредактируйте RichTextToolbarButtonи добавьте onClickсобытие.

<RichTextToolbarButton
  icon='edit'
  isActive={ isActive }
  onClick={() => {
    onChange(
      toggleFormat( value, {
        type: 'wholesome/highlighter',
      }) );
  } }
  title={ __( 'Highlight', 'wholesome-highlighter') }
/>

В триггере мы вызываем toggleFormatпередачу значения (которое является выделенным текстом) и передаем объект со typeсвойством, установленным на имя нашего формата.

Теперь при первоначальном нажатии кнопки <mark>тег HTML будет применен к выделенному тексту, а при повторном нажатии он переключит формат, снова удалив его.

Чтобы просмотреть код полностью и просмотреть последние обновления , просмотрите полный /src/formats/highlight.jsфайл в плагине Highlighter.

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

Для этого нам потребуется использовать компонент более высокого порядка ifCondition и useSelect, чтобы определить тип блока, который мы выбрали.

Для этого добавьте следующие импорты в начало файла.

import { ifCondition  } from '@wordpress/compose';
import { useSelect } from '@wordpress/data';

Над registerFormatTypeблоком кода добавьте следующий блок кода.


var HighlighterButtonContainer = ifCondition( (props) => {
    const selectedBlock = useSelect( (select) => select('core/block-editor').getSelectedBlock() );
    return (selectedBlock &&
        selectedBlock.name === 'core/paragraph'
    ); 
} )( HighlighterButton );

Как видно из кода, если выбранный блок является core/paragraphкомпонентом более высокого порядка ifCondition, он вернет true и, следовательно, позволит кнопке отобразиться.

Все, что нам нужно сделать сейчас, это передать только что созданный контейнер в registerBlockTypeблок кода, и наш код готов.


registerFormatType(
    'wholesome/highlighter', {
        className: 'wholesome-highlight',
        edit: HighlighterButtonContainer,
        tagName: 'mark',
        title: __( 'Highlight', 'wholesome-highlighter' ),
    }
);

Чтобы просмотреть код полностью , посмотрите /src/formats/highlight-paragraph.jsфайл в плагине Highlighter.

Источник записи: wholesomecode.ltd

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее