Редактор Gutenberg, который появился в WordPress версии 5.0 содержит довольно много разнообразных блоков, которые закрывают множество потребностей пользователей. Однако нет предела совершенству, поэтому всегда найдется клиент, под которого нужно разработать какой-либо уникальный блок.Давайте здесь рассмотрим, как мы можем создать свой кастомный блок для редактора Gutenberg в виде аккордеона, который можно будет использовать для секции FAQ (ЧАВО), т.е. вопросов и ответов, которая довольно часто нужна на сайте.

Как известно, редактор Gutenberg был написан на React, поэтому мы будем использовать Node.js и Visual Studio Code, которые надо установить на ваш компьютер. Все инструменты бесплатны и кроссплатформенны, поэтому подойдут владельцам разных операционных систем. Также у вас должен быть установлен любой локальный сервер (XAMPP, MAMP, OpenServer) или Docker с уже установленным WordPress на нем. Хотя, если вы читаете эту статью, думаю, все это у вас уже есть.

Для разработки блока под Gutenberg мы будем создавать WordPress-плагин, в котором больше будет JavaScript, используемого в React, чем PHP. Конечно, лучше, если вы уже писали что-либо на React, но даже знаний JavaScript для начала вам вполне будет достаточно. Кроме того, приветствуется опыт работы с Node.js, т.к. придется устанавливать пакеты и запускать скрипты в терминале.

В этой статье мы рассмотрим следующее:

Генерируем начальные файлы с помощью WordPress blocks

Мы воспользуемся пакетом @wordpress/create-block. Для этого вам нужно открыть командную строку (клавиши Windows + R  и затем cmd и Enter, a затем нужно перейти в папку с плагинами wp-content/plugins вашего локального тестового сайта командой cd C:\OpenServer\domains\test-wp\wp-content\plugins - это в случае установки на OpenServer), Shift + правый клик в папке plugins - Открыть окно PowerShell здесь, запустить команду Open Git Busch here, если установлена Git, или открыть в папке VSCode и в его терминале набрать такие команды:

Можно не использовать $ cd accordion-block  и $ npm start, а сначала открыть папку accordion-block и запустить в ней Visual Studio Code, а затем уже внутри этого редактора в терминале набрать $ npm start.

После запуска кода в терминале вы можете увидеть сообщение о создании файлов block.json и package.json и установке пакета @wordpress/scripts:

При успешной установке всех пакетов вы можете увидеть в консоли такое сообщение:

Если такого сообщения вы не увидели, а все закончилось предупреждением  Installing @wordpress/scripts package. It might take a couple of minutes..., то вам нужно самим установить пакет @wordpress/scripts в папку с плагином командой:

Либо, что еще проще, набрать команду

и будет выполнена установка плагинов из package.json.

Структура файлов плагина

В корне созданной папки вы найдете файл с именем  accordion-block.php. Он является основным файлом вашего плагина и содержит информацию о плагине и функцию для регистрации блока.

Код в этом файле примерно такой:

Как оказалось, такой плагин уже существует в репозитории плагинов WordPress.

Существующий accordion-block

Поэтому мы поменяем его версию и описание. Вы также можете заменить имя автора. Здесь это не принципиально.

Теперь можно активировать блок и переходить в редактирование записи.

Имеет смысл открыть папку с вашим плагином в VisualStudio Code, чтобы посмотреть этот код  и перейти в папку src для редактирования следующих файлов:

  1. block.json - файл, где собрана вся информация о вашем блоке и его атрибутах
  2. edit.js - файл, описывающий все опции для редактирования блока в админке. В нем есть функция
    Edit() для экспорта в index.js и параметры в виде строки { ...useBlockProps }. Для начала в ней есть параграф с приветственным текстом.
  3. save.js - файл, описывающий вывод информации на сайте (фронте). В нем есть функция save() для экспорта в index.js и параметрыв виде строки { ...useBlockProps.save() }. Например, класс вашего блока.
  4. index.js - не факт, что вам придется что-либо здесь редактировать, но код в этом файле говорит о том, что вы регистрируете блок с определенным названием (соответствует названию папки проекта), а также используете функции для редактирования блока в админке и сохранения блока для сайта в функциях Edit и save, которые доступны файлах edit.js и save.js соответственно. Однако именно здесь вы будете добавлять атрибуты, когда код в вашем блоке будет усложняться.
  5. style.scss - для стилей блока на фронте (на сайте). Обратите внимание, что это файл, подразумевающий код в стилистике SASS (SCSS). Файл style.css, который впоследствии будет сгенерирован можно использовать для стилей как на фронте, так и в админке. В админке их можно переписать в файле editor.scss.
  6. editor.scss - для стилей блока в админке. Тоже для SCSS-синтаксиса.

