Blog

Jenseits von Basis-Blöcken: Eigene Gutenberg-Blöcke für erweiterte WordPress-Funktionalität erstellen

Schöpfen Sie das volle Potenzial des WordPress Block-Editors aus, indem Sie lernen, eigene benutzerdefinierte Gutenberg-Blöcke zu erstellen. Dieser Leitfaden bietet praktische Schritte, Codebeispiele und Best Practices zur Erweiterung der Funktionalität und des Designs Ihrer Website.

Zusammenfassung

Der WordPress Block-Editor, Gutenberg, hat die Inhaltserstellung mit seinem modularen Blocksystem revolutioniert. Während die Kernblöcke Vielseitigkeit bieten, sind benutzerdefinierte Blöcke für einzigartige Funktionalitäten und Branding unerlässlich. Dieser Artikel führt Sie durch den Prozess der Entwicklung eigener Gutenberg-Blöcke und behandelt wichtige Konzepte wie Blockregistrierung, Attribute und Rendering. Wir werden praktische Beispiele untersuchen, Best Practices für Codeorganisation und Sicherheit diskutieren und hervorheben, wie benutzerdefinierte Blöcke mit der Architektur und den Hooks von WordPress integriert werden. Durch die Beherrschung der Entwicklung benutzerdefinierter Blöcke können Sie die Fähigkeiten und die Benutzererfahrung Ihrer WordPress-Website erheblich verbessern.

Jenseits von Basis-Blöcken: Eigene Gutenberg-Blöcke für erweiterte WordPress-Funktionalität erstellen

Die Einführung des Gutenberg Block-Editors in WordPress 5.0 markierte einen bedeutenden Wandel in der Art und Weise, wie Inhalte erstellt und verwaltet werden. Gutenberg verabschiedete sich vom linearen Ansatz des klassischen Editors und führte ein modulares System ein, bei dem Inhalte aus einzelnen "Blöcken" aufgebaut werden. Während die Standardblöcke eine breite Palette gängiger Anforderungen abdecken, benötigen viele Websites einzigartige Funktionalitäten, spezifische Designelemente oder Integrationen, die über das sofort Verfügbare hinausgehen. Hier kommt die Entwicklung benutzerdefinierter Gutenberg-Blöcke ins Spiel, die eine leistungsstarke Möglichkeit bietet, die Fähigkeiten von WordPress zu erweitern und es genau an die Anforderungen Ihres Projekts anzupassen.

Die Entwicklung benutzerdefinierter Blöcke ermöglicht es Ihnen, wiederverwendbare Komponenten zu erstellen, die die Inhaltserstellung für Redakteure vereinfachen, die Markenkonsistenz gewährleisten und komplexe Funktionen direkt in der Editor-Oberfläche implementieren. Dieser Leitfaden führt Sie durch den Prozess, vom Verständnis der Grundlagen bis zur Implementierung von Best Practices für robuste und wartbare benutzerdefinierte Blöcke.

Die Architektur des Block-Editors verstehen

Bevor Sie mit der Entwicklung beginnen, ist es wichtig zu verstehen, wie Gutenberg und seine Blöcke im WordPress-Ökosystem funktionieren. WordPress selbst basiert auf einer modularen PHP- und MySQL-Architektur. Themes steuern die Darstellung, und Plugins fügen Funktionalität hinzu. Gutenberg als Kernfunktion von WordPress integriert sich nahtlos in diese Struktur. Es nutzt JavaScript (hauptsächlich React) für seine dynamische Bearbeitungserfahrung im Browser, während PHP die serverseitige Registrierung und das Rendering übernimmt.

Benutzerdefinierte Blöcke sind im Wesentlichen JavaScript-Komponenten, die bei WordPress registriert werden. Wenn ein Benutzer einen benutzerdefinierten Block zu einem Beitrag oder einer Seite hinzufügt, speichert Gutenberg dessen Konfiguration (Attribute) in der Datenbank. Beim Rendern des Beitrags im Frontend interpretiert WordPress diese Konfiguration mithilfe von PHP und gibt die entsprechende HTML-Ausgabe aus, wobei oft dieselbe JavaScript-Komponente oder eine separate PHP-Vorlage verwendet wird.

Die Kernkomponenten eines benutzerdefinierten Blocks

