Controlla quali blocchi Gutenberg sono presenti nel post_content
Sto lavorando su un design che ha uno stile diverso se un determinato blocco Gutenberg è presente in una pagina. In altre parole, se il primo blocco è un blocco Gutenberg personalizzato, il post_title viene renderizzato altrove a causa delle scelte di design effettuate.
Esiste una funzione in WordPress per ottenere un elenco di tutti i blocchi Gutenberg presenti nel post_content?

WordPress 5.0+ ha una funzione per questo: parse_blocks()
. Per verificare se il primo blocco nel post è un blocco Heading, dovresti fare così:
$post = get_post();
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
if ( $blocks[0]['blockName'] === 'core/heading' ) {
}
}

Grazie! Non riuscivo a trovare questa funzione. Curiosamente il mio codice personalizzato fa praticamente la stessa cosa ma con molto meno codice! Comunque, segnato come accettato dato che è la funzione integrata corretta.

Questa funzione è stata deprecata (ma solo rinominata), dovresti usare has_blocks($blockName)
invece: https://github.com/WordPress/gutenberg/pull/8631/commits/7e5efa2bcfa02c970a9bf0955e04a34a532157e7. C'è anche has_block()
(senza la "s").

@NicoPrat abbiamo aggiornato la risposta per riflettere i metodi corretti

Tieni presente che attualmente esiste un problema noto in cui parse_blocks()
restituisce blocchi inesistenti come elementi NULL dell'array - https://core.trac.wordpress.org/ticket/45312

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

La soluzione che sto utilizzando al momento della scrittura controlla il post_content per i commenti HTML di Gutenberg. A causa di futuri cambiamenti in Gutenberg, questo potrebbe non funzionare in futuro.
<?php
$post_content = get_the_content( get_the_ID() ); // Ottieni il post_content
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Ottieni tutte le corrispondenze tra le stringhe <!-- /wp: -->
// $blocks[1] contiene i nomi di tutti i blocchi presenti nel post_content
if ( in_array( 'heading', $blocks[1] ) ) {
// Il contenuto del post contiene un blocco wp:heading
}
else {
// Il contenuto del post non contiene un blocco wp:heading
}

A partire dalla versione 5.0 queste funzioni sono state deprecate con Gutenberg ora integrato nel core. Immagino, ma non ho confermato, che queste funzioni esistano ancora nel plugin standalone di Gutenberg.
Invece di gutenberg_content_has_blocks
usa has_blocks
Invece di gutenberg_parse_blocks
usa parse_blocks
