Gutenberg (редактор блоков WordPress) был разработан вокруг блоков, рендеренных на JavaScript. Вы пишете функцию save() на JS, которая возвращает HTML блока, и WordPress сохраняет этот HTML в содержимом поста. Для простых визуальных блоков это работает отлично.
Но для динамических блоков — «Показать последние 3 блога с пользовательским стилем,» «Отобразить участника команды с данными из профиля текущего пользователя,» «Рендерить сетку продуктов из запроса WooCommerce» — блоки на JavaScript создают проблемы. Вам приходится писать вызовы REST API, управлять состояниями загрузки и восстанавливать логику получения данных, которую WordPress уже умеет делать на PHP.
PHP-рендеренные блоки позволяют вам написать PHP-обработчик, который выполняется во время рендеринга страницы, имеет полный доступ к API данных WordPress (WP_Query, get_field(), get_post_meta() и т.д.) и возвращает HTML напрямую. Проще, быстрее и более идиоматично для WordPress.
ACF представил acf_register_block_type() много лет назад, и он стал де-факто стандартом для разработчиков агентств, создающих пользовательские блоки Gutenberg. Field Forge поддерживает ту же сигнатуру функции, поэтому миграция тривиальна.
«`php // functions.php или пользовательский плагин
add_action(‘acf/init’, ‘register_my_blocks’);
function register_my_blocks() { if (function_exists(‘acf_register_block_type’)) { acf_register_block_type([ ‘name’ => ‘feature-card’, ‘title’ => __(‘Карточка функции’), ‘description’ => __(‘Карточка функции с иконкой, заголовком и описанием.’), ‘render_callback’ => ‘render_feature_card_block’, ‘category’ => ‘theme’, ‘icon’ => ‘star-filled’, ‘keywords’ => [‘feature’, ‘card’], ‘supports’ => [ ‘align’ => [‘wide’, ‘full’], ‘anchor’ => true, ‘color’ => true, ], ]); } }
function render_feature_card_block($block) { $icon = get_field(‘icon’); $title = get_field(‘title’); $description = get_field(‘description’); ?>
<?php } ```
Этот код идентичен коду регистрации ACF. Работает без изменений после миграции.
Если вы предпочитаете нативный API Field Forge (для чистоты кода или чтобы избежать намека на необходимость ACF), используйте fieldforge_register_block_type():
«php add_action('init', function() { fieldforge_register_block_type([ 'name' => 'feature-card', 'title' => __('Карточка функции'), 'render_callback' => 'render_feature_card_block', 'category' => 'theme', ]); }); «
Обе функции делают одно и то же. Используйте ту, которая соответствует вашим командам.
Каждый PHP блок может иметь свою собственную группу полей, назначенную через правила расположения:
« Правила расположения: Блок равен "acf/feature-card" «
Когда редактор добавляет блок в пост, Field Forge рендерит группу полей в боковой панели блока (или встроенно, в зависимости от настроек блока). Редактор заполняет поля, блок автоматически обновляется с живым предварительным просмотром.
Во время рендеринга функция render_callback использует get_field() для доступа к значениям полей:
«`php function render_feature_card_block($block) { // get_field() работает внутри обратных вызовов блока $icon = get_field(‘icon’); $title = get_field(‘title’);
// Массив $block содержит все данные об этом конкретном экземпляре блока $block_id = $block[‘id’]; $is_preview = !empty($block[‘is_preview’]); $block_data = $block[‘data’]; $className = !empty($block[‘className’]) ? $block[‘className’] : »;
// Рендеринг HTML ?>
<div class="feature-card «><?php } ```
PHP блоки поддерживают все стандартные функции блоков Gutenberg:
'align' => ['wide', 'full']'anchor' => true для HTML-якорных ссылок'color' => ['text' => true, 'background' => true]Все настраивается через стандартный API поддержки блоков WordPress.
Когда редактор просматривает блок в редакторе (не на фронтенде), обратный вызов выполняется в «режиме предварительного просмотра»:
«php function render_my_block($block) { if ($block['is_preview']) { // Рендеринг в редакторе echo '
'; } else { render_actual_block($block); } } «
Используйте это для добавления оберток только для редактора, контента-заполнителя, когда поля пусты, или специального стиля предварительного просмотра.
PHP блоки могут содержать другие блоки Gutenberg через InnerBlocks:
«`php acf_register_block_type([ ‘name’ => ‘two-column’, ‘render_callback’ => ‘render_two_column_block’, ‘supports’ => [ ‘inner_blocks’ => true, ], ]);
function render_two_column_block($block) { ?>
<?php } ```
Это позволяет вам создавать повторно используемые блоки макета, которые пользователи могут заполнять любыми основными блоками Gutenberg (параграф, заголовок, изображение и т.д.).
Предварительно заполняйте блоки с помощью стандартного внутреннего контента:
«php acf_register_block_type([ 'name' => 'three-column', 'render_callback' => 'render_three_column_block', 'template' => [ ['core/columns', [], [ ['core/column', [], [['core/heading', ['content' => 'Столбец 1']]]], ['core/column', [], [['core/heading', ['content' => 'Столбец 2']]]], ['core/column', [], [['core/heading', ['content' => 'Столбец 3']]]], ]], ], ]); «
Каждый вызов acf_register_block_type() в вашей существующей теме работает без изменений, когда активен Field Forge (через слой совместимости). Изменения кода не требуются.
Процесс миграции:
acf_register_block_type() продолжают работатьБольшинство сайтов с пользовательскими PHP блоками завершают миграцию, не трогая код регистрации блоков.
PHP блоки рендерятся на сервере, поэтому они не добавляют вес JavaScript-бандла. В сочетании с пользовательским хранилищем таблиц Field Forge, поиск значений полей внутри обратных вызовов рендеринга происходит быстро. Страница с 20 пользовательскими блоками работает с меньшим количеством запросов, чем аналогичная настройка на JavaScript.
| PHP-рендеренные блоки | Блоки JavaScript Gutenberg | |
|---|---|---|
| Язык | PHP | JavaScript (React / JSX) |
| Инструменты сборки | Нет | Webpack / Vite / wp-scripts |
| Доступ к динамическим данным | Легко (get_field(), WP_Query) |
Требует вызовов REST API |
| Опыт разработчика | Знакомо PHP-разработчикам | Требует навыков JavaScript |
| Интерактивность на стороне клиента | Невозможно | Полный жизненный цикл компонента React |
| Серверный рендеринг | Да (по умолчанию) | Только динамические блоки |
| Лучше всего для | Контентные блоки, динамические запросы, пользовательские поля | Интерактивные виджеты, живое редактирование |
PHP блоки и блоки JavaScript не являются взаимоисключающими — используйте оба на одном сайте для разных целей.
Получите Field Forge — от $35/год →
Поддержка PHP блоков включена в каждый платный план.