Blog
WordPress Dynamic Blocks meistern: PHP und JavaScript für interaktive Inhalte verbinden
Erfahren Sie, wie Sie dynamische WordPress-Blöcke erstellen, die sowohl PHP als auch JavaScript nutzen, um interaktive und datengesteuerte Inhaltserlebnisse für Ihre Benutzer zu schaffen.

Zusammenfassung
WordPress Dynamic Blocks bieten eine leistungsstarke Möglichkeit, Inhalte zu erstellen, die über statisches HTML hinausgehen und Echtzeit-Datenintegration sowie interaktive Elemente ermöglichen. Im Gegensatz zu statischen Blöcken rendern dynamische Blöcke ihre Ausgabe serverseitig mit PHP, wodurch sie aktuelle Informationen abrufen und anzeigen können. Dieser Artikel bietet eine praktische Anleitung zur Entwicklung Ihrer eigenen dynamischen Blöcke und behandelt die wesentlichen Konzepte der Blockregistrierung, serverseitigen Rendering-Callbacks und clientseitigen Attributbehandlung. Wir führen Sie durch ein Schritt-für-Schritt-Beispiel, das zeigt, wie Sie einen dynamischen Block erstellen, der die neuesten Beiträge anzeigt und eine Grundlage für komplexere interaktive Komponenten bietet.
WordPress Dynamic Blocks meistern: PHP und JavaScript für interaktive Inhalte verbinden
WordPress ist im Kern ein robustes Content-Management-System (CMS), das auf einer modularen PHP-Architektur und einer MySQL-Datenbank basiert. Seine Erweiterbarkeit ist eine Kernstärke, die hauptsächlich durch Themes und Plugins erreicht wird. Die Einführung von Gutenberg, dem Block-Editor, hat die Inhaltserstellung revolutioniert, indem eine modulare, JavaScript-gesteuerte Benutzeroberfläche eingeführt wurde. Während statische Gutenberg-Blöcke für strukturierte, unveränderliche Inhalte hervorragend geeignet sind, erfordern viele reale Szenarien Inhalte, die dynamisch, interaktiv und datengesteuert sind. Hier kommen dynamische Blöcke ins Spiel und bieten eine leistungsstarke Brücke zwischen der serverseitigen Logik von PHP und der clientseitigen Interaktivität von JavaScript.
Die Macht dynamischer Blöcke verstehen
Statische Blöcke, die Standardeinstellung in Gutenberg, generieren beim Speichern HTML auf der Client-Seite. Dieses HTML wird dann direkt im Beitragsinhalt gespeichert. Während dies für statische Inhalte effizient ist, hat dieser Ansatz Einschränkungen, wenn es um Daten geht, die sich häufig ändern oder serverseitige Verarbeitung erfordern. Dynamische Blöcke lösen dieses Problem, indem sie ihre Ausgabe serverseitig mit PHP rendern. Wenn ein Benutzer eine Seite mit einem dynamischen Block anzeigt, führt WordPress eine PHP-Funktion (den render_callback) aus, um den HTML-Code des Blocks im Handumdrehen zu generieren. Dies ermöglicht es dem Block, Echtzeitdaten aus der Datenbank abzurufen, mit anderen WordPress-Funktionalitäten zu interagieren und Informationen zu präsentieren, die immer aktuell sind.
Dieses serverseitige Rendering ist aus mehreren Gründen entscheidend:
- Echtzeitdaten: Anzeige der neuesten Beiträge, bevorstehenden Veranstaltungen, Aktienkurse oder anderer Daten, die sich häufig ändern.
- Komplexe Logik: Durchführung von Berechnungen, Abfragen benutzerdefinierter Beitragstypen oder Integration mit externen APIs, bevor die Ausgabe gerendert wird.
- Sicherheit: Bereinigung und Validierung von Daten, bevor sie angezeigt werden, insbesondere bei benutzergenerierten Inhalten oder externen Quellen.
- Leistung: Die Auslagerung komplexer Rendering-Aufgaben auf den Server kann manchmal die Client-seitige Leistung verbessern.
Die Anatomie eines dynamischen Blocks
Ein dynamischer Block wird, wie jeder andere Gutenberg-Block, durch seine Metadaten und seine JavaScript-Registrierung definiert. Sein einzigartiges Merkmal liegt jedoch im render_callback-Attribut, das bei der Registrierung angegeben wird. Diese Callback-Funktion ist für die Generierung der HTML-Ausgabe des Blocks auf dem Server verantwortlich.
Hier ist eine Aufschlüsselung der wichtigsten Komponenten:
- Blockregistrierung (JavaScript): Sie müssen Ihren Block immer noch mit
registerBlockType()in Ihrer JavaScript-Datei registrieren. Dies teilt Gutenberg mit, dass Ihr Block existiert und wie seine Attribute und die Benutzeroberfläche des Editors behandelt werden sollen. - Attribute: Dies sind die Datenfelder, die mit Ihrem Block verknüpft sind und im Beitragsinhalt gespeichert werden. Bei dynamischen Blöcken werden Attribute hauptsächlich zur Konfiguration des Blockverhaltens und der Einstellungen im Editor verwendet. Der tatsächlich angezeigte Inhalt wird vom
render_callbackgeneriert. render_callback(PHP): Dies ist das Herzstück eines dynamischen Blocks. Es handelt sich um eine PHP-Funktion, die die Attribute des Blocks als Argument erhält und den HTML-String zurückgibt, der im Frontend gerendert werden soll.- Editor-Oberfläche (JavaScript): Sie erstellen die Benutzeroberfläche des Blocks weiterhin innerhalb des Gutenberg-Editors mit React-Komponenten. Diese Benutzeroberfläche ermöglicht es Benutzern, die Attribute des Blocks zu konfigurieren und eine Vorschau (oft eine vereinfachte Darstellung) dessen zu sehen, wie die dynamischen Inhalte aussehen werden.
Schritt für Schritt: Erstellen eines dynamischen "Neueste Beiträge"-Blocks
Erstellen wir ein praktisches Beispiel: einen dynamischen Block, der eine Liste der neuesten Beiträge von Ihrer WordPress-Website anzeigt.
Voraussetzungen:
- Eine lokale WordPress-Entwicklungsumgebung.
- Grundkenntnisse in PHP und JavaScript.
- Ein Plugin oder Theme, zu dem Sie Ihren Blockcode hinzufügen werden.
Schritt 1: Richten Sie Ihr Block-Plugin/Theme ein
Wenn Sie kein benutzerdefiniertes Plugin oder Theme haben, erstellen Sie ein einfaches. In diesem Beispiel gehen wir davon aus, dass Sie dies zu einem Plugin hinzufügen.
Schritt 2: Registrieren Sie den Block (JavaScript)
In Ihrer JavaScript-Datei des Plugins (z. B. src/index.js) registrieren Sie den Block. Wir verwenden @wordpress/blocks und @wordpress/i18n für die Internationalisierung.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Importieren Sie die Edit-Komponente Ihres Blocks
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {
title: __( 'Neueste Beiträge', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// Die save()-Funktion wird für dynamische Blöcke NICHT benötigt
// Der serverseitige render_callback übernimmt die Ausgabe
} );
Schritt 3: Erstellen Sie die Editor-Komponente (JavaScript)
Erstellen Sie nun die Datei src/edit.js. Diese Komponente definiert, wie der Block im Gutenberg-Editor aussieht und sich verhält.
// src/edit.js
import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ServerSideRender from '@wordpress/server-side-render';
export default function Edit( { attributes, setAttributes } ) {
const blockProps = useBlockProps();
const { numberOfPosts, showExcerpt } = attributes;
return (
<div { ...blockProps }>
<InspectorControls>
<PanelBody title={ __( 'Beitragseinstellungen', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Anzahl der Beiträge', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Auszug anzeigen', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Verwenden Sie ServerSideRender, um eine Vorschau des dynamischen Blocks anzuzeigen
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Beachten Sie, dass wir keine save()-Funktion definieren. Dies ist der entscheidende Unterschied bei dynamischen Blöcken. Die ServerSideRender-Komponente wird verwendet, um eine Vorschau der Blockausgabe direkt im Editor anzuzeigen, indem eine Anfrage an den Server gesendet wird.
Schritt 4: Skripte einbinden und serverseitiges Rendering registrieren (PHP)
In Ihrer Haupt-PHP-Datei des Plugins (z. B. my-dynamic-blocks.php) müssen Sie Ihre JavaScript-Datei einbinden und den Blocktyp registrieren, einschließlich des render_callback.
<?php
/**
* Plugin Name: My Dynamic Blocks
* Description: Ein einfaches Plugin für dynamische Gutenberg-Blöcke.
* Version: 1.0
* Author: Ihr Name
*/
function my_dynamic_blocks_register_block() {
// Registrieren Sie den Blocktyp
register_block_type( 'my-dynamic-blocks/recent-posts', array(
'editor_script' => 'my-dynamic-blocks-editor-script',
'render_callback' => 'my_dynamic_blocks_render_recent_posts',
'attributes' => array(
'numberOfPosts' => array(
'type' => 'number',
'default' => 5,
),
'showExcerpt' => array(
'type' => 'boolean',
'default' => true,
),
),
) );
}
add_action( 'init', 'my_dynamic_blocks_register_block' );
function my_dynamic_blocks_enqueue_editor_scripts() {
wp_enqueue_script(
'my-dynamic-blocks-editor-script',
plugins_url( 'build/index.js', __FILE__ ), // Geht davon aus, dass Sie einen Build-Prozess haben
array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-server-side-render' ),
filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
);
}
add_action( 'enqueue_block_editor_assets', 'my_dynamic_blocks_enqueue_editor_scripts' );
/**
* Render-Callback für den dynamischen Block "Neueste Beiträge".
*
* @param array $attributes Blockattribute.
* @return string HTML-Ausgabe.
*/
function my_dynamic_blocks_render_recent_posts( $attributes ) {
$number_of_posts = isset( $attributes['numberOfPosts'] ) ? (int) $attributes['numberOfPosts'] : 5;
$show_excerpt = isset( $attributes['showExcerpt'] ) ? (bool) $attributes['showExcerpt'] : true;
$args = array(
'posts_per_page' => $number_of_posts,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
);
$recent_posts_query = new WP_Query( $args );
$output = '';
if ( $recent_posts_query->have_posts() ) {
$output .= '<ul class="wp-block-my-dynamic-blocks-recent-posts">'; // Verwenden Sie eine Klasse für das Styling
while ( $recent_posts_query->have_posts() ) {
$recent_posts_query->the_post();
$output .= '<li>';
$output .= '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
if ( $show_excerpt ) {
$output .= '<p>' . get_the_excerpt() . '</p>';
}
$output .= '</li>';
}
$output .= '</ul>';
wp_reset_postdata(); // Wichtig: Beitragsdaten nach benutzerdefinierter Schleife zurücksetzen
} else {
$output = '<p>' . __( 'Keine Beiträge gefunden.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Erklärung des PHP-Codes:
my_dynamic_blocks_register_block(): Diese Funktion wird überinitaufgerufen, um unseren Blocktyp zu registrieren. Entscheidend ist, dass sie denrender_callbackalsmy_dynamic_blocks_render_recent_postsdefiniert und auch die Attribute des Blocks übergibt, was dem in JavaScript definierten entspricht.my_dynamic_blocks_enqueue_editor_scripts(): Diese Funktion wird überenqueue_block_editor_assetsaufgerufen, um unsere JavaScript-Datei speziell für den Editor zu laden. Sie enthältwp-server-side-renderals Abhängigkeit.my_dynamic_blocks_render_recent_posts(): Dies ist unserrender_callback. Er empfängt das$attributes-Array, bereinigt und wandelt es in die richtigen Typen um und verwendet dannWP_Query, um die neuesten Beiträge abzurufen. Er erstellt eine HTML-<ul>-Liste und gibt sie zurück.wp_reset_postdata()ist nach einer benutzerdefiniertenWP_Query-Schleife unerlässlich, um Konflikte mit der Haupt-WordPress-Abfrage zu vermeiden.
Schritt 5: Erstellen Sie Ihr JavaScript
Wenn Sie einen modernen JavaScript-Build-Prozess (wie @wordpress/scripts) verwenden, müssen Sie Ihre Assets erstellen. Führen Sie npm run build (oder yarn build) im Verzeichnis Ihres Plugins aus.
Schritt 6: Aktivieren und Testen
Aktivieren Sie Ihr Plugin. Wenn Sie nun den Block 'Neueste Beiträge' zu einem Beitrag oder einer Seite hinzufügen, sehen Sie die Benutzeroberfläche des Editors. Der Vorschau-Bereich zeigt die von Ihrem PHP-Callback gerenderte Ausgabe an. Wenn Sie den Beitrag veröffentlichen oder aktualisieren, wird derselbe PHP-Callback im Frontend ausgeführt, um die dynamischen Inhalte anzuzeigen.
Best Practices und Hinweise
- Sicherheit zuerst: Bereinigen und validieren Sie immer alle Daten, die von Attributen oder externen Quellen stammen, bevor Sie sie in Ihrem
render_callbackverwenden. Verwenden Sie WordPress-Funktionen wieesc_html(),esc_url(),sanitize_text_field()usw. wp_reset_postdata(): Wenn Ihrrender_callbackWP_Queryverwendet oder das globale$post-Objekt modifiziert, rufen Sie immerwp_reset_postdata()danach auf, um die ursprüngliche Abfrage und die Beitragsdaten wiederherzustellen.- Leistungsüberlegungen: Obwohl dynamische Blöcke leistungsstark sind, können übermäßige oder komplexe serverseitige Renderings die Ladezeiten von Seiten beeinträchtigen. Optimieren Sie Ihre Abfragen und Rendering-Logik. Erwägen Sie Caching-Mechanismen, wenn die Leistung zum Problem wird.
- Editor-Vorschau: Die
ServerSideRender-Komponente bietet eine gute Vorschau, sie erfordert jedoch eine Serveranfrage. Bei sehr komplexen Blöcken ist dies möglicherweise nicht sofort möglich. Stellen Sie sicher, dass Ihrrender_callbackeffizient ist. - Attributbehandlung: Attribute dienen hauptsächlich der Konfiguration des Blocks im Editor. Der
render_callbackist für das Abrufen und Anzeigen der eigentlichen dynamischen Inhalte verantwortlich. Vermeiden Sie es, große Mengen dynamischer Daten direkt in Attributen zu speichern. - Namenskonventionen: Verwenden Sie eindeutige Präfixe für Ihre Blocknamen (z. B.
mein-plugin-slug/block-name) und PHP-Funktionsnamen, um Konflikte mit anderen Plugins oder Themes zu vermeiden. - Internationalisierung: Verwenden Sie
__()und_n()für übersetzbare Zeichenfolgen sowohl in Ihrem JavaScript- als auch in Ihrem PHP-Code.
Jenseits von "Neueste Beiträge": Erweiterung der Fähigkeiten dynamischer Blöcke
Das Beispiel "Neueste Beiträge" ist nur die Spitze des Eisbergs. Sie können dynamische Blöcke für Folgendes verwenden:
- Anzeige benutzerdefinierter Beitragstypen: Präsentation von Produkten, Portfolioelementen oder Veranstaltungen.
- Benutzerspezifische Inhalte: Anzeige von Inhalten, die für den angemeldeten Benutzer relevant sind.
- Interaktive Formulare: Während komplexe Formulare möglicherweise immer noch von dedizierten Plugins profitieren, können einfache dynamische Formulare erstellt werden.
- Datenvisualisierung: Abrufen von Daten aus einer API und Rendern von Diagrammen oder Grafiken (obwohl dies oft fortgeschrittenere JavaScript-Bibliotheken erfordert).
- Integration mit anderen Plugins: Dynamische Anzeige von Daten, die von anderen Plugins verwaltet werden.
Fazit
Dynamische WordPress-Blöcke sind ein unverzichtbares Werkzeug für Entwickler, die wirklich interaktive und datengesteuerte Erlebnisse innerhalb des Gutenberg-Editors erstellen möchten. Durch das Verständnis, wie Blöcke mit render_callback-Funktionen registriert und Attribute effektiv verwaltet werden, können Sie leistungsstarke Komponenten erstellen, die Echtzeitinformationen abrufen und anzeigen. Während statische Blöcke ihren Zweck für strukturierte Inhalte erfüllen, erschließen dynamische Blöcke eine neue Ebene der Funktionalität und ermöglichen es Ihnen, die Lücke zwischen serverseitiger Logik und Frontend-Darstellung zu schließen. Durch die Einhaltung von Best Practices für Sicherheit, Leistung und Codeorganisation können Sie zuversichtlich robuste und nützliche dynamische Blöcke entwickeln, die Ihre WordPress-Websites verbessern.
Sources (5)
- WordPress Architecture: A Complete Guide - Liquid Web
- Explaining WordPress Hooks with Actions and Filters - Hey Reliable
- WordPress Hooks, Actions, and Filters: What They Do and How They Work
- Getting Started with Gutenberg: WordPress Block Development Essentials
- Gutenberg Block Development Step by Step Guide - White Label IQ