В файле вы увидите уже некоторые стили для вашего блока:

В файле package.json вы можете найти скрипты, которые являются командами для запуска вашего кода:

Например, npm run build сформирует папку build, из которой будет браться готовый код для блока, а npm run start нужно будет запускать каждый раз, когда вы будете возвращаться к редактированию кода после того, как закрыли VSCode накануне или некоторое время назад, чтобы был сгенерирован новый скрипт.

Команда npm run format красиво отформатирует ваш код.

В файле index.js вы увидите следующее:

На данный момент код говорит о том, что мы регистрируем наш блок, используя 2 функции из файлов edit.js и save.js. Однако в файле edit.js функцию мы назвали с большой буквы (Edit), поэтому указываем ее, как edit: Edit, а в файле save.js она совпадает с названием функции для редактирования, поэтому оставляем просто save.

В файле edit.js мы имеем такой код:

Все комментарии вы можете убрать, сократив код до такого:

Этот код выведет вам абзац с синим фоном и белым цветом текста в админке.

В файле save.js вы найдете такой код:

Снова сокращаем код, убрав комментарии:

Этот файл ответственен за вывод текста 'Accordion Block – hello from the saved content!' на сайте.

Использование useBlockProps

useBlockProps - это хук React, который позволяет вывести все данные для вашего Gutenberg-блока. Основным является class, или в нотации React className, который совпадает с названием вашего блока в block.json. В нашем случае в block.json есть строка "name": "tempo/accordion-block", слэш в которой будет заменен пробелом.

В админке ваш блок имеет стандартные классы "block-editor-block-list__block wp-block", если блок выбран, то еще и классы "is-selected is-highlighted" , а также ваш кастомный класс "wp-block-tempo-accordion-block", который вы также увидите и на сайте.

Кроме того в useBlockProps вы можете поместить дополнительный класс или data-атрибуты или стилевые свойства, чем мы воспользуемся при назначении цветовых настроек для аккордеона.

Например, код может быть таким:

То есть те атрибуты, которые вы хотите использовать в своем блоке, а точнее в его корневом элемента, вы должны перечислить в хуке useBlockProps. Учтите, что эти атрибуты нужно писать отдельно и в файле edit.js, и в файле save.js.

В результате в админке мы получим такие атрибуты в html-коде нашего блока:

 

Активируем плагин-аккордеон

После этого перейдите в раздел Плагины в админке WordPress и активируйте ваш плагин, найдя его в списке плагинов по названию. Теперь перейдите в админку, найдите по названию блок accordion в любой новой или старой записи и добавьте его.

И кстати, вы не забыли запустить компиляцию скриптов командой npm start? Если забыли, то сделайте это, а то не сможете найти ваш блок в админке))

Вместо npm start имеет смысл запустить команду npm run start, т.к. она отвечает за постоянную компиляцию скриптов после любого сохранения ваших файлов. В этом случае вам не нужно следить за обновлением кода в админке. Кроме того, имеет смысл обновлять страницу в админке с обновлением кеша (CTRL+F5 или Shift + кнопка обновления в браузере) - тогда вы точно будете подтягивать новую версию скрипта для блока. Также можно отключить кеш, поставив галочку в Инструментах разработчика на вкладке Сеть (Network).

Итак, выбираем наш блок среди других, используя поле поиска, добавляем в любое место статьи и видим следующий текст:

новый Гутенберг-блок в админке и на сайте

Как вы, должно быть увидели, для блока выбрана иконка смайлика, что не совсем соответствует его функционалу, не очень понятный текст описания и относится он к категории виджетов, хотя должен относится к тексту. Все это мы можем исправить в файле block.json, который вы найдете в папке src вашего плагина.

Для иконки будем использовать набор WordPress Dashicons. В качестве категорий мы можем использовать одну из списка:

  1. text
  2. media
  3. design
  4. widgets
  5. theme
  6. embed

В результате код block.json изменится и будет таким:

 

Установка нужных npm-пакетов

Для того чтобы использовать блоки, которые можно редактировать и управлять ими с помощью кнопок, нам необходимо установить еще несколько пакетов модулей следующими командами в терминале:

