Comprueba qué bloques de Gutenberg hay en post_content

19

Estoy trabajando en un diseño que tiene un estilo diferente si un determinado bloque Gutenberg está presente en una página. En otras palabras, si el primer bloque es un bloque Gutenberg personalizado, el post_title se representa en otro lugar debido a las elecciones de diseño realizadas.

¿Hay alguna función en WordPress para obtener una lista de todos los bloques de Gutenberg presentes en el post_contenido?

Jeffrey von Grumbkow
fuente
Hay un sitio web whichblocks.com Cuando escribe una URL de página web, escanea la página y descubre qué bloques de gutenberg se utilizan en la página.
Teena Babu

Respuestas:

27

WordPress 5.0 o superior tiene una función para esto: parse_blocks(). Para ver si el primer bloque de la publicación es el bloque Encabezado, debe hacer esto:

$post = get_post(); 

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

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
Jacob Peattie
fuente
¡Gracias! No pude encontrar esta función. Curiosamente, mi código personalizado hace básicamente lo mismo, ¡pero con mucho menos código! De todos modos, marcado como aceptado ya que es la función incorporada adecuada.
Jeffrey von Grumbkow
3
Esta función ha quedado en desuso (pero solo se le ha cambiado el nombre), debe usar has_blocks($blockName)en su lugar: github.com/WordPress/gutenberg/pull/8631/commits/… . También hay has_block()(sin "s").
Nico Prat
@NicoPrat hemos actualizado la respuesta para reflejar los métodos correctos
Jeffrey von Grumbkow
Tenga en cuenta que hay un problema conocido en el momento en que parse_blocks()devuelve bloques inexistentes como elementos de matriz NULL - core.trac.wordpress.org/ticket/45312
Lee
2

La solución que estoy usando al momento de escribir verifique el post_content para los comentarios HTML de Gutenberg. Debido a los futuros cambios de Gutenberg, esto podría no funcionar en el futuro.

<?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
}
Jeffrey von Grumbkow
fuente
0

A partir del lanzamiento de 5.0, estas funciones han quedado en desuso con Gutenberg ahora integrado en el núcleo. Me imagino, pero no he confirmado que estas funciones todavía existen en el complemento independiente de Gutenberg.

En lugar de gutenberg_content_has_blocksusarhas_blocks

En lugar de gutenberg_parse_blocksusarparse_blocks

ian-hoyte
fuente
2
@JeffreyvonGrumbkow cosa es, Ian-Hoyte tiene que baja rep a editar o comentario =)
honk31