acf_register_block_type()
Регистрирует кастомный блок для редактора блоков Gutenberg через PHP (ACF).
Позволяет добавить блок c собственными ACF полями и шаблоном рендера прямо из PHP.
После регистрации блок можно указывать в ACF параметре location ("Block") — это позволяет привязать к нему поля:
'location' => [ [ [ 'param' => 'block', 'operator' => '==', 'value' => 'acf/hero-block', ], ], ],
Вывод блока осуществляется через PHP-шаблон или callback с использованием get_field() и the_field().
Регистрация должна прохоидть на хуке acf/init.
С версии ACF 6.0 рекомендуется регистрировать блоки с помощью нового синтаксиса block.json + register_block_type().
Функциональность, описанная в этой документации, может не работать с современными версиями WordPress.
Заметки
-
Для динамического рендера можно использовать
render_callback, особенно если нужен PHP-код с логикой. -
Можно включить превью блоков, смотрите ниже.
- Можно использовать вложенные блоки (innerBlocks), смотрите ниже
Хуки из функции
Возвращает
(Массив|false). Массив проверенных настроек зарегистрированного блока.
Использование
acf_register_block_type( $block );
- $block(массив) (обязательный)
Аргументы регистрации блока (соответствуют параметрам registerBlockType() в JS).
name(String): уникальный идентификатор блока, напримерtestimonial.title(String): отображаемое название в редакторе.description(String): краткое описание.category(String): категория (common, formatting, layout, widgets, embed).icon(String|Array): Dashicon или SVG, можно задать цвет фона/переднего плана.keywords(Array): дополнительные поисковые слова.post_types(Array): ограничение по типам записей.mode(String): auto, preview, edit — поведение интерфейса.align, align_text, align_content (String): дефолтное выравнивание.render_template(String): путь к PHP-шаблону для рендера.render_callback(Callable): функция/метод для рендера блока.enqueue_style, enqueue_script (String): пути к файлам стилей/скриптов.enqueue_assets(Callable): функция для динамической регистрации ресурсов.supports(Array): опции поддержки (align, mode, multiple, full_height, jsx и др.).example(Array): шаблон для превью в панели вставки block-inserter.
Inner Blocks
<InnerBlocks /> — это возможность вложенного контента (блоки внутри блоков).
Используйте компонент <InnerBlocks /> в шаблоне блока. Он создаёт область для вставки вложенных блоков в редакторе.
Важно:
- Допускается только один
<InnerBlocks />на блок. - Блок должен быть зарегистрирован с поддержкой JSX -
'jsx' => true, иначе компонент не сработает.
Параметры <InnerBlocks />
- allowedBlocks(array)
Ограничивает допустимые блоки:
<?php $allowed_blocks = [ 'core/image', 'core/paragraph' ]; ?> <InnerBlocks allowedBlocks="<?= esc_attr( wp_json_encode( $allowed_blocks ) ) ?>" />
- template(array)
Создают структуру вложенных блоков:
<?php $template = [ [ 'core/paragraph', [ 'placeholder' => 'Add a root-level paragraph' ] ], [ 'core/columns', [], [ [ 'core/column', [], [ [ 'core/image', [] ], ] ], [ 'core/column', [], [ [ 'core/paragraph', [ 'placeholder' => 'Add a inner paragraph' ] ], ] ], ] ], ]; ?> <InnerBlocks template="<?= esc_attr( wp_json_encode( $template ) ) ?>" templateLock="all" />
- templateLock(string)
Блокирует содержимое шаблона. Доступные настройки:
all— нельзя изменять структуру.insert— запрещает удаление, но позволяет добавление новых блоков.
См. компонент InnerBlocks для получения дополнительной информации.
Пример регистрации блока
add_action( 'acf/init', 'my_acf_init_blocks' );
function my_acf_init_blocks() {
acf_register_block_type( [
'name' => 'restricted',
'title' => 'Restricted',
'description' => 'A restricted content block.',
'category' => 'formatting',
'mode' => 'preview',
'render_template' => 'template-parts/blocks/restricted/restricted.php',
'supports' => [
'align' => true,
'mode' => false,
'jsx' => true,
],
] );
}
Пример шаблона restricted.php:
<?php
$classes = trim(
( $block['className'] ?? '' ) .
( ! empty( $block['align'] ) ? ' align' . $block['align'] : '' )
);
$start_date = get_field( 'start_date' );
$end_date = get_field( 'end_date' );
$start_ts = $start_date ? strtotime( $start_date ) : false;
$end_ts = $end_date ? strtotime( $end_date ) : false;
$notification = 'Content unrestricted.';
if ( $start_date || $end_date ) {
$notification = 'Content visible';
$notification .= $start_date ? " from $start_date" : '';
$notification .= $end_date ? " until $end_date" : '';
$notification .= '.';
}
?>
<div class="restricted-block <?= esc_attr( $classes ) ?>">
<span class="restricted-block-notification"><?= esc_html( $notification ) ?></span>
<InnerBlocks />
</div>
Предпросмотр блоков

