Sprawdź, jakie są bloki Gutenberga w post_content

20

Pracuję nad projektem, który ma inną stylizację, jeśli jakiś blok Gutenberga jest obecny na stronie. Innymi słowy, jeśli pierwszy blok jest niestandardowo zbudowanym blokiem Gutenberga, post_title jest renderowany w innym miejscu ze względu na dokonane wybory projektowe.

Czy w WordPress jest jakaś funkcja, aby uzyskać listę wszystkich bloków Gutenberga obecnych w post_content?

Jeffrey von Grumbkow
źródło
1
Istnieje strona internetowa whatblocks.com Po wpisaniu adresu URL strony skanuje stronę i sprawdza, które bloki Gutenberga są używane na stronie.
Teena Babu

Odpowiedzi:

29

WordPress 5.0 + posiada funkcję to: parse_blocks(). Aby sprawdzić, czy pierwszy blok w poście to blok Nagłówek, wykonaj następujące czynności:

$post = get_post(); 

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

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
Jacob Peattie
źródło
Dzięki! Nie mogłem znaleźć tej funkcji. Co zabawne, mój niestandardowy kod robi w zasadzie to samo, ale z dużo mniejszym kodem! W każdym razie oznaczony jako zaakceptowany, ponieważ jest to właściwa wbudowana funkcja.
Jeffrey von Grumbkow
3
Ta funkcja została uznana za przestarzałą (ale zmieniono tylko jej nazwę). has_blocks($blockName)Zamiast tego należy użyć : github.com/WordPress/gutenberg/pull/8631/commits/… . Jest też has_block()(bez „s”).
Nico Prat,
@NicoPrat zaktualizowaliśmy odpowiedź, aby odzwierciedlić prawidłowe metody
Jeffrey von Grumbkow,
Należy pamiętać, że w chwili, gdy parse_blocks()zwracane są nieistniejące bloki jako elementy tablicy NULL, znany jest problem - core.trac.wordpress.org/ticket/45312
Lee,
2

Rozwiązanie, którego używam w chwili pisania, sprawdź komentarze post_content w komentarzach HTML Gutenberga. Ze względu na przyszłe zmiany Gutenberga może to nie działać w przyszłości.

<?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
źródło
0

Począwszy od wydania 5.0, funkcje te zostały wycofane z Gutenberga zintegrowanego z rdzeniem. Wyobrażam sobie, ale nie potwierdziłem, że te funkcje nadal istnieją w samodzielnej wtyczce Gutenberga.

Zamiast gutenberg_content_has_blocksużywaćhas_blocks

Zamiast gutenberg_parse_blocksużywaćparse_blocks

ian-hoyte
źródło
2
@JeffreyvonGrumbkow chodzi o to, że ian-hoyte ma niską liczbę głosów, aby edytować lub komentować =)
honk31