render_block │ хук-фильтр │ WP 5.0.0

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

Фильтр вызывается в WP_Block::render() для статических и динамических блоков, включая вложенные. У динамического блока к этому моменту уже выполнен render_callback.

После него вызывается фильтр render_block_(name) для конкретного типа блока. Изменения затрагивают вывод, но не сохранённый контент записи.

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

Для изменения одного типа блоков удобнее использовать render_block_(name), например render_block_core/image.

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

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

add_filter( 'render_block', 'wp_kama_render_block_filter', 10, 3 );

/**
 * Function for `render_block` 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_filter( $block_content, $block, $instance ){
	// filter...
	return $block_content;
}
$block_content(строка)

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

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

$block(массив)

Данные обрабатываемого блока.

  • blockName(строка|null)
    Полное имя блока, например core/image. Для свободного HTML вне блоков может быть null.

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

  • innerBlocks(массив массивов)
    Вложенные блоки. Каждый элемент имеет такую же структуру, как $block.

  • innerHTML(строка)
    HTML из разобранной разметки блока без HTML вложенных блоков. Это не готовый результат рендеринга.

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

Примеры

#1 Добавить класс абзацам и заголовкам

Добавим класс article-text к первому HTML-тегу блоков core/paragraph и core/heading.

add_filter( 'render_block', 'my_add_text_block_class', 10, 2 );

function my_add_text_block_class( $block_content, $block ) {

	if ( ! in_array( $block['blockName'], [ 'core/paragraph', 'core/heading' ], true ) ) {
		return $block_content;
	}

	$processor = new WP_HTML_Tag_Processor( $block_content );

	if ( $processor->next_tag() ) {
		$processor->add_class( 'article-text' );
	}

	return $processor->get_updated_html();
}

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

В дополнительных настройках нужного блока укажем CSS-класс needs-wrapper. При выводе обернём такой блок в контейнер.

add_filter( 'render_block', 'my_wrap_marked_block', 10, 2 );

function my_wrap_marked_block( $block_content, $block ) {
	if ( ! $block_content ) {
		return $block_content;
	}

	$classes = preg_split( '/\s+/', $block['attrs']['className'] ?? '' );

	if ( ! in_array( 'needs-wrapper', $classes, true ) ) {
		return $block_content;
	}

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

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

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

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

WP_Block::render()
render_block
wp-includes/class-wp-block.php 717
$block_content = apply_filters( 'render_block', $block_content, $this->parsed_block, $this );

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

wp-includes/block-supports/background.php 131
add_filter( 'render_block', 'wp_render_background_support', 10, 2 );
wp-includes/block-supports/block-style-variations.php 269
add_filter( 'render_block', 'wp_render_block_style_variation_class_name', 10, 2 );
wp-includes/block-supports/block-visibility.php 132
add_filter( 'render_block', 'wp_render_block_visibility_support', 10, 2 );
wp-includes/block-supports/custom-css.php 153
add_filter( 'render_block', 'wp_render_custom_css_class_name', 10, 2 );
wp-includes/block-supports/dimensions.php 187
add_filter( 'render_block', 'wp_render_dimensions_support', 10, 2 );
wp-includes/block-supports/duotone.php 44
add_filter( 'render_block', array( 'WP_Duotone', 'render_duotone_support' ), 10, 3 );
wp-includes/block-supports/elements.php 307
add_filter( 'render_block', 'wp_render_elements_class_name', 10, 2 );
wp-includes/block-supports/layout.php 1450
add_filter( 'render_block', 'wp_render_layout_support_flag', 10, 2 );
wp-includes/block-supports/position.php 151
add_filter( 'render_block', 'wp_render_position_support', 10, 2 );
wp-includes/block-supports/settings.php 151
add_filter( 'render_block', '_wp_add_block_level_presets_class', 10, 2 );
wp-includes/block-supports/states.php 749
add_filter( 'render_block', 'wp_render_block_states_support', 10, 2 );
wp-includes/blocks/navigation.php 1726
add_filter( 'render_block', 'block_core_navigation_add_support_classes_to_container', 11, 2 );
wp-includes/default-filters.php 788
add_filter( 'render_block', 'wp_render_typography_support', 10, 2 );
wp-includes/default-filters.php 791
add_filter( 'render_block', 'wp_strip_inline_note_markers' );
wp-includes/script-loader.php 3456
add_filter( 'render_block', $callback_separate, 10, 2 );