Для отображения превью в панели вставки блоков добавьте параметр example при регистрации блока:
acf_register_block_type( [ 'name' => 'testimonial', 'title' => __( 'Testimonial' ), 'description' => __( 'A custom testimonial block.' ), 'example' => [ 'attributes' => [ 'mode' => 'preview', 'data' => [ 'testimonial' => 'Blocks are...', 'author' => 'Jane Smith', 'role' => 'Person', 'is_preview' => true, ], ], ], ] );
Все значения, указанные в массиве data, будут доступны в шаблоне/обработчике блока через $block['data'] или get_field().
data— содержит значения, доступные через $block['data'] или get_field().is_preview— не связано с блоком и может использоваться для отображения альтернативной разметки.preview— режим визуального представления блока, но можно использовать иedit— тогда будут отображаться связанные с блоком поля.
Примеры
#1 Регистрация блока с шаблоном
add_action('acf/init', 'my_acf_blocks_init');
function my_acf_blocks_init() {
// Register a testimonial block.
acf_register_block_type(array(
'name' => 'testimonial',
'title' => __('Testimonial'),
'description' => __('A custom testimonial block.'),
'render_template' => 'template-parts/blocks/testimonial/testimonial.php',
'category' => 'formatting',
));
}
testimonials.php
<?php
/**
* Testimonial Block Template.
*
* @param array $block The block settings and attributes.
* @param string $content The block inner HTML (empty).
* @param bool $is_preview True during AJAX preview.
* @param (int|string) $post_id The post ID this block is saved to.
*/
// Create id attribute allowing for custom "anchor" value.
$id = 'testimonial-' . $block['id'];
if( !empty($block['anchor']) ) {
$id = $block['anchor'];
}
// Create class attribute allowing for custom "className" and "align" values.
$className = 'testimonial';
if( !empty($block['className']) ) {
$className .= ' ' . $block['className'];
}
if( !empty($block['align']) ) {
$className .= ' align' . $block['align'];
}
// Load values and handle defaults.
$text = get_field('testimonial') ?: 'Your testimonial here...';
$author = get_field('author') ?: 'Author name';
$role = get_field('role') ?: 'Author role';
$image = get_field('image') ?: 295;
$background_color = get_field('background_color');
$text_color = get_field('text_color');
?>
<div id="<?php echo esc_attr($id); ?>" class="<?php echo esc_attr($className); ?>">
<blockquote class="testimonial-blockquote">
<span class="testimonial-text"><?php echo $text; ?></span>
<span class="testimonial-author"><?php echo $author; ?></span>
<span class="testimonial-role"><?php echo $role; ?></span>
</blockquote>
<div class="testimonial-image">
<?php echo wp_get_attachment_image( $image, 'full' ); ?>
</div>
<style type="text/css">
#<?php echo $id; ?> {
background: <?php echo $background_color; ?>;
color: <?php echo $text_color; ?>;
}
</style>
</div> #2 Регистрация блока с callback
Этот пример показывает как зарегистрированть блок с использованием параметра render_callback.
<?php
add_action('acf/init', 'my_register_blocks');
function my_register_blocks() {
acf_register_block_type(array(
'name' => 'testimonial',
'title' => __('Testimonial'),
'description' => __('A custom testimonial block.'),
'render_callback' => 'my_acf_block_render_callback',
'category' => 'formatting',
));
}
/**
* Testimonial Block Callback Function.
*
* @param array $block The block settings and attributes.
* @param string $content The block inner HTML (empty).
* @param bool $is_preview True during AJAX preview.
* @param (int|string) $post_id The post ID this block is saved to.
*/
function my_acf_block_render_callback( $block, $content = '', $is_preview = false, $post_id = 0, $wp_block = false, $context = false ) {
// Create id attribute allowing for custom "anchor" value.
$id = 'testimonial-' . $block['id'];
if( !empty($block['anchor']) ) {
$id = $block['anchor'];
}
// Create class attribute allowing for custom "className" and "align" values.
$className = 'testimonial';
if( !empty($block['className']) ) {
$className .= ' ' . $block['className'];
}
if( !empty($block['align']) ) {
$className .= ' align' . $block['align'];
}
// Load values and handle defaults.
$text = get_field('testimonial') ?: 'Your testimonial here...';
$author = get_field('author') ?: 'Author name';
$role = get_field('role') ?: 'Author role';
$image = get_field('image') ?: 295;
$background_color = get_field('background_color');
$text_color = get_field('text_color');
?>
<div id="<?php echo esc_attr($id); ?>" class="<?php echo esc_attr($className); ?>">
<blockquote class="testimonial-blockquote">
<span class="testimonial-text"><?php echo $text; ?></span>
<span class="testimonial-author"><?php echo $author; ?></span>
<span class="testimonial-role"><?php echo $role; ?></span>
</blockquote>
<div class="testimonial-image">
<?php echo wp_get_attachment_image( $image, 'full' ); ?>
</div>
<style type="text/css">
#<?php echo $id; ?> {
background: <?php echo $background_color; ?>;
color: <?php echo $text_color; ?>;
}
</style>
</div>
<?php
}
Список изменений
| С версии 5.8.0 | Введена. |