13

I'm working on a design that has different styling if a certain Gutenberg block is present on a page. In other words, if the first block is a custom built Gutenberg block, the post_title is rendered elsewhere due to design choices made.

Is there any function in WordPress to get a list of all Gutenberg blocks present in the post_content?

21

WordPress 5.0+ has a function for this: parse_blocks(). To see if the first block in the post is the Heading block, you'd do this:

$post = get_post(); 

if ( has_blocks( $post->post_content ) ) {
    $blocks = parse_blocks( $post->post_content );

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
  • Thanks! I couldn't find this function. Funnily enough my custom code does basically the same thing but with a whole lot less code! Anyhow, marked as accepted as it's the proper built-in function. – Jeffrey von Grumbkow Aug 2 '18 at 11:36
  • 2
    This function has been deprecated (but only renamed), you should use has_blocks($blockName) instead: github.com/WordPress/gutenberg/pull/8631/commits/…. There's also has_block() (without "s"). – Nico Prat Nov 12 '18 at 9:16
  • @NicoPrat we've updated the answer to reflect correct methods – Jeffrey von Grumbkow Dec 10 '18 at 15:24
  • Bear in mind there is a known issue at the moment where parse_blocks() returns non-existent blocks as NULL array elements - core.trac.wordpress.org/ticket/45312 – Lee Apr 18 at 13:34
1

The solution I'm using as of writing check the post_content for the Gutenberg HTML comments. Due to future Gutenberg changes this might not work in the future.

<?php    
$post_content = get_the_content( get_the_ID() ); // Get the post_content
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Get all matches in between <!-- /wp: --> strings

// $blocks[1] contains the names of all the blocks present in the post_content
if ( in_array( 'heading', $blocks[1] ) ) {
    // Post content contains a wp:heading block
}
else {
    // Post content does not contain a wp:heading block
}
0

As of the release of 5.0 these functions have been deprecated with Gutenberg now integrated into the core. I imagine, but have not confirmed that these functions still exist in the Gutenberg standalone plugin.

Instead of gutenberg_content_has_blocks use has_blocks

Instead of gutenberg_parse_blocks use parse_blocks

  • It would have been nice if you jsut editted the original answer that is still the correct one with just renamed methods. – Jeffrey von Grumbkow Dec 9 '18 at 16:32
  • 2
    @JeffreyvonGrumbkow thing is, ian-hoyte has to low rep to edit or comment =) – honk31 Mar 4 at 16:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.