Ü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?

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' ) {
    }
}

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
}

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


2
@ JeffreyvonGrumbkow Sache ist, Ian-Hoyte hat zu wenig rep zu bearbeiten oder zu kommentieren =)
Honk31
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.