Jeder benutzerdefinierte Gutenberg-Block besteht im Wesentlichen aus mehreren Schlüsselkomponenten:

  1. Registrierung: Dies ist der Prozess, bei dem WordPress über Ihren neuen Block informiert wird. Er beinhaltet die Definition seines Namens, Titels, Icons und anderer Metadaten. Dies geschieht hauptsächlich mit der JavaScript-Funktion registerBlockType.
  2. Attribute: Dies sind die Datenfelder, die mit Ihrem Block verknüpft sind. Betrachten Sie sie als die Einstellungen oder Eigenschaften, die ein Benutzer für eine bestimmte Instanz des Blocks ändern kann (z. B. Textinhalt, Bild-URL, Farbauswahl). Attribute werden in der JavaScript-Registrierung des Blocks definiert.
  3. Edit-Funktion: Diese JavaScript-Funktion definiert, wie der Block im Gutenberg-Editor angezeigt wird und sich verhält. Hier erstellen Sie die interaktive Benutzeroberfläche, mit der Inhaltsersteller den Block konfigurieren können.
  4. Save-Funktion: Diese JavaScript-Funktion definiert das statische HTML-Markup, das in der Datenbank gespeichert und auf der Frontend-Seite Ihrer Website gerendert wird. Sie sollte den aktuellen Zustand der Blockattribute widerspiegeln.

Schritt für Schritt: Erstellen Sie Ihren ersten benutzerdefinierten Block

Erstellen wir einen einfachen benutzerdefinierten Block, der eine "Call to Action" (CTA) mit einer Überschrift und einem Button anzeigt. Dieses Beispiel konzentriert sich auf die wesentlichen JavaScript-Aspekte für die Blockregistrierung und -bearbeitung, wobei eine grundlegende WordPress-Entwicklungsumgebung als gegeben vorausgesetzt wird.

Voraussetzungen:

  • Eine lokale WordPress-Entwicklungsumgebung.
  • Grundkenntnisse in JavaScript, React und PHP.
  • Node.js und npm (oder yarn) installiert für die Asset-Kompilierung.

1. Projekt-Setup:

Benutzerdefinierte Blöcke werden typischerweise als Teil eines Plugins entwickelt. Erstellen Sie eine neue Plugin-Datei (z. B. mein-benutzerdefinierte-bloecke/mein-benutzerdefinierte-bloecke.php) und eine JavaScript-Datei für Ihren Block (z. B. src/index.js). Sie benötigen außerdem einen Build-Prozess zur Kompilierung Ihres JavaScript. Ein gängiger Ansatz ist die Verwendung von @wordpress/scripts, das eine bequeme Möglichkeit zur Handhabung der Kompilierung bietet.

Erstellen Sie in Ihrem Plugin-Stammverzeichnis eine package.json-Datei:

{
  "name": "mein-benutzerdefinierte-bloecke",
  "version": "1.0.0",
  "description": "Ein Plugin für benutzerdefinierte Gutenberg-Blöcke.",
  "main": "index.js",
  "scripts": {
    "build": "wp-scripts build",
    "start": "wp-scripts start"
  },
  "keywords": ["wordpress", "gutenberg", "block"],
  "author": "Ihr Name",
  "license": "GPL-2.0-or-later",
  "devDependencies": {
    "@wordpress/scripts": "^26.0.0" 
  }
}

Installieren Sie die Abhängigkeiten: npm install.

2. Block registrieren (JavaScript):

In Ihrer src/index.js-Datei verwenden Sie registerBlockType aus dem @wordpress/blocks-Paket.

import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';

// Komponenten für den Editor importieren
import { Edit } from './edit';
import { Save } from './save';

registerBlockType( 'mein-benutzerdefinierte-bloecke/cta', {
    title: __( 'Call to Action', 'mein-benutzerdefinierte-bloecke' ),
    icon: 'megaphone',
    category: 'widgets',
    attributes: {
        headline: {
            type: 'string',
            default: '',
        },
        buttonText: {
            type: 'string',
            default: 'Mehr erfahren',
        },
        buttonUrl: {
            type: 'string',
            default: '#',
        },
    },
    edit: Edit,
    save: Save,
} );

3. Editor-Oberfläche definieren (src/edit.js):

Diese Komponente steuert, wie der Block im Editor aussieht und funktioniert.

import { __ } from '@wordpress/i18n';
import { useBlockProps, RichText, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, TextControl } from '@wordpress/components';

