Eigenen WordPress Block entwickeln – Teil 1: Einstieg in die Programmierung mit Gutenberg
In dieser Artikelserie zeige ich, wie du von Grund auf deinen eigenen WordPress Block entwickeln kannst. Im ersten Teil geht es um den Aufbau und Architektur eines Gutenberg Block Plugins und die Vorstellung aller benötigter Tools für die Entwicklung in modernem JavaScript.
Image Card Block
Das Ziel der kompletten Reihe ist die Entwicklung eines Image Card Blocks für den neuen WordPress Gutenberg Editor. Es soll möglich sein, Bild, Titel und Text zu bestimmen und mit einigen Optionen das Layout, die Farben und das Design des Blocks anzupassen.
Zum Einstieg definieren wir erst einmal einige theoretische Grundlagen:
- Woraus besteht ein Block Plugin?
- Was ist React und JSX?
- Warum brauche ich Tools?
- Wozu ist Webpack, Babel und Sass da?
Aufbau eines Gutenberg Blocks
Als Erstes möchte ich einen Blick auf die Architektur eines Gutenberg Blocks werfen.
Für einen WordPress Block wird grundsätzlich nur eine JavaScript-Datei im Editor eingebunden. Die Einbindung der Block JS erfolgt wie in WordPress üblich mit wp_enqueue_script()
und sollte in einem WordPress Plugin (nicht Theme) erfolgen.
Ein sehr einfaches WordPress Block Plugin könnte aus nur vier Dateien bestehen:
-
Block JavaScript – block.js
Hier wird der Block mit der Funktion
registerBlockType()
erstellt und programmiert. Vom Block-Interface im Editor, HTML-Markup im Frontend bis hin zu den Block-Optionen findet alles hier in JavaScript und React statt. In den restlichen Tutorials dieser Artikelreihe werden wir uns ausführlich diesem Teil der Block Entwicklung widmen. -
Block Stylesheet – block.css
Das Styling des Blocks wird mit einer eigenen CSS-Datei sowohl im Editor als auch im Frontend (Theme) eingebunden.
-
Editor Stylesheet – block-editor.css
Im Gegensatz zur block.css wird dieses Stylesheet nur im Editor geladen. Es beinhaltet extra Styling für Block-Optionen und das Block-Interface, welches im Frontend nicht benötigt wird.
-
Plugin File – plugin.php
Die Main Plugin File mit dem normalen WordPress Plugin Header. Hier werden unsere Block JavaScript und Block Stylesheets mit den neuen Action Hooks
enqueue_block_assets
undenqueue_block_editor_assets
im Theme und Editor eingebunden.
Diese grundlegende Block-Architektur funktioniert auch für die derzeit sehr populären Block Collections. Statt einem Block werden einfach mehrere Blocks in der JavaScript-Datei registriert.
React and JSX
Wer Gutenberg hört, denkt als Entwickler unweigerlich an React.
React ist eine JavaScript Library von Facebook zum Erstellen von User Interfaces. Der Gutenberg Editor ist komplett in React geschrieben, wie auch alle Core Blocks. Theoretisch kannst du eigene Blöcke auch ohne React realisieren, Stand heute nutzt aber nahezu jeder das Framework.
React setzt auf Komponenten, welche ineinander verschachtelt werden. Eine Komponente ist eine Funktion oder Klasse, welche ein React Element zurückgibt und rendert.
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Der Return-Value der render-Funktion sieht erst einmal komisch aus und ist weder ein String noch HTML, sondern JSX. Es ist die bevorzugte Form zu Erstellung eines React Elements.
JSX ist eine Syntax-Erweiterung für JavaScript und für die Entwicklung mit React empfohlen. Es bringt JavaScript und HTML zusammen und erlaubt uns prinzipiell, HTML-Tags, JavaScript-Code und React Komponenten zu mixen, ähnlich einer Template-Sprache.
Modern JavaScript Tooling
Die Entwicklung von WordPress Themes und Plugins ist mit geringen Hürden verbunden und sehr leicht möglich, weil nicht mehr als ein Texteditor und eine lokale Entwicklungsumgebung dafür notwendig ist. Selbst WordPress Einsteiger können so relativ einfach den Code anpassen.
Auch für WordPress Blocks braucht es in Theorie nicht mehr als das. Das Gutenberg Handbook zeigt Code-Beispiele in ES5, welche komplett ohne Tooling auskommen. Richtig sinnvoll ist die Entwicklung für Gutenberg meiner Meinung nach aber nur in ESNext und mit JSX, wofür eine Reihe von Tools benötigt werden:
-
Webpack
Es wäre sehr mühsam, einen kompletten Block oder gar mehrere Blocks in einer JavaScript-Datei zu erstellen. Webpack ist ein sogenannter Bundler und dient dazu, mehrere JS-Files wieder zu einer Datei zusammenzuführen. Wir können damit unseren JavaScript-Code in beliebig viele Dateien aufteilen und als Module importieren und exportieren.
-
Babel
Unter modernem JavaScript versteht man meistens den Einsatz der neuesten ES6-Features. ES6 ist der neueste Standard für JavaScript mit vielen großartigen Features, funktioniert aber nicht in älteren Browsern. Hier kommt Babel ins Spiel. Das Tool kompiliert deinen modernen ES6- und JSX-Code und verwandelt ihn in kompatibles JavaScript für alle Browser.
-
Sass
Sass ist CSS mit Superkräften und erleichtert dir das Schreiben von Stylesheets mit nützlichen Features wie Variablen, Verschachtelung und Mixins.
Webpack ist der Kern des Build-Prozesses, d.h. neben dem Bündeln von Dateien werden mit sogenannten Webpack Loaders – unter anderem für Babel und Sass – der Code transformiert. Man kann es sich wie einen Trichter vorstellen. Oben kippt man jede Menge an Source-Dateien und Code (ES6, JSX, SCSS) rein, unten kommen unsere block.js und block.css heraus.
WordPress Block entwickeln: Ausblick auf Teil 2
Puh, ich hoffe die Vielzahl an Begriffen und Buzzwords haben dich nicht sofort abgeschreckt.
Im nächsten Tutorial lassen wir die Theorie hinter uns und erstellen unser eigenes Block Plugin. Die Struktur des Plugins und die Funktionsweise des Toolings sollte etwas verständlicher und klarer werden, sobald wir mit dem Praxisteil beginnen. Auch React und JSX ist kein Hexenwerk, wie wir mit den ersten Code-Beispielen sehen werden.
Danke Thomas, für die Erklärungen – wirklich sehr hilfreich!
Insbesondere diese ganzen Tools rund um JavaScript sind für mich doch bisher nur böhmische Dörfer. Jetzt hab ich endlich mal verstanden, was diese Dinger machen und wofür das ganze sinnvoll genutzt werden kann. Mir war ehrlich gesagt, auch nicht klar, dass man einen Gutenberg-Block ohne die Tools bauen kann – schon mal sehr gut zu wissen!
Mich wundert es wirklich, dass dies bisher niemand mal *so* erklärt hat, und dann wundern sich einige, warum viele der PHP-Pluginentwickler auf der Strecke bleiben?!?
Danke nochmals, manchmal sind es die vermeintlich „kleinen“ Dinge, die wichtig sind 😉
Hi David,
vielen Dank für dein Feedback. Freut mich, dass es verständlich war. Ich kann das oft sehr schlecht einschätzen, ob alles klar genug beschrieben ist. Als Theme Entwickler war das ganze Tooling für mich anfangs auch abschreckend, inzwischen komme ich aber gut damit zurecht 🙂
Insgesamt brauchen wir für Gutenberg einfach noch mehr Dokumentation, Tutorials, Blog-Beiträge und Code-Snippets. Das PHP-Ökosystem für WordPress ist über Jahre gewachsen und man findet zu jedem erdenklichen Thema Antworten, bei Gutenberg ist aktuell noch viel ausprobieren und Code studieren angesagt, weil es noch wenige Quellen gibt.
Ich habe auch sehr lange nichts Technisches zu Gutenberg veröffentlicht, weil sich die API noch ständig verändert hat. Erst jetzt nach dem Release macht so eine lange Artikelreihe erst richtig Sinn.
Viele Grüße,
Thomas
Vielen Dank, Thomas !
Ich kann nur sagen, dass mir Deine Erklärungen beim verstehen der Zusammenhände sehr helfen.
lG
Wolfgang
Hallo Wolfgang,
Sehr gerne, vielen Dank für deinen Kommentar und das tolle Feedback!
LG,
Thomas
Moin Thomas, ich wollte für das nächste Projekt eigene Blocks mit Gutenberg bauen, deine Erklärung kommt also genau richtig für mich 🙂 Eine Frage: Wann erscheint Teil 2 des Tutorials?
Hallo Patrick,
Ich hoffe nächste Woche. Ich bin das Weekend über auf einem WordCamp, daher etwas wenig Zeit zum Schreiben 😉
LG,
Thomas
Hallo Thomas,
danke für die Serie – wirklich alles top erklärt. Ich bin gerade dabei mich intensiv in das Thema einzuarbeiten, um meine eigene Custom Blocks Collection in einem Plugin zu erstellen, die dann als Basis für alle zukünftig zu entwickelnden Seiten dienen soll. Ich benutze für das Bundling die @wordpress/scripts (https://www.npmjs.com/package/@wordpress/scripts), funktioniert ähnlich wie CGB nur aktuell leider noch ohne SASS oder PostCSS. Jetzt hab’ ich aber ein Problem bzgl. der Registrierung der Blöcke: Jeder Block-Code sitzt in seiner eigenen src-JS und wird dann zu einer build-JS gebundelt. Wie kann ich jetzt in der Plugins PHP alles so zusammenfassen, dass innerhalb einer Funktion alle Blöcke registriert und alle Abhängigkeiten gesetzt werden? Hast Du das schon mal gemacht? Hab’ die Frage schon bei SO gestellt, aber keiner antwortet 🙁
Hoffe es ist ok, das hier in den Kommentaren zu fragen…
Danke für Deine Hilfe und Grüße, Tim
Hallo Tim,
Es sollte reichen, die build-JS mit
wp_register_script()
und allen Abhängigkeiten zu definieren und danach jeden Block mitregister_block_type()
zu registrieren:function plugin_slug_register_blocks() {
// Register build.js
wp_register_script(
'plugin-slug-blocks',
plugins_url( 'build.js', __FILE__ ),
array( 'wp-blocks', 'wp-element', 'wp-data' )
);
// Register Block 1
register_block_type( 'plugin-slug/block-name-1', array(
'editor_script' => 'plugin-slug-blocks',
) );
// Register Block 2
register_block_type( 'plugin-slug/block-name-2', array(
'editor_script' => 'plugin-slug-blocks',
) );
}
add_action( 'init', 'plugin_slug_register_blocks' );
Neben editor_script nimmt
register_block_type()
auch style und editor_style als Argument für die CSS-Dateien entgegen. Falls es sich um einen dynamischen Block handelt, kann auch eine Render-Funktion mit render_callback übergeben werden.Hoffe dass hilft dir weiter 🙂
LG,
Thomas
Hallo Thomas,
danke für Deine schnelle Antwort mit Codebeispiel. Das werde ich gleich mal entsprechend testen. Ich hatte jetzt für jeden Block eine eigene wp_register_script Funktion, die auf die eine built-js verweist. Dann wird natürlich jedes Mal versucht, alle Blöcke neu zu registrieren. Was zwar funktioniert, aber nur mit entsprechenden Errors in der Konsole…
Dynamische Blöcke hab ich mir noch nicht angeschaut, kommt dann als nächstes…
Hat mir sehr weitergeholfen! Danke nochmals und Grüße,
Tim
Hallo Thomas,
also das funktioniert wunderbar, less code – no errrors. Danke nochmals!
Falls Du meine Frage auf SO damit auch beantworten möchtest, hier der Link:
https://stackoverflow.com/questions/56045886/registering-multiple-custom-gutenberg-blocks-in-a-plugin-with-webpack-build
Viele Grüße,
Tim
Ah freut mich, dass es geklappt hat. Habe die Antwort auch bei Stack Overflow gepostet 🙂