Gutenberg: Galerie-Block mit Beschreibung

Der Gutenberg-Editor ist eine feine Sache. Die Bedienung ist im Prinzip sehr einfach. Aber insgesamt fehlt es ihm noch an ein paar mehr Möglichkeiten. Beim Galerie-Block kann man lediglich eine Beschriftung (eng. Caption) hinterlegen, die dann im Frontend ausgegeben wird. Manchmal benötigt man aber vielleicht auch die anderen Felder wie Titel, Alt oder Beschreibung. Es gibt standardmäßig keine Möglichkeit, an diese Felder ranzukommen, also muss man ziemlich kreativ werden. Mit folgendem Skript schafft man es, das Beschreibungs-Feld vom Bild auszugeben:

function foo_block_render( $attributes, $content ) {
    $content = str_replace(
        array('</figcaption>'),
        array('<div class="description">xxreplacexx</div></figcaption>'),
        $content
    );
    $num = 0;
    while(strpos($content, "xxreplacexx") !== false)
        $content = preg_replace("/xxreplacexx/",nl2br(get_post( $attributes["ids"][$num++] )->post_content),$content,1);

    return $content;
}
function foo_check_block() {
    register_block_type( 'core/gallery', array(
        'render_callback' => 'foo_block_render',
    ) );
}
add_action( 'init', 'foo_check_block' );

Im Grunde wird im Wesentlichen die $content Variable durchsucht. Sie liefert den HTML-Code für die Galerie aus. Die erste Funktion „foo_block_render“ sucht nach dem schließenden HTML5-Tag „</figcation>“ um davor per PHP-Funktion str_replace einen „<div>“ mit Platzhalter „xxreplacexx“ und der Klasse „description“ einzusetzen. Mit einer While-Schleife und preg_replace sucht man nun nach dem Platzhalter „xxreplacexx“ und ersetzt ihn durch die Vorkommnisse. Dabei liefert die Variable $num bei jedem Vorkommnis einen inkrementellen Wert zurück – sprich: 0, 1, 2, 3 usw. Diese Variable macht man sich nun zu nutze um einen Key im $attributes Array anzusprechen, dessen Eintrag die ID vom Bild enthält. Das ganze wird durch die WordPress-Funktion get_post umschlossen. Die Beschreibung findet sich in „post_content“. Wer nicht möchte, dass Zeilenumbrüche ausgegeben werden, kann nl2br weg lassen. Zum Schluss lässt man diese Funktion durch einen „render_callback“ nur für das Block-Element „core/gallery“ laufen. Neben post_content kommt man so auch noch an weitere Felder:

    [ID] => 758
    [post_author] => 1
    [post_date] => 2019-11-14 13:53:45
    [post_date_gmt] => 2019-11-14 12:53:45
    [post_content] => meine Beschreibung
    [post_title] => 
    [post_excerpt] => der Name vom Bild
    [post_status] => inherit
    [comment_status] => open
    [ping_status] => closed
    [post_password] => 
    [post_name] => der-name-vom-bild
    [to_ping] => 
    [pinged] => 
    [post_modified] => 2019-11-14 15:12:39
    [post_modified_gmt] => 2019-11-14 14:12:39
    [post_content_filtered] => 
    [post_parent] => 754
    [guid] => http://…image.jpg
    [menu_order] => 0
    [post_type] => attachment
    [post_mime_type] => image/jpeg
    [comment_count] => 0
    [filter] => raw

Achtung: in der Form klappt es nur, wenn man eine Beschriftung hinterlegt hat, da erst dadurch WordPress das <figcaption> Element erzeugt. Und nach diesem suchen wir ja. Möchte man trotzdem die Werte ausgeben, muss man sich einen anderen eindeutigen String im HTML-Code suchen, den man durch seinen eigenen ersetzt.