Что такое пользовательский блок Gutenberg
Пользовательский блок — это самостоятельный компонент редактора, который имеет собственные:- настройки;
- атрибуты;
- интерфейс;
- стили;
- JavaScript;
- PHP (для динамических блоков).
Преимущества собственных блоков
- удобный визуальный редактор;
- отсутствие шорткодов;
- гибкая настройка параметров;
- автоматическая интеграция с Gutenberg;
- поддержка Full Site Editing;
- простое сопровождение проекта.
Структура проекта
my-block/ ├── block.json ├── index.js ├── edit.js ├── save.js ├── style.css ├── editor.css ├── render.php └── index.asset.php
Файл block.json
Современная разработка блоков начинается именно с него.{ "$schema":"https://schemas.wp.org/trunk/block.json", "apiVersion":3, "name":"mytheme/card", "title":"Карточка", "category":"widgets", "icon":"admin-post", "description":"Карточка товара", "editorScript":"file:./index.js", "editorStyle":"file:./editor.css", "style":"file:./style.css" }
Регистрация блока
В файле functions.php или основном файле плагина:add_action('init', function () { register_block_type( __DIR__ . '/blocks/card' ); });
WordPress автоматически зарегистрирует все файлы, указанные в block.json.
Создание JavaScript
Файл index.js регистрирует блок.import { registerBlockType } from '@wordpress/blocks'; import Edit from './edit'; import Save from './save'; registerBlockType('mytheme/card',{ edit:Edit, save:Save });
Редактор блока
Файл edit.js отвечает за отображение блока в Gutenberg.export default function Edit(){ return( <div> Мой первый блок </div> ); }
Вывод блока
Файл save.js определяет HTML, который будет сохранен в записи.export default function Save(){ return( <div> Мой первый блок </div> ); }
Добавление атрибутов
registerBlockType('mytheme/card',{ attributes:{ title:{ type:'string', default:'' } } });
Использование RichText
import { RichText } from '@wordpress/block-editor'; export default function Edit({attributes,setAttributes}){ return( <RichText value={attributes.title} onChange={(value)=> setAttributes({ title:value }) } /> ); }
Сохранение текста
export default function Save({attributes}){ return( <RichText.Content tagName="h2" value={attributes.title} /> ); }
Добавление панели настроек
import { InspectorControls } from '@wordpress/block-editor'; import { PanelBody, TextControl } from '@wordpress/components';
Пример:
<InspectorControls> <PanelBody title="Настройки"> <TextControl label="Заголовок" /> </PanelBody> </InspectorControls>
Добавление CSS
Файл style.css.wp-block-mytheme-card{ padding:30px; background:#fff; border-radius:12px; box-shadow:0 5px 20px rgba(0,0,0,.08); }
Стили редактора
Файл editor.css.wp-block-mytheme-card{ outline:2px dashed #0073aa; }
Добавление изображения
import { MediaUpload } from '@wordpress/block-editor';
Использование:
<MediaUpload onSelect={ (image)=> setAttributes({ image:image.url }) } />
Создание динамического блока
В block.json:{ "render":"file:./render.php" }
Файл render.php
<?php return sprintf( '<div class="card">%s</div>', esc_html( $attributes['title'] ) );
Подключение JavaScript только для фронтенда
{ "viewScript":"file:./view.js" }
Добавление собственного значка
{ "icon":"smiley" }
Можно использовать любую Dashicons-иконку.
Добавление категории
{ "category":"widgets" }
Или собственную категорию:
wp.blocks.updateCategory( 'mytheme', { title:'Мои блоки' } );
Использование InnerBlocks
Если блок должен содержать другие блоки:import { InnerBlocks } from '@wordpress/block-editor';
Вывод:
<InnerBlocks />
Сборка проекта
Для разработки рекомендуется использовать пакет @wordpress/scripts. Установка:npm install @wordpress/scripts --save-dev
Сборка проекта:
npm run build
Разработка:
npm start
Типичные ошибки
- не зарегистрирован block.json;
- не подключен index.asset.php;
- не совпадает имя блока в registerBlockType() и block.json;
- неправильно настроены атрибуты;
- используется устаревший API Gutenberg;
- отсутствуют editor.css или style.css;
- не очищен кэш после сборки проекта.
Итог
- используйте block.json как основной файл конфигурации;
- разделяйте стили редактора и фронтенда;
- используйте React-компоненты WordPress вместо собственного HTML там, где это возможно;
- для сложных блоков применяйте динамический рендеринг через PHP;
- используйте @wordpress/scripts для автоматической сборки;
- храните каждый блок в отдельной директории;
- используйте семантическую HTML-разметку и валидируйте атрибуты перед выводом.
Создание собственного блока Gutenberg — современный и рекомендуемый способ расширения возможностей WordPress. Использование файла block.json, компонентов React, функций register_block_type() и динамического рендеринга через PHP позволяет создавать удобные, быстрые и полностью интегрированные с редактором блоки. Такой подход делает разработку тем и плагинов более структурированной, упрощает сопровождение кода и обеспечивает совместимость с последними версиями WordPress и Full Site Editing.



