<? phpukraine СПІВБЕСІДИ
Пошук по платформі
WORDPRESS · MIDDLE

Як правильно реєструвати власний блок Gutenberg?

Сучасний шлях — block.json і register_block_type з шляхом до директорії блоку: метадані, скрипти й стилі описуються декларативно, а PHP-рендер задається через render або render_callback.

Динамічний чи статичний блок: у чому різниця?
Як передати дані з PHP у редактор блоку?
Чому блок є в редакторі, але не рендериться на фронтенді?
Gutenberg блоки block.json

Сучасна реєстрація блоку починається з block.json. У ньому описано все: назва й категорія, схема атрибутів, supports, скрипт редактора, стилі, скрипт фронтенду і, з WordPress 6.1, файл render.php для серверного рендеру. PHP-код зводиться до register_block_type зі шляхом до директорії: WordPress сам прочитає метадані, зареєструє ассети й підключить їх лише там, де блок реально використаний.

Ключове рішення при проєктуванні — статичний чи динамічний блок. Статичний зберігає готовий HTML у post_content через save(): швидко, не залежить від плагіна, але контент застигає. Динамічний повертає з save() null, а розмітку будує PHP на кожен показ: правильний вибір для списків, цін, будь-чого, що змінюється або залежить від користувача.

Атрибути статичних блоків живуть у коментарях розмітки, тому зміна схеми чи save() без масиву deprecated ламає всі вже вставлені блоки. Дані з PHP у редактор передають через REST API або inline-скрипт до editorScript, а вивід у render.php обовʼязково екранують. Для інтерактивності на фронтенді замість власного React-бандла зараз використовують Interactivity API з viewScriptModule.

// build/pricing/block.json (генерується з src через @wordpress/scripts)
// {
//   "apiVersion": 3, "name": "shop/pricing", "title": "Тарифи",
//   "attributes": { "plan": { "type": "string", "default": "pro" } },
//   "supports": { "align": ["wide"], "color": { "background": true } },
//   "editorScript": "file:./index.js", "style": "file:./style-index.css",
//   "viewScriptModule": "file:./view.js",
//   "render": "file:./render.php"
// }

// plugin.php: реєструємо директорію, WordPress читає block.json сам
add_action('init', function (): void {
    register_block_type(__DIR__.'/build/pricing');
});

// build/pricing/render.php: динамічний рендер, $attributes і $content доступні
$plan = sanitize_key($attributes['plan'] ?? 'pro');
$price = shop_plan_price($plan);
?>
<div <?php echo get_block_wrapper_attributes(['class' => 'pricing pricing--'.$plan]); ?>>
    <strong><?php echo esc_html(shop_plan_title($plan)); ?></strong>
    <span><?php echo esc_html(number_format_i18n($price / 100, 2)); ?> грн</span>
</div>
Що block.json є єдиним джерелом метаданих: назва, атрибути, supports, editorScript, style, viewScript, а PHP лише реєструє директорію.
Різницю між статичним блоком, у якого HTML зберігається в post_content із save(), і динамічним, який рендериться PHP на кожен показ.
Що атрибути блоку зберігаються в коментарі-розмітці, тому зміна їхньої схеми потребує deprecations у JS, інакше редактор покаже block validation error.
Що дані з PHP у редактор передаються через REST API, wp_localize_script або wp_add_inline_script на editorScript, а не через глобальні змінні в шаблоні.
Що збірка йде через @wordpress/scripts, а render.php у block.json з WP 6.1 замінює render_callback.
Реєструвати блок лише в JS через registerBlockType без block.json: WordPress не знає про ассети й не може лениво їх завантажити.
Робити статичний блок для контенту, який змінюється: список останніх постів, курси, ціни, бо збережений HTML застаріває.
Змінювати атрибути або розмітку save() без deprecated-версій і ламати всі вже вставлені блоки.
Виводити через render_callback необроблений HTML з атрибутів без esc_html і wp_kses_post.
Підключати editorScript на фронтенді або viewScript в адмінці, роздуваючи обидва бандли.
ПОРАДА

Уточніть, що туторіали з wp.blocks.registerBlockType у JS без block.json уже вважаються застарілими. Згадайте render.php і Interactivity API як актуальний напрям.

оновлено 3 вересня 2026 · ліцензія CC-BY-SA-4.0 Знайшли неточність? Напишіть →
ПЕРЕВІРТЕ СЕБЕ

block.json описує метадані блоку, а register_block_type реєструє його з потрібними ассетами.