Verifică ce blocuri Gutenberg sunt prezente în post_content
Lucrez la un design care are un stil diferit dacă un anumit bloc Gutenberg este prezent pe o pagină. Mai exact, dacă primul bloc este un bloc Gutenberg personalizat, post_title este randat în altă parte datorită deciziilor de design luate.
Există vreo funcție în WordPress pentru a obține o listă cu toate blocurile Gutenberg prezente în post_content?

WordPress 5.0+ are o funcție pentru asta: parse_blocks()
. Pentru a verifica dacă primul bloc din articol este blocul Heading (Titlu), ai putea face astfel:
$post = get_post();
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
if ( $blocks[0]['blockName'] === 'core/heading' ) {
}
}

Mulțumesc! Nu am putut găsi această funcție. În mod amuzant, codul meu personal face practic același lucru dar cu mult mai puțin cod! Oricum, marcat ca acceptat deoarece este funcția corectă integrată.

Această funcție a fost învechită (dar doar redenumită), ar trebui să folosești has_blocks($blockName)
în loc: https://github.com/WordPress/gutenberg/pull/8631/commits/7e5efa2bcfa02c970a9bf0955e04a34a532157e7. Există și has_block()
(fără "s").

Ține minte că în prezent există o problemă cunoscută în care parse_blocks()
returnează blocuri inexistente ca elemente NULL în array - https://core.trac.wordpress.org/ticket/45312

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

Soluția pe care o folosesc în momentul de față verifică post_content pentru comentariile HTML Gutenberg. Datorită modificărilor viitoare ale Gutenberg, acest lucru s-ar putea să nu mai funcționeze în viitor.
<?php
$post_content = get_the_content( get_the_ID() ); // Obține conținutul postului
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Obține toate potrivirile dintre șirurile <!-- /wp: -->
// $blocks[1] conține numele tuturor blocurilor prezente în post_content
if ( in_array( 'heading', $blocks[1] ) ) {
// Conținutul postului conține un bloc wp:heading
}
else {
// Conținutul postului nu conține un bloc wp:heading
}

Începând cu versiunea 5.0, aceste funcții au fost învechite, deoarece Gutenberg a fost integrat în nucleul WordPress. Presupun, dar nu am confirmat, că aceste funcții încă există în plugin-ul standalone Gutenberg.
În loc de gutenberg_content_has_blocks
folosiți has_blocks
În loc de gutenberg_parse_blocks
folosiți parse_blocks
