Comprobar qué bloques de Gutenberg hay en post_content
Estoy trabajando en un diseño que tiene diferentes estilos si cierto bloque de Gutenberg está presente en una página. En otras palabras, si el primer bloque es un bloque de Gutenberg personalizado, el post_title se renderiza en otro lugar debido a decisiones de diseño.
¿Existe alguna función en WordPress para obtener una lista de todos los bloques de Gutenberg presentes en el post_content?

WordPress 5.0+ tiene una función para esto: parse_blocks()
. Para verificar si el primer bloque en la publicación es el bloque de Encabezado, harías esto:
$post = get_post();
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
if ( $blocks[0]['blockName'] === 'core/heading' ) {
}
}

¡Gracias! No podía encontrar esta función. Curiosamente, mi código personalizado hace básicamente lo mismo pero con mucho menos código. De cualquier forma, lo marco como aceptado ya que es la función incorporada correcta.

Esta función ha quedado obsoleta (solo se renombró), deberías usar has_blocks($blockName)
en su lugar: https://github.com/WordPress/gutenberg/pull/8631/commits/7e5efa2bcfa02c970a9bf0955e04a34a532157e7. También existe has_block()
(sin la "s").

@NicoPrat hemos actualizado la respuesta para reflejar los métodos correctos

Ten en cuenta que actualmente hay un problema conocido donde parse_blocks()
devuelve bloques no existentes como elementos NULL en el array - https://core.trac.wordpress.org/ticket/45312

https://developer.wordpress.org/reference/functions/parse_blocks/ :)

La solución que estoy utilizando al momento de escribir esto verifica los comentarios HTML de Gutenberg en el post_content. Debido a futuros cambios en Gutenberg, esto podría no funcionar en el futuro.
<?php
$post_content = get_the_content( get_the_ID() ); // Obtener el post_content
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Obtener todas las coincidencias entre las cadenas <!-- /wp: -->
// $blocks[1] contiene los nombres de todos los bloques presentes en el post_content
if ( in_array( 'heading', $blocks[1] ) ) {
// El contenido del post contiene un bloque wp:heading
}
else {
// El contenido del post no contiene un bloque wp:heading
}

A partir del lanzamiento de la versión 5.0, estas funciones han quedado obsoletas con la integración de Gutenberg en el núcleo. Imagino, aunque no lo he confirmado, que estas funciones todavía existen en el plugin independiente de Gutenberg.
En lugar de gutenberg_content_has_blocks
usa has_blocks
En lugar de gutenberg_parse_blocks
usa parse_blocks
