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 блоків включена в кожен платний план.