export const Edit = ( { attributes, setAttributes } ) => {
    const blockProps = useBlockProps();

    const onChangeHeadline = ( newHeadline ) => {
        setAttributes( { headline: newHeadline } );
    };

    const onChangeButtonText = ( newButtonText ) => {
        setAttributes( { buttonText: newButtonText } );
    };

    const onChangeButtonUrl = ( newButtonUrl ) => {
        setAttributes( { buttonUrl: newButtonUrl } );
    };

    return (
        <>
            <InspectorControls>
                <PanelBody title={ __( 'Button-Einstellungen', 'mein-benutzerdefinierte-bloecke' ) }>
                    <TextControl
                        label={ __( 'Button-Text', 'mein-benutzerdefinierte-bloecke' ) }
                        value={ attributes.buttonText }
                        onChange={ onChangeButtonText }
                    />
                    <TextControl
                        label={ __( 'Button-URL', 'mein-benutzerdefinierte-bloecke' ) }
                        value={ attributes.buttonUrl }
                        onChange={ onChangeButtonUrl }
                    />
                </PanelBody>
            </InspectorControls>
            <div { ...blockProps }>
                <RichText
                    tagName="h3"
                    placeholder={ __( 'Geben Sie hier Ihre Überschrift ein...', 'mein-benutzerdefinierte-bloecke' ) }
                    value={ attributes.headline }
                    onChange={ onChangeHeadline }
                    allowedFormats={ [ 'core/bold', 'core/italic' ] }
                />
                <a href={ attributes.buttonUrl } className="wp-element-button">
                    { attributes.buttonText }
                </a>
            </div>
        </>
    );
};

4. Save-Funktion definieren (src/save.js):

Diese Funktion bestimmt die HTML-Ausgabe für das Frontend.

import { useBlockProps, RichText } from '@wordpress/block-editor';

export const Save = ( { attributes } ) => {
    const blockProps = useBlockProps.save();

    return (
        <div { ...blockProps }>
            <RichText.Content
                tagName="h3"
                value={ attributes.headline }
            />
            <a href={ attributes.buttonUrl } className="wp-element-button">
                { attributes.buttonText }
            </a>
        </div>
    );
};

5. Block-Skript einbinden (PHP):

In Ihrer Haupt-Plugin-Datei (mein-benutzerdefinierte-bloecke.php) müssen Sie Ihre kompilierte JavaScript-Datei registrieren und einbinden.

<?php
/**
 * Plugin Name: Meine Benutzerdefinierten Blöcke
 * Description: Fügt benutzerdefinierte Gutenberg-Blöcke hinzu.
 * Version: 1.0
 * Author: Ihr Name
 */

function meine_benutzerdefinierten_bloecke_register_block() {
    // Lädt automatisch die Datei block.json und bindet das Skript ein.
    register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'meine_benutzerdefinierten_bloecke_register_block' );
?>

6. Assets erstellen:

Führen Sie npm run build in Ihrem Plugin-Verzeichnis aus. Dies kompiliert Ihr JavaScript in den Ordner build.

Aktivieren Sie nun das Plugin in WordPress. Sie sollten Ihren "Call to Action"-Block im Editor sehen können!

Best Practices für die Entwicklung benutzerdefinierter Blöcke

Die Entwicklung benutzerdefinierter Blöcke geht über die reine Funktionalität hinaus. Die Einhaltung von Best Practices stellt sicher, dass Ihre Blöcke sicher, performant, zugänglich und wartbar sind.

  • Namespacing: Verwenden Sie immer einen eindeutigen Namespace für Ihren Block (z. B. mein-benutzerdefinierte-bloecke/cta). Dies verhindert Konflikte mit anderen Blöcken. Die Funktion registerBlockType kümmert sich darum.
  • Code-Organisation: Halten Sie Ihren JavaScript- und PHP-Code sauber und gut organisiert. Bei komplexen Blöcken sollten Sie erwägen, Ihr JavaScript in kleinere, wiederverwendbare Komponenten aufzuteilen.
  • Sicherheit:
    • Bereinigung (Sanitization): Bereinigen Sie beim Speichern von Daten in der Datenbank (insbesondere benutzergenerierte Inhalte) immer diese. WordPress bietet Funktionen wie sanitize_text_field, esc_url usw.
    • Escaping: Geben Sie Daten beim Ausgeben an den Browser immer aus, um Cross-Site-Scripting (XSS)-Angriffe zu verhindern. Verwenden Sie Funktionen wie esc_html, esc_attr, esc_url.
    • Nonces: Verwenden Sie für alle AJAX-Anfragen oder Formularübermittlungen, die mit Ihrem Block zusammenhängen, Nonces, um zu überprüfen, ob die Anfrage von einer legitimen WordPress-Quelle stammt.
  • Internationalisierung (i18n): Verwenden Sie die Funktionen __() und _x() (aus @wordpress/i18n) für alle benutzersichtbaren Zeichenketten in Ihrem JavaScript. Dies macht Ihren Block übersetzbar.
  • Barrierefreiheit (Accessibility): Stellen Sie sicher, dass Ihr Block für alle nutzbar ist. Verwenden Sie semantisches HTML, fügen Sie bei Bedarf ARIA-Attribute hinzu und testen Sie mit Screenreadern.
  • Performance:
    • Lazy Loading: Implementieren Sie für Blöcke, die schwere Assets oder komplexe Daten laden, Lazy-Loading-Techniken.
    • Effizientes Rendering: Optimieren Sie Ihre save-Funktion und jedes serverseitige Rendering, um so effizient wie möglich zu sein.
    • Asset-Einbindung: Binden Sie nur die notwendigen Skripte und Stile für Ihren Block ein. Verwenden Sie enqueue_block_style und enqueue_block_script_handle für blockspezifische Assets.
  • Modularität und Erweiterbarkeit: Nutzen Sie WordPress-Hooks (Aktionen und Filter) in Ihrem PHP, um anderen Plugins oder Themes die Änderung des Blockverhaltens oder der Ausgabe zu ermöglichen.
  • block.json: Verwenden Sie für komplexere Blöcke eine block.json-Datei, um Blockmetadaten, Abhängigkeiten, Stile und Skript-Handles zu deklarieren. Dies ist der moderne Standard für die Blockentwicklung und vereinfacht die Asset-Verwaltung.

