parse_blocks( string $content ): array[]

Parses blocks out of a content string.

Description

Given an HTML document, this function fully-parses block content, producing a tree of blocks and their contents, as well as top-level non-block content, which will appear as a block with no blockName.

This function can be memory heavy for certain documents, particularly those with deeply-nested blocks or blocks with extensive attribute values. Further, this function must parse an entire document in one atomic operation.

If the entire parsed document is not necessary, consider using WP_Block_Processor instead, as it provides a streaming and low-overhead interface for finding blocks.

Parameters

$contentstringrequired
Post content.

Return

array[] Array of block structures.
  • ...$0 array
    An associative array of a single parsed block object. See WP_Block_Parser_Block.
    • blockName string|null
      Name of block.
    • attrs array
      Attributes from block comment delimiters.
    • innerBlocks array[]
      List of inner blocks. An array of arrays that have the same structure as this one.
    • innerHTML string
      HTML from inside block comment delimiters.
    • innerContent array
      List of string fragments and null markers where inner blocks were found.

Source

function parse_blocks( $content ) {
	/**
	 * Filter to allow plugins to replace the server-side block parser.
	 *
	 * @since 5.0.0
	 *
	 * @param string $parser_class Name of block parser class.
	 */
	$parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' );

	$parser = new $parser_class();
	return $parser->parse( $content );
}

Hooks

apply_filters( ‘block_parser_class’, string $parser_class )

Filter to allow plugins to replace the server-side block parser.

Changelog

VersionDescription
5.0.0Introduced.

User Contributed Notes

  1. Skip to note 6 content

    Example using parse_blocks() to display a block from a post

    <?php
    function wpdocs_display_post_youtube_block() {
    
    	global $post;
    	
    	$blocks = parse_blocks( $post->post_content );
    	
    	foreach ( $blocks as $block ) {
    
    		// YouTube's block name
    		if ( 'core-embed/youtube' === $block['blockName'] ) {
    			
    			echo apply_filters( 'the_content', render_block( $block ) );
    			
    			break;
    			
    		}
    		
    	}
    	
    }
    
    ?>

    Place within The Loop

    <?php
    // Add within the loop
    
    // Check if the YouTube block is used in the post using the blockName
    if ( has_block( 'core-embed/youtube' ) ) {
     
    	// Display the YouTube block from the post
    	wpdocs_display_post_youtube_block();
     
    }
    
    ?>

    If used in The Loop it renders the first YouTube video embedded within a post. Can be used with other blocks by assigning their blockName.

  2. Skip to note 8 content

    Example of returned array for a Paragraph block:

    array ( 
    	0 => array ( 
    		'blockName' => 'core/paragraph', 
    		'attrs' => array ( 
    			'textColor' => 'vivid-red', 
    			'backgroundColor' => 'luminous-vivid-amber',
    		), 
    		'innerBlocks' => array (
    			/* Child blocks if they exists (used in Column Block for example) */
    		), 
    		'innerHTML' => 'This is a block content!', 
    		'innerContent' => array (
    			0 => 'This is a block content!',
    		), 
    	),
    )
  3. Skip to note 9 content

    As of Gutenberg 7.7, for this input:

    <!-- wp:paragraph {
        "placeholder":"Summary",
        "textColor":"accent",
        "backgroundColor":"secondary"
    } -->
    <p class="has-text-color has-background has-accent-color has-secondary-background-color">
    This is a new paragraph.
    </p>
    <!-- /wp:paragraph -->

    the output of parse_blocks will be:

    Array
    (
      [0] => Array
        (
          [blockName] => core/paragraph
          [attrs] => Array
            (
              [placeholder] => Summary
              [textColor] => accent
              [backgroundColor] => secondary
            )
          [innerBlocks] => Array()
          [innerHTML] => <p class="has-text-color has-background has-accent-color has-secondary-background-color">This is a new paragraph.</p>
          [innerContent] => Array
            (
              [0] => <p class="has-text-color has-background has-accent-color has-secondary-background-color">This is a new paragraph.</p>
            )
          )
    )
  4. Skip to note 10 content

    In case you wish to check if current post content is Gutenberg-blocks or using Classic editor:

        global $post;
        $blocks = parse_blocks( $post->post_content );
        $is_gutenberg_page = ( ! empty( $blocks ) && '' !== $blocks[0]['blockName'] );

    If post content is Classic Editor, it has only one block, but blockName is empty.

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