Überprüfen Sie, welche Gutenberg-Blöcke in post_content enthalten sind

17

Ich arbeite an einem Design, das ein anderes Design hat, wenn ein bestimmter Gutenberg-Block auf einer Seite vorhanden ist. Mit anderen Worten, wenn es sich bei dem ersten Block um einen benutzerdefinierten Gutenberg-Block handelt, wird der post_title aufgrund der getroffenen Entwurfsauswahl an einer anderen Stelle gerendert.

Gibt es eine Funktion in WordPress, um eine Liste aller im post_content vorhandenen Gutenberg-Blöcke zu erhalten?

Jeffrey von Grumbkow
quelle

Antworten:

25

Wordpress 5.0 und höher hat eine Funktion dafür: parse_blocks(). Um festzustellen, ob der erste Block im Beitrag der Überschriftenblock ist, gehen Sie wie folgt vor:

$post = get_post(); 

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

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
Jacob Peattie
quelle
Vielen Dank! Ich konnte diese Funktion nicht finden. Komischerweise macht mein benutzerdefinierter Code im Grunde das Gleiche, aber mit viel weniger Code! Wie auch immer, als akzeptiert markiert, da es die richtige eingebaute Funktion ist.
Jeffrey von Grumbkow
2
Diese Funktion ist veraltet (aber nur umbenannt). Verwenden Sie has_blocks($blockName)stattdessen: github.com/WordPress/gutenberg/pull/8631/commits/… . Es gibt auch has_block()(ohne "s").
Nico Prat
@NicoPrat wir haben die Antwort aktualisiert, um korrekte Methoden wiederzugeben
Jeffrey von Grumbkow
Bedenken Sie, dass es derzeit ein bekanntes Problem gibt, bei dem parse_blocks()nicht vorhandene Blöcke als NULL-Array-Elemente zurückgegeben werden - core.trac.wordpress.org/ticket/45312
Lee,
2

Die Lösung, die ich zum Schreiben verwende, prüfe den post_content für die Gutenberg-HTML-Kommentare. Aufgrund zukünftiger Gutenberg-Änderungen könnte dies in Zukunft nicht funktionieren.

<?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
quelle
0

Seit der Veröffentlichung von 5.0 sind diese Funktionen veraltet, und Gutenberg ist jetzt im Kern integriert. Ich stelle mir vor, habe aber nicht bestätigt, dass diese Funktionen im Gutenberg Standalone-Plugin noch vorhanden sind.

Anstatt zu gutenberg_content_has_blocksbenutzenhas_blocks

Anstatt zu gutenberg_parse_blocksbenutzenparse_blocks

Ian-Hoyte
quelle
2
@ JeffreyvonGrumbkow Sache ist, Ian-Hoyte hat zu wenig rep zu bearbeiten oder zu kommentieren =)
Honk31