render_block_(name) │ хук-фильтр │ WP 5.7.0

Позволяет изменить HTML указанного блока после его рендеринга.

Вместо (name) указывается полное имя блока с пространством имён:

  • render_block_core/paragraph - абзац.
  • render_block_core/image - изображение.
  • render_block_core/group - группа.
  • render_block_my-plugin/example - пользовательский блок.

Фильтр вызывается в WP_Block::render() после общего фильтра render_block. Работает для статических и динамических блоков, включая вложенные. Изменяет вывод, но не сохранённый контент записи.

Если рендеринг блока прерван через pre_render_block, этот фильтр для него не вызывается.

Для обработки всех типов блоков используйте render_block. Для замены результата до рендеринга используйте pre_render_block.

Использование

add_filter( 'render_block_(name)', 'wp_kama_render_block_name_filter', 10, 3 );

/**
 * Function for `render_block_(name)` filter-hook.
 * 
 * @param string   $block_content The block content.
 * @param array    $block         The full block, including name and attributes.
 * @param WP_Block $instance      The block instance.
 *
 * @return string
 */
function wp_kama_render_block_name_filter( $block_content, $block, $instance ){
	// filter...
	return $block_content;
}
$block_content(строка)

HTML блока после рендеринга и обработки предыдущими фильтрами.

Верните изменённый HTML или исходное значение. Пустая строка '' уберёт блок из вывода, но сам рендеринг к этому моменту уже выполнен.

$block(массив)

Данные блока.

  • blockName(строка)
    Полное имя блока, например core/image.

  • attrs(массив)
    Атрибуты блока из его HTML-комментария. Атрибуты, извлекаемые из HTML, могут отсутствовать.

  • innerBlocks(массив массивов)
    Вложенные блоки с такой же структурой данных.

  • innerHTML(строка)
    Исходный HTML блока без HTML вложенных блоков. Не равнозначен готовому $block_content.

  • innerContent(массив)
    Фрагменты HTML и значения null на местах вложенных блоков.
$instance(WP_Block)
Текущий объект WP_Block{}.

Примеры

#1 Добавить CSS-класс всем блокам «Абзац»

Используем WP_HTML_Tag_Processor{}, чтобы добавить класс к тегу <p>, сохранив остальные атрибуты.

add_filter( 'render_block_core/paragraph', 'my_add_paragraph_class' );

function my_add_paragraph_class( $block_content ) {

	$processor = new WP_HTML_Tag_Processor( $block_content );

	if ( $processor->next_tag( 'P' ) ) {
		$processor->add_class( 'custom-paragraph' );
	}

	return $processor->get_updated_html();
}

#2 Добавить обёртку изображению с определённым размером

Проверим атрибут sizeSlug и обернём изображения размера large в дополнительный контейнер.

add_filter( 'render_block_core/image', 'my_wrap_large_image', 20, 2 );

function my_wrap_large_image( $block_content, $block ) {

	if ( '' === trim( $block_content ) ) {
		return $block_content;
	}

	if ( 'large' !== ( $block['attrs']['sizeSlug'] ?? '' ) ) {
		return $block_content;
	}

	return '<div class="large-image-wrapper">' . $block_content . '</div>';
}

Проверять $block['blockName'] здесь не нужно: обработчик вызывается только для core/image.

Список изменений

С версии 5.7.0 Введена.
С версии 5.9.0 The $instance parameter was added.

Где вызывается хук

WP_Block::render()
render_block_(name)
wp-includes/class-wp-block.php 732
$block_content = apply_filters( "render_block_{$this->name}", $block_content, $this->parsed_block, $this );

Где используется хук в WordPress

wp-includes/block-supports/block-style-variations.php 268
add_filter( 'render_block_data', 'wp_render_block_style_variation_support_styles', 10, 2 );
wp-includes/block-supports/custom-css.php 154
add_filter( 'render_block_data', 'wp_render_custom_css_support_styles', 10, 1 );
wp-includes/block-supports/duotone.php 45
add_filter( 'render_block_core/image', array( 'WP_Duotone', 'restore_image_outer_container' ), 10, 1 );
wp-includes/block-supports/elements.php 308
add_filter( 'render_block_data', 'wp_render_elements_support_styles', 10, 1 );
wp-includes/block-supports/layout.php 1441
add_filter( 'render_block_data', 'wp_add_parent_layout_to_parsed_block', 10, 3 );
wp-includes/block-supports/layout.php 1522
add_filter( 'render_block_core/group', 'wp_restore_group_inner_container', 10, 2 );
wp-includes/block-supports/layout.php 1586
add_filter( 'render_block_core/image', 'wp_restore_image_outer_container', 10, 2 );
wp-includes/blocks/comment-template.php 44
add_filter( 'render_block_context', $filter_block_context, 1 );
wp-includes/blocks/comment-template.php 52
remove_filter( 'render_block_context', $filter_block_context, 1 );
wp-includes/blocks/details.php 37
add_filter( 'render_block_core/details', 'block_core_details_set_img_fetchpriority_low', 10, 2 );
wp-includes/blocks/gallery.php 35
add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility' );
wp-includes/blocks/gallery.php 53
add_filter( 'render_block_context', 'block_core_gallery_render_context', 10, 2 );
wp-includes/blocks/image.php 120
add_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15, 3 );
wp-includes/blocks/image.php 125
remove_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15 );
wp-includes/blocks/latest-posts.php 316
add_filter( 'render_block_data', 'block_core_latest_posts_migrate_categories' );
wp-includes/blocks/navigation.php 1762
add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' );
wp-includes/blocks/paragraph.php 38
add_filter( 'render_block_core/paragraph', 'block_core_paragraph_add_class' );
wp-includes/blocks/post-template.php 123
add_filter( 'render_block_context', $filter_block_context, 1 );
wp-includes/blocks/post-template.php 127
remove_filter( 'render_block_context', $filter_block_context, 1 );
wp-includes/blocks/query.php 130
remove_filter( 'render_block_core/query', $render_query_callback );
wp-includes/blocks/query.php 137
add_filter( 'render_block_core/query', $render_query_callback, 10, 2 );
wp-includes/blocks/query.php 152
add_filter( 'render_block_data', 'block_core_query_disable_enhanced_pagination', 10, 1 );
wp-includes/blocks/tabs.php 70
add_filter( 'render_block_context', 'block_core_tabs_provide_context', 10, 2 );
wp-includes/blocks/term-template.php 101
remove_filter( 'render_block_context', $filter_block_context, 1 );
wp-includes/blocks/term-template.php 95
add_filter( 'render_block_context', $filter_block_context, 1 );
wp-includes/default-filters.php 776
add_filter( 'render_block_context', '_block_template_render_without_post_block_context' );