Для установки модулей вы можете использовать команду install или ее краткий аналог в виде буквы i.

Скорей всего, у вас уже будет установлен и использован в коде пакет для перевода @wordpress/i18n, но если вы его не обнаружите, нужно добавить его командой

Этот пакет позволяет потом использовать .po и .mo-файлы, в которых вы определяете строки для различных языков (переводов). Затем вы будете импортировать функцию из этого пакета в файл edit.js и использовать ее примерно так:

Использование компонента RichText

На данном этапе у нас выводится статический текст. Естественно, это совсем не тот вариант, который необходим, т.к. любой пользователь захочет вставить свой текст. Поэтому мы добавляем 2 атрибута в файл  index.js:

Атрибуты также можно добавлять в файл block.json аналогичным образом, но в формате JSON, т.е. с двойными кавычками для всех строковых по сути свойств и значений.

А в файле edit.js нам нужно добавить импорт компонента RichText и его использование:

Обратите внимание, что для heading - заголовка для каждого элемента аккордеона мы разрешаем только кнопки Bold и Italic в атрибуте allowedFormats, а для основного контента (content) этот атрибут опущен, т.е. можно использовать все варианты форматирования. В const blockProps мы помещаем данные о свойствах этого блока и добавляем в 8-й строке еще один класс, который будет виден и в админке, и на фронтенде.

Также для каждого компонента RichText указаны атрибуты value и onChange, которые предназначены для изменения и сохранения контента в данном поле.

В файле save.js мы также импортируем данный компонент и используем его содержимое в виде RichText.Content, однако для каждого поля указываем другой value:

В результате при добавлении и заполнении нашего блока тестовыми данными увидим следующее в админке и на сайте:

Использование компонента RichText

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

Использование InnerBlocks

Вложенные блоки - это то, что вы можете наблюдать при использовании колонок, например. Есть некий внешний блок-оболочка, или wrapper, и вложенные в него дочерние блоки - children. Официальную справочную информацию вы можете найти здесь и на GitHub.

Для внутренних блоков можно использовать как разные виды уже существующих в ядре WordPress блоков, так и те, что вы создаете самостоятельно.

Для того чтобы начать это использовать вложенные блоки, давайте стачала изменим информацию о нашем плагине в block.json, т.к. все плагины часто используют некий префикс для того, чтобы не переопределялись стили и переменные. Поэтому в файле block.json меняем только строку "name". Наш префикс будет "tempo":

Кстати, будьте готовы к тому, что при любых изменениях в вашем коде при обновлении страницы в админке у вас будет сообщение о том, что ваш блок работает не вполне правильно. Временами достаточно нажать на кнопку "Попытка восстановления блока", временами нужно удалить старый блок и добавить новый.

Теперь определимся со структурой:

  • Основной блок - это, собственно, сам аккордеон, который у нас уже есть, но требует переработки кода.
  • Внутри аккордеона находятся несколько раскрывающихся панелей. Мы будем создавать отдельный блок panel, а с точки зрения классов у нас там будет основным .accordion-item.
  • В каждой .accordion-item.  мы будем размещать заголовок в виде компонента RichText + элемент в виде стрелки, который будет изменяться при открытии/закрытии панели, а также еще один блок с контентом в виде параграфов, списков, картинок и т.п., которые обычно размещают в аккордеонах.

Блок panel

Начнем с блока panel. Для этого в папке src создаем папку panel с 3-мя файлами: index.js, edit.js, save.js. То есть мы повторяем структуру файлов, ответственных за атрибуты, редактирование и сохранение, а также вывод нашего внутреннего блока.

Код файла index.js

В этом коде мы регистрируем блок с тем же префиксом "tempo" и именем "panel". Обратите внимание, что вложенный блок мы описываем в файле index.js, а не в block.json.

Важным моментом является то, что мы указываем строку parent: ['tempo/accordion-block'], которая говорит о том, что наш блок panel может быть только внутри нашего родительского блока.

Без этой строки, набирая при поиске блока название Accordion или его часть, мы увидим 2 блока, с ней - один.

Использование свойства parent

Блок supports показывает, что мы можем преобразовать наш код в HTML (html: true), но не разрешаем переиспользовать этот блок (reusable: false).

В качестве атрибутов мы используем title для заголовка элемента, а isOpen для проверки того, открыта или закрыта панель в админке.

