pre_render_block │ хук-фильтр │ WP 5.1.0

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

Фильтр вызывается в render_block(), а также при обработке вложенных блоков в WP_Block::render(). Подходит для статических и динамических блоков.

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

Для заменённого блока не вызываются render_callback и фильтры render_block_data, render_block_context, render_block и render_block_(name).

Также пропускается подключение ресурсов этого блока. Если подставляемому HTML нужны стили или скрипты, позаботьтесь об их подключении.

Для изменения готового HTML используйте render_block или render_block_(name).

Для изменения атрибутов перед рендерингом используйте render_block_data.

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

add_filter( 'pre_render_block', 'wp_kama_pre_render_block_filter', 10, 3 );

/**
 * Function for `pre_render_block` filter-hook.
 * 
 * @param string|null   $pre_render   The pre-rendered content.
 * @param array         $parsed_block An associative array of the block being rendered. See
 *                                    WP_Block_Parser_Block.
 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
 *
 * @return string|null
 */
function wp_kama_pre_render_block_filter( $pre_render, $parsed_block, $parent_block ){
	// filter...
	return $pre_render;
}
$pre_render(строка|null)

HTML, который нужно использовать вместо результата рендеринга.

  • null - продолжить обычный рендеринг.
  • Строка - заменить результат указанным HTML.
  • Пустая строка '' - убрать блок из вывода.

По умолчанию: null.

Если менять блок не нужно, возвращайте полученное $pre_render, чтобы сохранить результат предыдущих обработчиков.

WordPress проверяет значение строго на null: любое другое значение прерывает рендеринг. Для отключения вывода используйте '', а не false.

$parsed_block(массив)

Данные обрабатываемого блока после разбора разметки.

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

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

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

  • innerHTML(строка)
    HTML внутри блока без HTML вложенных блоков.

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

Объект родительского блока при обработке вложенного блока в WP_Block::render().

При вызове фильтра из render_block() всегда передаётся null.

Примеры

#1 Отключить вывод блока последних записей

Блок core/latest-posts не будет рендериться, поэтому его callback не выполнит запрос записей.

add_filter( 'pre_render_block', 'my_disable_latest_posts_block', 10, 2 );

function my_disable_latest_posts_block( $pre_render, $parsed_block ) {

	if ( null !== $pre_render ) {
		return $pre_render;
	}

	if ( 'core/latest-posts' === $parsed_block['blockName'] ) {
		return '';
	}

	return $pre_render;
}

#2 Заменить блок собственным HTML

В настройках блока «Абзац» укажем дополнительный CSS-класс current-year. При выводе заменим такой блок абзацем с текущим годом.

add_filter( 'pre_render_block', 'my_render_current_year', 10, 2 );

function my_render_current_year( $pre_render, $parsed_block ) {

	if ( null !== $pre_render || 'core/paragraph' !== $parsed_block['blockName'] ) {
		return $pre_render;
	}

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

	if ( ! in_array( 'current-year', $classes, true ) ) {
		return $pre_render;
	}

	return '<p class="current-year">' . esc_html( wp_date( 'Y' ) ) . '</p>';
}

Исходный HTML абзаца и его оформление полностью заменяются указанной разметкой.

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

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

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

render_block()
pre_render_block
WP_Block::render()
pre_render_block
wp-includes/blocks.php 2436
$pre_render = apply_filters( 'pre_render_block', null, $parsed_block, $parent_block );
wp-includes/class-wp-block.php 605
$pre_render = apply_filters( 'pre_render_block', null, $inner_block->parsed_block, $parent_block );

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

wp-includes/block-supports/settings.php 152
add_filter( 'pre_render_block', '_wp_add_block_level_preset_styles', 10, 2 );