Integration in die WordPress-Architektur

Benutzerdefinierte Blöcke sind keine isolierten Einheiten. Sie integrieren sich tief in die Kernarchitektur von WordPress:

  • Hooks: Sie können PHP-Aktionen und -Filter in Ihrem Plugin verwenden, um die Blockregistrierung zu ändern, bedingt benutzerdefinierte Stile oder Skripte hinzuzufügen oder sogar die gerenderte Ausgabe von Kernblöcken zu ändern. Sie könnten beispielsweise den Filter block_type_metadata_settings verwenden, um die Einstellungen eines registrierten Blocks zu ändern.
  • Theme-Integration: Blockbasierte Themes und Full Site Editing (FSE) sind stark auf Blöcke angewiesen. Benutzerdefinierte Blöcke können so gestaltet werden, dass sie sich nahtlos in FSE-Vorlagen einfügen, sodass Benutzer ganze Websites mit einem konsistenten blockbasierten Workflow erstellen können.
  • Plugin-Interoperabilität: Ihre benutzerdefinierten Blöcke können mit anderen Plugins interagieren. Beispielsweise könnte ein benutzerdefinierter Produktblock Daten aus einem E-Commerce-Plugin abrufen, oder ein benutzerdefinierter Galerieblock könnte sich in ein bestimmtes Mediathek-Plugin integrieren.

Fortgeschrittene Konzepte und Überlegungen

  • Serverseitiges Rendering (SSR): Für Blöcke, die dynamische Daten oder komplexe Logik erfordern, die am besten auf dem Server behandelt wird, können Sie serverseitiges Rendering implementieren. Dies beinhaltet die Definition einer render_callback-Funktion in Ihrem PHP bei der Registrierung des Blocks.
  • Dynamische Blöcke: Blöcke, die SSR verwenden, werden oft als dynamische Blöcke bezeichnet. Sie speichern keine statische HTML in der Datenbank; stattdessen speichern sie nur ihre Attribute, und der render_callback generiert die HTML bei jedem Seitenaufruf.
  • Blockstile: Sie können benutzerdefinierte Stile für Ihre Blöcke definieren, die Benutzer im Editor auswählen können.
  • Blockvarianten: Erstellen Sie Varianten eines Basisblocks, um vorkonfigurierte Versionen mit unterschiedlichen Standardeinstellungen oder Erscheinungsbildern anzubieten.
  • Unterschiede zwischen Editor und Frontend: Beachten Sie, dass die edit- und save-Funktionen möglicherweise unterschiedliche Szenarien behandeln müssen. Die edit-Funktion ist für die interaktive Editor-Erfahrung gedacht, während die save-Funktion für die statische HTML-Ausgabe bestimmt ist. Manchmal benötigen Sie einen separaten render_callback für das dynamische Frontend-Rendering.

Fazit

Die Entwicklung benutzerdefinierter Gutenberg-Blöcke ist eine leistungsstarke Fähigkeit, die ein neues Maß an Anpassung und Funktionalität für WordPress-Websites eröffnet. Durch das Verständnis der Kernkomponenten – Registrierung, Attribute, Edit- und Save-Funktionen – und die Einhaltung von Best Practices für Sicherheit, Leistung und Barrierefreiheit können Sie robuste, wiederverwendbare und benutzerfreundliche Blöcke erstellen. Egal, ob Sie ein benutzerdefiniertes Plugin für einen Kunden erstellen oder Ihre eigene Website erweitern, die Beherrschung benutzerdefinierter Blöcke wird Ihre WordPress-Entwicklungsfähigkeiten erheblich verbessern und es Ihnen ermöglichen, über die Standardangebote hinauszugehen und wirklich einzigartige digitale Erlebnisse zu schaffen.

Sources (5)