Verifique o que os blocos de Gutenberg estão em post_content

19

Estou trabalhando em um design com estilo diferente se um determinado bloco de Gutenberg estiver presente em uma página. Em outras palavras, se o primeiro bloco for um bloco personalizado do Gutenberg, o post_title será renderizado em outro lugar devido às escolhas de design feitas.

Existe alguma função no WordPress para obter uma lista de todos os blocos de Gutenberg presentes no post_content?

Jeffrey von Grumbkow
fonte

Respostas:

27

WordPress 5.0+ tem uma função para isso: parse_blocks(). Para ver se o primeiro bloco na postagem é o bloco Título, faça o seguinte:

$post = get_post(); 

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

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
Jacob Peattie
fonte
Obrigado! Não consegui encontrar esta função. Curiosamente, meu código personalizado faz basicamente a mesma coisa, mas com muito menos código! De qualquer forma, marcado como aceito, pois é a função interna adequada.
Jeffrey von Grumbkow
3
Esta função foi descontinuada (mas renomeada apenas); você deve usar has_blocks($blockName): github.com/WordPress/gutenberg/pull/8631/commits/… . Há também has_block()(sem "s").
Nico Prat
@NicoPrat nós atualizamos a resposta para refletir métodos corretos
Jeffrey von Grumbkow
Tenha em mente há um problema conhecido no momento em que parse_blocks()retorna blocos inexistentes como elementos da matriz NULL - core.trac.wordpress.org/ticket/45312
Lee
2

A solução que estou usando no momento da verificação verifica o post_content para os comentários em HTML do Gutenberg. Devido a futuras alterações de Gutenberg, isso pode não funcionar no 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
fonte
0

Desde o lançamento do 5.0, essas funções foram descontinuadas, com o Gutenberg agora integrado ao núcleo. Imagino, mas não confirmei que essas funções ainda existam no plug-in independente de Gutenberg.

Em vez de gutenberg_content_has_blocksusarhas_blocks

Em vez de gutenberg_parse_blocksusarparse_blocks

ian-hoyte
fonte
2
@JeffreyvonGrumbkow coisa é, ian-hoyte tem para baixo representante para editar ou comment =)
honk31