Для редактирования панели в админке мы используем функцию Edit из файла edit.js, который находится в папке panel, а для отображения на сайте - функцию Save из save.js.

Код файла edit.js

Для управления внутренними блоками вам обязательно нужно импортировать компонент InnerBlocks из пакета @wordpress/block-editor.

Разбирать код этого файла будем со строки 19. В ней мы выводим компонент RichText с 2-мя допустимыми форматами - Bold и Italic для вывода заголовка каждой панели так, как делали ранее. RichText мы оборачиваем в <div className="accordion-heading">, в котором еще добавляем <div className="switcher-up-down"> с двумя элементами, стили которых используем для создания стрелки. В этом же блоке есть обработка клика, которая изменяет атрибут isOpen с true на false и наоборот:  onClick={()=>setAttributes({ isOpen: !isOpen })}. В случае true к классу accordion-item добавляется класс open, который изменяет стили. Стили мы допишем позже.

В <div className='accordion-content'> мы разместим компонент <InnerBlocks  /> с рядом атрибутов:

  • allowedBlocks - массив разрешенных блоков из ядра WordPress,  Это те блоки, которые могут быть использованы и вставлены как прямые потомки блока panel
  • template - здесь мы указываем константу BLOCKS_TEMPLATE - шаблон для внутренних блоков, который будет выводится сразу при первом добавлении нашего блока в структуру всех блоков на странице.
  • 2 закоментированных атрибута:
    • defaultBlock - блок, который будет добавляться по умолчанию. В нашем случае это параграф из закомментированной константы DEFAULT_BLOCK
    • directInsert={ true } - блок по умолчанию должен быть вставлен при клике на кнопке "Добавить блок".

Учтите, что задавая блок по умолчанию, при каждом нажатии на кнопку-аппендер в виде плюса вы будете добавлять именно такой блок. Конвертировать параграф можно при этом не во все блоки, а только в те, которые также используются для добавления текста.

Код файла save.js

В этот файл также нужно импортировать компонент InnerBlocks из пакета @wordpress/block-editor.

Тут все проще - мы просто добавляем в обертке из <div className='accordion-content'> компонент, выводящий контент внутренних блоков в виде строки <InnerBlocks.Content />.

Стили для блока panel

В основном стили мы опишем в файле style.scss, который управляет стилями и на сайте, и в админке. Все стили мы пишем в файлах, размещенных в корне папки src, т.к. он управляет сразу всеми элементами в разных блоках.

Код в файле style.scss

Мы будем использовать здесь переменные для того, чтобы при добавлении опций для управления цветом или паддингами можно было изменять эти переменные.

Код в файле editor.scss

Здесь мы опишем всего 1 стиль, который нужен для админки.

Основной блок

Теперь нам нужно изменить код основного блока, добавив в него примерно те же атрибуты для InnerBlocks, как в блоке panel.

Код файла index.js

Тут изменений очень мало - просто добавим импорт блока из папки panel во второй строке:

Код файла edit.js

Опять нужно импортировать компонент InnerBlocks, использовать RichText для заголовка и описать в InnerBlocks атрибуты allowedBlocks и template.

Здесь мы разрешаем добавлять в наш основной блок только блоки panel, а в качестве шаблона задаем 2 таких блока с настройками в виде заголовка.  Вот, как это будет выглядеть:

Левая часть этого скриншота - вид нашего блока в админке, а справа - на сайте, за который отвечает файл src/save.js.

Код файла save.js

Здесь мы импортируем InnerBlocks, проверяем, ввел ли пользователь-редактор поста заголовок для аккордеона - и только в этом случае его выводим. Также мы выводим контент внутренних блоков. И это все.

Как вы видите, большую часть работы берет на себя блок panel, однако все вместе собирается именно в основном блоке.

Но и это  еще не все. Нам нужно открывать контент по клику на заголовке. И тут нужно будет написать код на обычном JavaScript.

Скрипты в файле view.js

В корне вашего проекта вы найдете файл view.js, в котором есть примерно такой контент:

Именно этот файл позволяет написать нативный JavaScript-код (т.е. классический JS, а не в стилистике React), который будет управлять вашим блоком на тех страницах, на которые его добавили.

В нем разместим такой код (комментарии можно убрать):

Тут идет обработка события onclick по заголовку с классом .accordion-heading.

Результат с заполненным контентом:

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

Найти все файлы из статьи вы можете на Github. Как добавить цветовые настройки к блоку, читайте в отдельной статье.

Автор: Админ

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *