render_block( array $parsed_block ): string

Renders a single block into a HTML string.

Parameters

$parsed_blockarrayrequired
A single parsed block object.

Return

string String of rendered HTML.

Source

function render_block( $parsed_block ) {
	global $post;
	$parent_block = null;

	/**
	 * Allows render_block() to be short-circuited, by returning a non-null value.
	 *
	 * @since 5.1.0
	 * @since 5.9.0 The `$parent_block` parameter was added.
	 *
	 * @param string|null   $pre_render   The pre-rendered content. Default null.
	 * @param array         $parsed_block The block being rendered.
	 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
	 */
	$pre_render = apply_filters( 'pre_render_block', null, $parsed_block, $parent_block );
	if ( ! is_null( $pre_render ) ) {
		return $pre_render;
	}

	$source_block = $parsed_block;

	/**
	 * Filters the block being rendered in render_block(), before it's processed.
	 *
	 * @since 5.1.0
	 * @since 5.9.0 The `$parent_block` parameter was added.
	 *
	 * @param array         $parsed_block The block being rendered.
	 * @param array         $source_block An un-modified copy of $parsed_block, as it appeared in the source content.
	 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
	 */
	$parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block, $parent_block );

	$context = array();

	if ( $post instanceof WP_Post ) {
		$context['postId'] = $post->ID;

		/*
		 * The `postType` context is largely unnecessary server-side, since the ID
		 * is usually sufficient on its own. That being said, since a block's
		 * manifest is expected to be shared between the server and the client,
		 * it should be included to consistently fulfill the expectation.
		 */
		$context['postType'] = $post->post_type;
	}

	/**
	 * Filters the default context provided to a rendered block.
	 *
	 * @since 5.5.0
	 * @since 5.9.0 The `$parent_block` parameter was added.
	 *
	 * @param array         $context      Default context.
	 * @param array         $parsed_block Block being rendered, filtered by `render_block_data`.
	 * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
	 */
	$context = apply_filters( 'render_block_context', $context, $parsed_block, $parent_block );

	$block = new WP_Block( $parsed_block, $context );

	return $block->render();
}

Hooks

apply_filters( ‘pre_render_block’, string|null $pre_render, array $parsed_block, WP_Block|null $parent_block )

Allows render_block() to be short-circuited, by returning a non-null value.

apply_filters( ‘render_block_context’, array $context, array $parsed_block, WP_Block|null $parent_block )

Filters the default context provided to a rendered block.

apply_filters( ‘render_block_data’, array $parsed_block, array $source_block, WP_Block|null $parent_block )

Filters the block being rendered in render_block() , before it’s processed.

Changelog

VersionDescription
5.0.0Introduced.

User Contributed Notes

  1. Skip to note 2 content

    If you are trying to render Gutenberg block code, you will need to use parse_blocks, then render_block on each result in the returned array, then use apply_filters( 'the_content', ... ) on the result, to then get the final block code.

    Here’s a generic example of what you might do to convert a YouTube URL into a wp-block-embed-youtube

    $youtube_video_url = 'https://www.youtube.com/watch?v=...';
    
    $youtube_embed_block = '<!-- wp:embed {"url":"'.$youtube_video_url.'","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"} -->
    <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio">
    <div class="wp-block-embed__wrapper">'.$youtube_video_url.'</div>
    </figure><!-- /wp:embed -->';
    
    $parsed_blocks = parse_blocks( $youtube_embed_block );
    
    if ( $parsed_blocks ) {
    	foreach ( $parsed_blocks as $block ) {
    		echo apply_filters( 'the_content', render_block( $block ) );
    	}
    }

You must log in before being able to contribute a note or feedback.