register_block_type()
Регистрирует новый тип блока для редактора блоков (Гутенберг).
Для корректной регистрации блока поле $block_type должно быть идентичным в php и js функциях:
register_block_type( 'alias/example', [] );
registerBlockType( 'alias/example', {} )
- Что такое block.json: https://developer.wordpress.org/block-editor/getting-started/fundamentals/block-json/
- Параметры в block.json: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/
- Метаданные block.json: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/
- Описание JS функции registerBlockType()
Смотрите также описание JS функции registerBlockType() многие из параметров этой функции передаются туда.
Обычно эту функцию запускают на событии init.
Хуков нет.
Возвращает
WP_Block_Type|false
. Объект зарегистрированного блока в случае успеха или false в случае ошибки.
Использование
register_block_type( $block_type, $args );
- $block_type(строка/WP_Block_Type) (обязательный)
Имя блока, включая пространство имен или полный экземпляр WP_Block_Type. Параметр $args не нужен, когда указан экземпляр WP_Block_Type{} (он будет проигнорирован).
Можно указать путь к
block.json
файлу блока:register_block_type( __DIR__ . '/block.json' );
Или можно указать путь к папке где лежит файл
block.json
:register_block_type( __DIR__ . '/my-block' );
- $args(массив)
Массив аргументов блока. Принимает любое публичное свойство класса WP_Block_Type. Возможные параметры смотрите в WP_Block_Type::__construct().
-
api_version(string)
Версия API блока. -
title(string)
Метка блока. -
category(string|null)
Категория блока для классификации. Используется в интерфейсе поиска для размещения блоков по категориям. -
parent(string[]|null)
Установка родителя позволяет блоку требовать наличие только при вложении в указанные блоки. -
ancestor(string[]|null)
Установка предка делает блок доступным только внутри указанных блоков в любой позиции поддерева блока предка. -
icon(string|null)
Иконка типа блока. Можно указать строку, название dashicon, без префиксаdashicon-
. Напримерdashicons-admin-links
>>>admin-links
. -
description(string)
Подробное описание блока. -
keywords(string[])
Дополнительные ключевые слова для отображения блока в результатах поиска. -
textdomain(string|null)
Текстовый домен перевода. -
styles(array[])
Альтернативные стили блока. -
variations(array[])
Вариации блока. -
selectors(array)
Пользовательские селекторы CSS для генерации стиля в theme.json. -
supports(array|null)
Поддерживаемые функции. -
example(array|null)
Структурированные данные для предварительного просмотра блока. -
render_callback(callable|null)
Функция используемая для отображения контента блока. Принимает параметры$attributes
и$content
. -
attributes(array|null)
Схемы свойств атрибутов блока. -
uses_context(string[])
Значения контекста, унаследованные блоками этого типа. -
provides_context(string[]|null)
Контекст, предоставляемый блоками этого типа. -
editor_script_handles(string[])
Обработчики сценариев только для редактора блока. -
script_handles(string[])
Обработчики сценариев для front-end и редактора блока. -
view_script_handles(string[])
Обработчики сценариев только для front-end блока. -
editor_style_handles(string[])
Обработчики стилей только для редактора блока. - style_handles(string[])
Обработчики стилей для front-end и редактора блока.
По умолчанию: array()
-
Примеры
#1 Использование WP Dashicon для блока
Для этого нужно в $args в параметре icon
указать иконку без префикса dashicons-
:
add_action( 'init', 'wpkama_register_block' ); function wpkama_register_block(){ register_block_type( __DIR__ . '/block.json', [ 'icon' => 'admin-home', /* omit 'dashicons-' prefix */ ] ); }
Все имена Dashicons: https://developer.wordpress.org/resource/dashicons/
#2 Как написать плагин/тему с несколькими блоками
Создание папки src
-
Запустите команду:
npx @wordpress/create-block@latest my-blocks --variant=dynamic cd my-blocks
Подробнее смотрите мануал https://developer.wordpress.org/block-editor/getting-started/tutorial/
-
Переместите содержимое каталога
src
в подкаталог, напримерblock-a
:src/block-a
. -
Продублируйте подкаталог
block-a
, чтобы создать второй блок, и назовите его, например,block-b
. -
Обновите файлы
block.json
в каждом подкаталоге, чтобы они соответствовали требованиям блоков.Должна получится такая структура:
my-blocks ├── package.json ├── package-lock.json └── src ├── block-a │ ├── block.json │ ├── edit.js │ ├── editor.scss │ ├── index.js │ ├── render.php │ ├── style.scss │ └── view.js └── block-b ├── block.json ├── edit.js ├── editor.scss ├── index.js ├── render.php ├── style.scss └── view.js
Пример содержимого
block.json
:{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "create-block/block-a", "version": "0.1.0", "title": "Block A", "category": "widgets", "icon": "smiley", "description": "Example block scaffolded with Create Block tool.", "example": {}, "supports": { "html": false }, "textdomain": "wpkama", "render": "file:./render.php", "editorScript": "file:./index.js", "editorStyle": "file:./index.css", "viewStyle": "file:./style-index.css", "viewScript": "file:./view.js" }
- Выполните команду
npm run build
в каталогеmy-blocks
. Будут созданы соответствующие директории в папкеmy-blocks/build
.
Регистрация блоков
Теперь нужно зарегистрировать блоки в PHP, указав на соответствующую директорию в папке build
:
add_action( 'init', 'wpdocs_create_blocks_mysite_block_init' ); function wpdocs_create_blocks_mysite_block_init() { register_block_type( __DIR__ . '/build/block-a' ); register_block_type( __DIR__ . '/build/block-b' ); }
Перемещение папки блоков внутрь проекта
Если у вас папка npm пакетов node_modules
находится где-то выше, а блоки должны находится внутри, например в папке темы, то можно указать пути где лежат исходники и куда выкладывать билды.
Для этого добавьте опции в скрипты build
и start
в файле package.json
:
"scripts": { "build": "wp-scripts build --webpack-src-dir=path/to/my-blocks/src/ --output-path=path/to/my-blocks/build/ --webpack-copy-php", "start": "wp-scripts start --webpack-src-dir=path/to/my-blocks/src/ --output-path=path/to/my-blocks/build/ --webpack-copy-php", ... }
Теперь npm run build
можно запускать из папки где лежит package.json
, и блоки будут билдиться в во внутренней папке (там где вы указали).
#3 Зарегистрируем новый тип блока без дополнительных параметров
add_action( 'init', 'gutenberg_block_register_block' ); add_action( 'enqueue_block_editor_assets', 'gutenberg_block_editor_scripts' ); // Регистрируем новый тип бока function gutenberg_block_register_block() { register_block_type( 'gutenberg-block/example', [] ); } // Регистрируем основной скрипт для блока function gutenberg_block_editor_scripts() { wp_register_script( 'example', plugins_url( 'build/index.js', __FILE__ ), ['wp-blocks'] ); wp_enqueue_script( 'example' ); }
#4 Зарегистрируем новый тип блока с дополнительными параметрами
Пример показывает как регистрировать блок в контексте класса. Блок бдует выводить записи.
new Gutenberg_Block_Example(); // инициализация class Gutenberg_Block_Example { public function __construct() { add_action( 'init', [ $this, 'gutenberg_block_register_block' ] ); add_action( 'enqueue_block_editor_assets', [ $this, 'gutenberg_block_editor_scripts' ] ); } public function gutenberg_block_register_block() { register_block_type( 'gutenberg-block/example', [ 'render_callback' => [ $this, 'gutenberg_block_render_callback' ], 'attributes' => [ 'posts_per_page' => [ 'type' => 'number', 'default' => 3, ], 'order' => [ 'type' => 'string', 'default' => 'desc', ], ], ] ); } public function gutenberg_block_editor_scripts() { wp_register_script( 'example', plugins_url( 'build/index.js', __FILE__ ), ['wp-blocks'] ); wp_enqueue_script( 'example' ); } public function gutenberg_block_render_callback( $attributes, $content ) { $args = [ 'posts_per_page' => $attributes['postsPerPage'], 'post_status' => 'publish', 'order' => $attributes['order'], ]; $posts = get_posts( $args ); $html = '<div>'; if ( $posts ) { $html .= '<ul>'; foreach ( $posts as $item ) { $html .= '<li><a href="' . get_the_permalink( $item->ID ) . '">' . $item->post_title . '</a></li>'; } $html .= '</ul>'; } else { $html .= '<h3>' . __( 'No posts!', 'gutenberg-blocks' ) . '</h3>'; } $html .= '</div>'; return $html; } }
#5 Передача произвольных атрибутов в $attributes
Вы можете передать свои атрибуты $attributes, которые могут быть использованы как в редакторе, так и на фронт-энде в render_callback:
register_block_type( 'my_namespace/my_block', [ 'render_callback' => 'render_callback', 'attributes' => [ 'some_string' => [ 'default' => 'default string', 'type' => 'string' ], 'some_array' => [ 'type' => 'array', 'items' => [ 'type' => 'string', ], ] ], 'render_callback' => 'render_block_my_custom_blocks_calendar', 'editor_script' => 'calendar-editor-js', 'editor_style' => 'calendar-editor-css', 'script' => 'calendar-frontend-js', 'style' => 'calendar-frontend-css', ] );
Важно (проверено в 5.0.3): Обязательно нужно указать тип параметра, иначе будет выдан notice.
#6 Авто-создание блоков через .json файлы
class My_Blocks { public function setup_hooks(): void { add_action( 'init', [ $this, 'register_blocks' ] ); add_filter( 'block_categories_all', [ $this, 'register_block_category' ] ); } public function register_blocks(): void { $blocks = glob( __DIR__ . '/Blocks/*/block.json'); if ( ! $blocks ) { return; } foreach ( $blocks as $block ) { register_block_type( $block ); } } } ( new My_Blocks() )->setup_hooks();
Пример .json файла:
{ "name": "ice-cream/slider", "title": "Ice Cream Slider", "description": "Простой настраиваемый слайдер изображений", "style": "block.css", "category": "ice-cream", "icon": "images-alt", "apiVersion": 2, "keywords": [], "styles": [], "supports": { "align": false, "anchor": false, "alignContent": false, "color": { "text": false, "background": true, "link": false }, "alignText": false, "fullHeight": false } }
Read more here: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/
Список изменений
С версии 5.0.0 | Введена. |
С версии 5.8.0 | First parameter now accepts a path to the block.json file. |
Код register_block_type() register block type WP 6.7.1
function register_block_type( $block_type, $args = array() ) { if ( is_string( $block_type ) && file_exists( $block_type ) ) { return register_block_type_from_metadata( $block_type, $args ); } return WP_Block_Type_Registry::get_instance()->register( $block_type, $args ); }