{"id":44070,"date":"2021-10-29T11:46:24","date_gmt":"2021-10-29T10:46:24","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=44070&#038;preview=true&#038;preview_id=44070"},"modified":"2023-08-24T11:26:04","modified_gmt":"2023-08-24T10:26:04","slug":"gutenberg-blocke","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/","title":{"rendered":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung"},"content":{"rendered":"<p>Viele beschweren sich \u00fcber die H\u00fcrden, die der Einstieg in die Erstellung von Gutenberg-Bl\u00f6cken und -Apps mit sich bringt. Die Lernkurve ist steil, was vor allem an der Schwierigkeit liegt, die Entwicklungsumgebung zu installieren und zu konfigurieren. Au\u00dferdem sind solide Kenntnisse in JavaScript, Node.js, React und Redux ein Muss f\u00fcr dieses komplexe Rezept.<\/p>\n<p>Das offizielle <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">WordPress-Handbuch f\u00fcr Block-Editoren<\/a> bietet Entwicklern eine enorme Menge an Informationen, aber es kann sein, dass du dich in diesem Meer von Details verlierst.<\/p>\n<p>Und es ist erw\u00e4hnenswert, was Mat\u00edas Ventura, leitender Architekt des Gutenberg-Projekts, in seinem <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">Interview mit WP Tavern<\/a> berichtet hat:<\/p>\n<blockquote><p><em>Auch wenn es Leute gibt, die es schnell lernen k\u00f6nnen, ist es immer noch eine gro\u00dfe H\u00fcrde f\u00fcr viele. Ich denke, dass es mehrere Ebenen gibt; die Dokumentation k\u00f6nnte sowohl in der Organisation als auch in der Pr\u00e4sentation um Gr\u00f6\u00dfenordnungen besser sein. Ich hoffe, wir k\u00f6nnen da noch viel mehr tun.<\/em><\/p><\/blockquote>\n<p>Deshalb haben wir beschlossen, ein Schritt-f\u00fcr-Schritt-Tutorial zu erstellen, das unseren Lesern den Einstieg in die Gutenberg-Blockentwicklung erleichtern soll.<\/p>\n<p>Klingt interessant? Dann nichts wie los!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Gutenberg-Block-Entwicklung Voraussetzungen<\/h2>\n<p>F\u00fcr dieses Tutorial brauchst du nur gute Kenntnisse in der Entwicklung von WordPress Plugins und zumindest ein <a href=\"https:\/\/kinsta.com\/de\/blog\/bewaehrte-html-praktiken\/\">Grundverst\u00e4ndnis von HTML<\/a>, CSS, JavaScript und React.<\/p>\n<p>Wird dies ein ehrgeiziges Projekt sein? Und ob es das ist!<\/p>\n<p>Es war nicht einfach, den richtigen Kompromiss zwischen Vollst\u00e4ndigkeit und Einfachheit zu finden und zu entscheiden, welche Themen wir aufnehmen und welche wir weglassen.<\/p>\n<p>Wir hoffen, dass fortgeschrittene Leserinnen und Leser uns verzeihen werden, wenn wir auf bestimmte Konzepte wie <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">React State<\/a>, <a href=\"https:\/\/redux.js.org\/api\/store\">Redux Store<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">High Order Components<\/a> usw. nicht n\u00e4her eingehen. Diese Themen ben\u00f6tigen mehr Platz und Aufmerksamkeit und sind f\u00fcr Anf\u00e4nger in der Blockentwicklung wahrscheinlich zu fortgeschritten (es sei denn, du bist ein React-Entwickler).<\/p>\n<p>Aus demselben Grund werden wir einige der fortgeschritteneren Themen im Zusammenhang mit der Entwicklung von Gutenberg-Bl\u00f6cken, wie <a href=\"https:\/\/kinsta.com\/de\/blog\/dynamische-bloecke\/\">dynamische Bl\u00f6cke<\/a> und <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Metaboxen<\/a>, nicht behandeln.<\/p>\n<p>Mit dem Wissen, das du am Ende dieses Artikels erworben hast, kannst du sofort loslegen und produktiv sein.<\/p>\n<p>Wenn du erst einmal mit der Blockerstellung angefangen hast, kannst du deine F\u00e4higkeiten weiter ausbauen und noch fortgeschrittenere Gutenberg-Bl\u00f6cke selbst erstellen.<\/p>\n\n<p>\u00a0<\/p>\n<h2>Was ist ein Gutenberg-Block?<\/h2>\n<p>Seit seiner ersten Ver\u00f6ffentlichung im Dezember 2018 wurde der <a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-wordpress-editor\/\">Block-Editor<\/a> in jeder Hinsicht stark verbessert: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">leistungsf\u00e4higere APIs<\/a>, eine fortschrittlichere Benutzeroberfl\u00e4che, verbesserte Benutzerfreundlichkeit, jede Menge neue Bl\u00f6cke, die <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">ersten Implementierungen von Full Site Editing<\/a> und vieles mehr.<\/p>\n<p>Kurz gesagt: Auch wenn Gutenberg immer noch intensiv weiterentwickelt wird, hat es einen weiten Weg zur\u00fcckgelegt &#8211; und heute ist der Block-Editor ein vollwertiger Kandidat f\u00fcr einen zuverl\u00e4ssigen, funktionalen Seiten- und Website-Builder.<\/p>\n<p>Aus der Sicht eines Entwicklers ist Gutenberg eine React-basierte <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">Single Page Application<\/a> (SPA), mit der WordPress-Nutzer Inhalte in WordPress erstellen, bearbeiten und l\u00f6schen k\u00f6nnen. Das sollte dich jedoch nicht an eine verbesserte Version des <a href=\"https:\/\/kinsta.com\/blog\/wordpress-tinymce-editor\/\">traditionellen Inhaltseditors<\/a> denken lassen.<\/p>\n<p>Das wollen wir klarstellen:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg ist <em>kein<\/em> gew\u00f6hnlicher WYSIWYG-Editor. Vielmehr definiert er das gesamte Bearbeitungserlebnis in WordPress neu.<\/strong><\/p>\n<\/aside>\n\n<p>In Gutenberg sind die Inhalte in Bl\u00f6cke unterteilt, die &#8222;Bausteine&#8220;, mit denen die Nutzer\/innen Beitr\u00e4ge und Seiten oder ihre gesamten Webseiten erstellen k\u00f6nnen.<\/p>\n<p>Aber was ist eigentlich ein Block?<\/p>\n<p>Uns gef\u00e4llt die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">Definition von WordPress<\/a>:<\/p>\n<blockquote><p><em>&#8222;Block&#8220; ist ein abstrakter Begriff, der Markup-Einheiten beschreibt, die zusammengesetzt den Inhalt oder das Layout einer Webseite bilden. Die Idee kombiniert Konzepte, die wir heute in WordPress mit Shortcodes, benutzerdefiniertem HTML und Embed Discovery erreichen, zu einer einheitlichen API und einem einheitlichen Nutzererlebnis.<\/em><\/p><\/blockquote>\n<p>\u00dcberschriften, Abs\u00e4tze, Spalten, Bilder, Galerien und alle Elemente, die die Benutzeroberfl\u00e4che des Editors ausmachen, von Sidebar-Panels bis hin zu den Steuerelementen der Blocksymbolleiste, sind React-Komponenten.<\/p>\n<p>Was sind also React-Komponenten? W3Schools liefert die <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">folgende Definition<\/a>:<\/p>\n<blockquote><p>Komponenten sind unabh\u00e4ngige und wiederverwendbare Codebausteine. Sie dienen demselben Zweck wie JavaScript-Funktionen, arbeiten aber isoliert und geben HTML \u00fcber eine <em><code>render()<\/code><\/em>-Funktion zur\u00fcck.<\/p><\/blockquote>\n<figure id=\"attachment_105117\" aria-describedby=\"caption-attachment-105117\" style=\"width: 2874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105117 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/working-with-blocks.jpg\" alt=\"Arbeiten mit Gutenberg-Bl\u00f6cken in WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Arbeiten mit Gutenberg-Bl\u00f6cken in WordPress 5.8.<\/figcaption><\/figure>\n<p>Auch wenn Gutenberg ein neues Bearbeitungserlebnis im Vergleich zum klassischen WordPress-Editor bietet, \u00e4ndert sich die Art und Weise, wie WordPress deine Inhalte in der Datenbank speichert, \u00fcberhaupt nicht. Das liegt daran, dass Gutenberg eine Anwendung ist, die innerhalb von WordPress arbeitet, aber nicht die Art und Weise ver\u00e4ndert, wie das CMS in seinem Kern funktioniert.<\/p>\n<p>Mit Gutenberg erstellte Beitr\u00e4ge (und dazu geh\u00f6ren Beitr\u00e4ge, Seiten und benutzerdefinierte Beitragstypen) werden nach wie vor in der Tabelle <code>wp_posts<\/code> gespeichert, genau wie im klassischen Editor.<\/p>\n<p>Aber in einem mit Gutenberg erstellten Beitrag findest du zus\u00e4tzliche Informationen in der Tabelle, die einen grundlegenden Unterschied zwischen Beitr\u00e4gen, die mit dem klassischen Editor und Gutenberg erstellt wurden, darstellen.<\/p>\n<p>Diese Informationen sehen aus wie HTML-Kommentare und haben eine bestimmte Funktion: Sie grenzen Bl\u00f6cke ab:<\/p>\n<figure id=\"attachment_105118\" aria-describedby=\"caption-attachment-105118\" style=\"width: 1522px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105118 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/code-editor-view.jpg\" alt=\"Ein Blogbeitrag in der Code-Editor-Ansicht.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Ein Blogbeitrag in der Code-Editor-Ansicht.<\/figcaption><\/figure>\n<p><strong>Blockbegrenzer<\/strong> teilen WordPress mit, welcher Block auf dem Bildschirm dargestellt werden soll. Au\u00dferdem liefern sie Werte f\u00fcr Blockeigenschaften in einem JSON-Objekt. Diese Props bestimmen, wie der Block auf dem Bildschirm dargestellt werden soll:<\/p>\n<figure id=\"attachment_105119\" aria-describedby=\"caption-attachment-105119\" style=\"width: 1630px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105119 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/post-content.jpg\" alt=\"Ein Blogbeitrag, der in der Tabelle wp_posts gespeichert ist.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Ein Blogbeitrag, der in der Tabelle <code>wp_posts<\/code> gespeichert ist.<\/figcaption><\/figure>\n<h2>Einrichten deiner WordPress-Entwicklungsumgebung<\/h2>\n<p>Die Einrichtung einer modernen JavaScript-Entwicklungsumgebung erfordert ein solides Wissen \u00fcber fortschrittliche Technologien wie <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> und <a href=\"https:\/\/facebook.github.io\/jsx\/\">JSX<\/a>, <a href=\"https:\/\/babeljs.io\/docs\/en\/index.html\">Babel<\/a>, <a href=\"https:\/\/eslint.org\/\">ESLint<\/a> usw.<\/p>\n<p>Eingesch\u00fcchtert? Das muss nicht sein! Die WordPress-Gemeinde hat bereits leistungsstarke Tools zur Verf\u00fcgung gestellt, mit denen du die umst\u00e4ndliche manuelle Konfiguration vermeiden kannst.<\/p>\n<p>Um die Dinge einfach zu halten, gehen wir in diesem Artikel nicht auf die <a href=\"https:\/\/kinsta.com\/de\/blog\/transpilierung-php\/\">Transpilierung<\/a> ein (mit der du dich allerdings vertraut machen solltest, sobald du die Grundlagen der Blockentwicklung gelernt hast). Stattdessen stellen wir dir zwei alternative Tools vor, mit denen du in wenigen Minuten schnell und einfach eine moderne JavaScript-Entwicklungsumgebung einrichten kannst. Es liegt an dir, das Tool zu w\u00e4hlen, das du f\u00fcr dein Projekt am geeignetsten findest.<\/p>\n<p>Das Einrichten einer JavaScript-Entwicklungsumgebung f\u00fcr die Erstellung von Gutenberg-Bl\u00f6cken erfolgt in drei Schritten:<\/p>\n<ol>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#node-npm\">Node.js und npm installieren<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#dev-environment\">Richte die Entwicklungsumgebung ein<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#block-plugin\">Das Block Plugin einrichten<\/a><\/li>\n<\/ol>\n<p>Lass uns loslegen.<\/p>\n<h3 id=\"node-npm\">1. Node.js und npm installieren<\/h3>\n<p>Bevor du deine Entwicklungsumgebung installierst und deinen ersten Block registrierst, musst du <a href=\"https:\/\/kinsta.com\/it\/knowledgebase\/node-js\/\">Node.js<\/a> und den Node-Paketmanager (npm) installieren.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> ist eine JavaScript-Laufzeitumgebung, die auf der V8-JavaScript-Engine von Chrome aufbaut. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, allgemein bekannt als der Node-Paketmanager, gilt als &#8222;die gr\u00f6\u00dfte Software-Registry der Welt.&#8220;<\/p>\n<\/aside>\n\n<p>Du kannst <a href=\"https:\/\/kinsta.com\/de\/blog\/so-installierst-du-node-js\/\">Node.js und npm<\/a> auf <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">verschiedene Arten installieren<\/a>. Aber zuerst solltest du pr\u00fcfen, ob die Software bereits auf deinem Rechner installiert ist.<\/p>\n<p>Starte dazu das Terminal und f\u00fchre den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Wenn das Ergebnis <code>command not found<\/code> ist, ist Node.js nicht auf deinem Computer installiert und du kannst mit der Installation fortfahren.<\/p>\n<p>F\u00fcr diesen Artikel haben wir uns f\u00fcr die einfachste Installationsoption entschieden: den <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Du musst nur die f\u00fcr dein Betriebssystem passende Version herunterladen und den Installationsassistenten starten:<\/p>\n<figure id=\"attachment_105120\" aria-describedby=\"caption-attachment-105120\" style=\"width: 1974px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105120 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/nodejs-downloads.jpg\" alt=\"Node.js Downloads Seite.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">Node.js Downloads Seite.<\/figcaption><\/figure>\n<p>Wenn du Node.js installiert hast, f\u00fchre den Befehl <code>node -v<\/code> erneut in deinem Terminal aus. Du kannst auch den Befehl <code>npm -v<\/code> ausf\u00fchren, um sicherzustellen, dass das npm-Paket verf\u00fcgbar ist.<\/p>\n<p>Du bist jetzt mit den folgenden Tools ausgestattet:<\/p>\n<ul>\n<li>Der <code>npx<\/code> Node.js package runner (<a href=\"https:\/\/nodejs.dev\/learn\/the-npx-nodejs-package-runner\">siehe Dokumentation<\/a>). Damit kannst du einen <code>npm<\/code>-Befehl ausf\u00fchren, ohne ihn vorher zu installieren.<\/li>\n<li>Der <code>npm<\/code> Node.js-Paketmanager (<a href=\"https:\/\/docs.npmjs.com\/\">siehe Dokumentation<\/a>). Er wird verwendet, um Abh\u00e4ngigkeiten zu installieren und Skripte auszuf\u00fchren.<\/li>\n<\/ul>\n<p>Im n\u00e4chsten Schritt installierst du die Entwicklungsumgebung.<\/p>\n<h3 id=\"dev-environment\">2. Einrichten deiner Entwicklungsumgebung<\/h3>\n<p>Sobald du die neuesten Versionen von Node.js und npm auf deinem lokalen Rechner hast, brauchst du eine Entwicklungsumgebung f\u00fcr WordPress.<\/p>\n<p>Du kannst entweder eine lokale Entwicklungsumgebung wie DevKinsta verwenden oder das offizielle WordPress Tool nutzen. Werfen wir einen Blick auf beide Optionen.<\/p>\n<h4 id=\"devkinsta\">Option 1: Lokale Entwicklungsumgebung (DevKinsta)<\/h4>\n<p>Mit nur wenigen Klicks kannst du <a href=\"https:\/\/kinsta.com\/de\/ebooks\/wordpress\/wordpress-lokale-entwicklung\/\">WordPress<\/a> mit <a href=\"https:\/\/kinsta.com\/de\/devkinsta\/\">DevKinsta<\/a>, unserem modernen lokalen WordPress Tool, lokal installieren. Oder du entscheidest dich f\u00fcr ein anderes lokales Entwicklungstool, wie <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-lokal-installieren\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> oder <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-lokal-installieren\/#how-to-install-wordpress-locally-using-xampp\">XAMPP<\/a>:<\/p>\n<figure id=\"attachment_105122\" aria-describedby=\"caption-attachment-105122\" style=\"width: 2502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105122 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/dev-kinsta-create-new-site.jpg\" alt=\"Erstelle eine neue WordPress Webseite in DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Erstelle eine neue WordPress Webseite in DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Option 2: wp-env<\/h4>\n<p>Du kannst dich auch f\u00fcr das offizielle <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">Tool <code>wp-env<\/code><\/a> entscheiden, das eine lokale WordPress-Entwicklungsumgebung bereitstellt, die du direkt \u00fcber die Kommandozeile starten kannst. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">definiert es wie folgt<\/a>:<\/p>\n<blockquote><p><em>Lokale WordPress-Umgebungen sind jetzt so einfach wie das Ausf\u00fchren eines einzigen Befehls. <code>wp-env<\/code> ist ein Zero-Config-Tool f\u00fcr m\u00fchelose lokale WordPress-Umgebungen. Es bietet Entscheidungen \u00fcber Optionen, damit Nutzer\/innen WordPress schnell und ohne Zeitverlust einrichten k\u00f6nnen. Das Ziel ist es, diese Umgebungen f\u00fcr alle leicht zug\u00e4nglich zu machen &#8211; egal ob du Entwickler, Designer, Manager oder sonst jemand bist.<\/em><\/p><\/blockquote>\n<p>Wenn du dich entscheidest, es auszuprobieren, erfordert die Installation von <code>wp-env<\/code> nur wenig Aufwand. Folge einfach diesen Schritten:<\/p>\n<h5>Schritt 1: Best\u00e4tige die Installation von Docker und Node.js<\/h5>\n<p>Um die technischen Voraussetzungen zu erf\u00fcllen, musst du zun\u00e4chst sowohl <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> als auch Node.js auf deinem Computer installiert haben. Denn <code>wp-env<\/code> erstellt eine Docker-Instanz, auf der eine WordPress Webseite l\u00e4uft. Alle \u00c4nderungen, die du am Code vornimmst, werden sofort auf die WordPress-Instanz \u00fcbertragen.<\/p>\n<h5>Schritt 2: Installiere <code>@wordpress\/env<\/code> \u00fcber die Kommandozeile<\/h5>\n<p>Wenn Docker und Node.js auf deinem Computer laufen, kannst du fortfahren und die WordPress-<a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">Entwicklungsumgebung<\/a> installieren.<\/p>\n<p>Du kannst <code>wp-env<\/code> entweder global oder lokal installieren. Um es global zu installieren, musst du den folgenden Befehl aus dem Plugins-Verzeichnis ausf\u00fchren (mehr dazu im Kasten &#8222;Wichtig&#8220; weiter unten):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>Lass uns das mal aufschl\u00fcsseln:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">installiert das Paket<\/a>.<\/li>\n<li><code>-g<\/code> an den Befehl angeh\u00e4ngt, wird das <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">angegebene Paket global installiert<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> ist das <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">Paket, das du installieren wirst<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p><\/p>\n<p>Standardm\u00e4\u00dfig werden die <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">Node-Pakete auf<\/a> Mac oder Linux in <strong>\/usr\/local\/lib\/node_modules installiert<\/strong>.<\/p>\n<p>Wenn der aktuelle Benutzer keine Schreibrechte f\u00fcr dieses Verzeichnis hat, wird ein EACCES-Fehler ausgegeben. Erfahre mehr \u00fcber die Behebung von <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">EACCES-Fehlern bei der globalen Installation von Paketen<\/a>.<\/p>\n<p><\/p>\n<\/aside>\n\n<p>Um zu best\u00e4tigen, dass <code>wp-env<\/code> erfolgreich installiert wurde, f\u00fchre den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Du solltest die aktuelle <code>wp-env<\/code> Version sehen. Das bedeutet, dass du die Umgebung jetzt mit dem folgenden Befehl aus dem <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">Ordner deines Plugins<\/a> starten kannst:<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Du kannst das WordPress Dashboard \u00fcber die folgende Adresse aufrufen:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>Die Standardanmeldedaten lauten wie folgt:<\/p>\n<ul>\n<li>Benutzername: <code>admin<\/code><\/li>\n<li>Passwort: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Richte dein Block Plugin ein<\/h3>\n<p>Jetzt brauchst du ein Block Plugin, auf dem du aufbauen kannst. Anstatt ein Block Plugin mit allen notwendigen Dateien und Ordnern manuell zu erstellen, kannst du einfach ein Dev-Tool ausf\u00fchren, das alle Dateien und Konfigurationen enth\u00e4lt, die du f\u00fcr die Blockentwicklung brauchst.<\/p>\n<p>Auch hier hast du mehrere Optionen zur Auswahl. Schauen wir uns beide an.<\/p>\n<h4 id=\"create-block\">Option 1: Einrichten eines Block Plugins mit @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> ist das offizielle Zero Configuration Tool zur Erstellung von Gutenberg-Bl\u00f6cken:<\/p>\n<blockquote><p><em>Block erstellen ist eine offiziell unterst\u00fctzte M\u00f6glichkeit, Bl\u00f6cke f\u00fcr die Registrierung eines Blocks f\u00fcr ein WordPress Plugin zu erstellen. Es bietet ein modernes Build-Setup ohne Konfiguration. Es generiert PHP-, JS- und CSS-Code und alles andere, was du brauchst, um das Projekt zu starten.<\/em><\/p>\n<p>Es ist weitgehend von <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a> inspiriert. Ein gro\u00dfes Lob an <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, das gesamte Facebook-Team und die React-Community.<\/p><\/blockquote>\n<p>Sobald deine lokale Umgebung einsatzbereit ist, kannst du einen Startblock einrichten, indem du einfach den <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Befehl<\/a> <code>npx @wordpress\/create-block<\/code> ausf\u00fchrst. Er stellt dir alle Dateien und Ordner zur Verf\u00fcgung, die du brauchst, um das <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">Plugin-Ger\u00fcst zu erstellen<\/a> und einen neuen Block zu registrieren.<\/p>\n<p>Lass uns einen Test machen, um zu sehen, wie es funktioniert.<\/p>\n<p>Navigiere in deinem Command Line Tool zum Verzeichnis <strong>\/wp-content\/plugins\/<\/strong> und f\u00fchre den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>Wenn du zur Best\u00e4tigung aufgefordert wirst, gib <code>y<\/code> ein, um fortzufahren:<\/p>\n<figure id=\"attachment_105124\" aria-describedby=\"caption-attachment-105124\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105124 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-my-first-block.jpg\" alt=\"Erstelle einen Block mit @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Erstelle einen Block mit @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Der Vorgang dauert nur wenige Augenblicke. Wenn er abgeschlossen ist, solltest du die folgende Antwort erhalten:<\/p>\n<figure id=\"attachment_105125\" aria-describedby=\"caption-attachment-105125\" style=\"width: 1134px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105125 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/wordpress-create-block-completed.jpg\" alt=\"Das Plugin f\u00fcr den Block wurde erstellt.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">Das Plugin f\u00fcr den Block wurde erstellt.<\/figcaption><\/figure>\n<p>Und das war&#8217;s schon!<\/p>\n<p>Starte nun deine WordPress-Entwicklungsumgebung und rufe den Bildschirm <strong>Plugins<\/strong> im WordPress-Dashboard auf. Ein neues Plugin mit dem Namen &#8222;My First Block&#8220; sollte zu deiner Plugin-Liste hinzugef\u00fcgt worden sein:<\/p>\n<figure id=\"attachment_105126\" aria-describedby=\"caption-attachment-105126\" style=\"width: 1956px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105126 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/my-first-block-plugin.jpg\" alt=\"Das Block Plugin wurde erfolgreich installiert.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">Das Block Plugin wurde erfolgreich installiert.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><\/p>\n<p>Wenn du das <code>wp-env<\/code> Tool verwendest und <code>wp-env start<\/code> aus dem Verzeichnis startest, in dem sich das Plugin befindet, wird es automatisch eingebunden und aktiviert. Wenn du <code>wp-env start<\/code> von einem anderen Verzeichnis aus startest, wird eine generische WordPress-Umgebung erstellt (siehe auch <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress-Entwicklungsseite<\/a>).<\/p>\n<p><\/p>\n<\/aside>\n\n<p>Aktiviere das Plugin bei Bedarf, erstelle einen neuen Blogbeitrag, scrolle im Block-Inserter nach unten zum Abschnitt <strong>Widgets<\/strong> und w\u00e4hle deinen neuen Block aus:<\/p>\n<figure id=\"attachment_134071\" aria-describedby=\"caption-attachment-134071\" style=\"width: 2190px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134071 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt=\"Ein Beispielblock, der mit @wordpress\/create-block erstellt wurde.\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Ein Beispielblock, der mit @wordpress\/create-block erstellt wurde.<\/figcaption><\/figure>\n<p>Gehe nun zur\u00fcck zum Terminal und \u00e4ndere das aktuelle Verzeichnis in <strong>my-first-block<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>Dann f\u00fchre den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>So kannst du das Plugin im Entwicklungsmodus ausf\u00fchren. Um den Produktionscode zu erstellen, solltest du den folgenden Befehl verwenden:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Option 2: Einrichten eines Block Plugins mit create-guten-block<\/h4>\n<p><code><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">create-guten-block<\/a><\/code> ist ein Tool eines Drittanbieters f\u00fcr die Erstellung von Gutenberg-Bl\u00f6cken:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> ist ein Zero-Configuration Dev-Toolkit (#0CJS), mit dem du in wenigen Minuten WordPress Gutenberg-Bl\u00f6cke entwickeln kannst, ohne React, Webpack, ES6\/7\/8\/Next, ESLint, Babel usw. konfigurieren zu m\u00fcssen.<\/em><\/p><\/blockquote>\n<p>Genau wie das offizielle <code>create-block<\/code> Tool basiert <code>create-guten-block<\/code> auf <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> und hilft dir dabei, dein erstes Block Plugin zu erstellen, ohne dass du dich anstrengen musst.<\/p>\n<p>Das Toolkit enth\u00e4lt alles, was du brauchst, um ein modernes WordPress Plugin zu erstellen, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">darunter Folgendes<\/a>:<\/p>\n<blockquote><p>\u00a0<\/p>\n<ul>\n<li>Support f\u00fcr React, JSX und ES6-Syntax.<\/li>\n<li>webpack Dev\/Production Build-Prozess hinter der Szene.<\/li>\n<li>Sprachliche Extras, die \u00fcber ES6 hinausgehen, wie z. B. der Objekt-Spread-Operator.<\/li>\n<li>Automatische CSS-Pr\u00e4fixe, sodass du weder -webkit noch andere Pr\u00e4fixe ben\u00f6tigst.<\/li>\n<li>Ein Build-Skript zum B\u00fcndeln von JS, CSS und Bildern f\u00fcr die Produktion mit Source-Maps.<\/li>\n<li>Problemlose Updates f\u00fcr die oben genannten Tools mit einer einzigen Abh\u00e4ngigkeit cgb-scripts.<\/li>\n<\/ul>\n<p>\u00a0<\/p><\/blockquote>\n<p>Beachte den folgenden Vorbehalt:<\/p>\n<blockquote><p><em>Der Nachteil ist, dass diese Tools so vorkonfiguriert sind, dass sie auf eine bestimmte Weise funktionieren. Wenn dein Projekt mehr Anpassungen braucht, kannst du es <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">&#8222;auswerfen&#8220;<\/a> und anpassen, aber dann musst du diese Konfiguration beibehalten.<\/em><\/p><\/blockquote>\n<p>Sobald du eine lokale WordPress Webseite zur Verf\u00fcgung hast, starte dein Command Line Tool, navigiere zum Ordner <strong>\/wp-content\/plugins<\/strong> deiner Installation und f\u00fchre den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Du musst ein oder zwei Minuten warten, w\u00e4hrend die Projektstruktur erstellt und die Abh\u00e4ngigkeiten heruntergeladen werden:<\/p>\n<figure id=\"attachment_105147\" aria-describedby=\"caption-attachment-105147\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105147 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block.jpg\" alt=\"Erstellen eines Gutenberg-Blocks mit create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Erstellen eines Gutenberg-Blocks mit create-guten-block.<\/figcaption><\/figure>\n<p>Wenn der Vorgang abgeschlossen ist, solltest du den folgenden Bildschirm sehen:<\/p>\n<figure id=\"attachment_105132\" aria-describedby=\"caption-attachment-105132\" style=\"width: 1130px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105132 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-complete.jpg\" alt=\"Gutenberg-Block erfolgreich mit create-guten-block erstellt.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Gutenberg-Block erfolgreich mit create-guten-block erstellt.<\/figcaption><\/figure>\n<p>Das n\u00e4chste Bild zeigt die Projektstruktur, wenn das Terminal in <a href=\"https:\/\/kinsta.com\/de\/blog\/besten-texteditoren\/#visual-studio-code\">Visual Studio Code<\/a> l\u00e4uft:<\/p>\n<figure id=\"attachment_105133\" aria-describedby=\"caption-attachment-105133\" style=\"width: 2350px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105133 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-plugin-in-visual-studio-code.jpg\" alt=\"Das Block Plugin in Visual Studio Code.\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">Das Block Plugin in Visual Studio Code.<\/figcaption><\/figure>\n<p>Gehe nun zur\u00fcck zu deinem WordPress Dashboard. Auf dem Plugin-Bildschirm sollte ein neuer Eintrag zu sehen sein &#8211; es ist das <strong>my-first-block<\/strong> Plugin:<\/p>\n<figure id=\"attachment_105134\" aria-describedby=\"caption-attachment-105134\" style=\"width: 2136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105134 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/plugins-screen.jpg\" alt=\"Der Plugins-Bildschirm mit einem neuen Plugin, das mit create-guten-block erstellt wurde.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">Der Plugins-Bildschirm mit einem neuen Plugin, das mit create-guten-block erstellt wurde.<\/figcaption><\/figure>\n<p>Aktiviere das Plugin und gehe zur\u00fcck zum Terminal. \u00c4ndere das aktuelle Verzeichnis in <strong>my-first-block<\/strong> und f\u00fchre <code>npm start<\/code> aus:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Du solltest die folgende Antwort erhalten:<\/p>\n<figure id=\"attachment_105128\" aria-describedby=\"caption-attachment-105128\" style=\"width: 1129px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105128 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/npm-started.jpg\" alt=\"npm gestartet.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm gestartet.<\/figcaption><\/figure>\n<p>Auch hier kannst du das Plugin im Entwicklungsmodus ausf\u00fchren. Um den Produktionscode zu erstellen, solltest du:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Aktiviere das Plugin, erstelle einen neuen Beitrag oder eine neue Seite, durchsuche deine Bl\u00f6cke und w\u00e4hle deinen neuen Gutenberg-Block aus:<\/p>\n<figure id=\"attachment_105136\" aria-describedby=\"caption-attachment-105136\" style=\"width: 2458px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105136 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/first-block-created-with-create-guten-block.jpg\" alt=\"Ein neuer Block, der mit create-guten-block erstellt wurde.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Ein neuer Block, der mit create-guten-block erstellt wurde.<\/figcaption><\/figure>\n<p>F\u00fcr einen ausf\u00fchrlicheren \u00dcberblick oder bei Fehlern kannst du in der <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">Dokumentation von Ahmad Awais<\/a> nachschlagen.<\/p>\n<h2>Ein Rundgang durch das Starter-Block-Ger\u00fcst<\/h2>\n<p>F\u00fcr welches der beiden Dev-Tools &#8211; <code>create-block<\/code> oder <code>create-guten-block<\/code> &#8211; du dich auch entscheidest, du hast jetzt ein Block-Ger\u00fcst, das du als Ausgangspunkt f\u00fcr die Erstellung eines Block-Plugins verwenden kannst.<\/p>\n<p>Aber was genau ist ein <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">Blockger\u00fcst<\/a>?<\/p>\n<blockquote><p><em>Block Scaffolding ist ein kurzer Begriff, der die unterst\u00fctzende Verzeichnisstruktur beschreibt, die du brauchst, damit WordPress einen Block erkennt. Normalerweise enth\u00e4lt dieses Verzeichnis Dateien wie <strong>index.php, index.js, style.css<\/strong> und andere &#8211; die wiederum Aufrufe wie <code>register_block_type<\/code> enthalten.<\/em><\/p><\/blockquote>\n<p>Wir haben uns f\u00fcr das offizielle <strong>Create Block<\/strong> dev-Tool entschieden, da es im <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">Block Editor Handbook verwendet wird<\/a>. Aber auch wenn du dich f\u00fcr ein Tool eines Drittanbieters wie <code>create-guten-block<\/code> entscheidest, wird sich deine Erfahrung nicht allzu sehr unterscheiden.<\/p>\n<p>Deshalb wollen wir uns das <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Tool <code>create-block<\/code><\/a> genauer ansehen.<\/p>\n<h3>Ein genauerer Blick auf das Create Block Dev-Tool<\/h3>\n<p>Wie bereits erw\u00e4hnt, ist <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> das offizielle Kommandozeilentool zur Erstellung von Gutenberg-Bl\u00f6cken. Wenn du <code>@wordpress\/create-block<\/code> in deinem Terminal ausf\u00fchrst, werden die PHP-, JS- und SCSS-Dateien und der Code generiert, die f\u00fcr die Registrierung eines neuen Blocktyps ben\u00f6tigt werden:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (optional) \u2014 wird verwendet, um den Block-Slug zuzuweisen und das Plugin zu installieren<\/li>\n<li><code>[options]<\/code> (optional) \u2014 verf\u00fcgbare Optionen<\/li>\n<\/ul>\n<p>Standardm\u00e4\u00dfig wird ein <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a> Template zugewiesen. Das bedeutet, dass du die <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">n\u00e4chste Version von JavaScript<\/a> erh\u00e4ltst, mit dem Zusatz der <a href=\"https:\/\/en.wikipedia.org\/wiki\/JSX_(JavaScript)\">JSX-Syntax<\/a>.<\/p>\n<p>Wenn du den Blocknamen wegl\u00e4sst, wird der Befehl im interaktiven Modus ausgef\u00fchrt, so dass du verschiedene Optionen anpassen kannst, bevor du die Dateien erzeugst:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<figure id=\"attachment_133845\" aria-describedby=\"caption-attachment-133845\" style=\"width: 1684px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133845 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"Block erstellen im interaktiven Modus ausf\u00fchren\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">Block erstellen im interaktiven Modus ausf\u00fchren<\/figcaption><\/figure>\n<p>Die folgende Abbildung zeigt die Dateistruktur eines Block Plugins, das mit dem offiziellen Create Block Tool erstellt wurde:<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133848 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"Dateien und Ordner eines Block-Plugins, das mit @wordpress\/create-block erstellt wurde.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Dateien und Ordner eines Block-Plugins, das mit @wordpress\/create-block erstellt wurde.<\/figcaption><\/figure>\n<p>Schauen wir uns also die wichtigsten Dateien und Ordner unseres neuen Plugins an.<\/p>\n<h3 id=\"plugin-file\">Die Plugin-Datei<\/h3>\n<p>Mit der Hauptdatei des Plugins <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registrierst du den Block auf dem Server<\/a>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name:       Kinsta Academy Block\n * Plugin URI:        https:\/\/kinsta.com\/\n * Description:       An example block for Kinsta Academy students\n * Requires at least: 5.9\n * Requires PHP:      7.0\n * Version:           0.1.0\n * Author:            Kinsta Students\n * License:           GPL-2.0-or-later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       ka-example-block\n *\n * @package           ka-example-block\n *\/\n\n\/**\n * Registers the block using the metadata loaded from the `block.json` file.\n * Behind the scenes, it registers also all assets so they can be enqueued\n * through the block editor in the corresponding context.\n *\n * @see https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\n *\/\nfunction ka_example_block_ka_example_block_block_init() {\n\tregister_block_type( __DIR__ . '\/build' );\n}\nadd_action( 'init', 'ka_example_block_ka_example_block_block_init' );<\/code><\/pre>\n<p>Die Funktion <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registriert einen Blocktyp auf dem Server<\/a> unter Verwendung der in der Datei <strong>block.json<\/strong> gespeicherten Metadaten.<\/p>\n<p>Die Funktion ben\u00f6tigt zwei Parameter:<\/p>\n<ul>\n<li>Der Name des Blocktyps einschlie\u00dflich Namespace oder ein Pfad zu dem Ordner, in dem sich die <strong>block.json<\/strong>-Datei befindet, oder ein vollst\u00e4ndiges <code>WP_Block_Type<\/code>-Objekt<\/li>\n<li>Ein Array von Blocktyp-Argumenten<\/li>\n<\/ul>\n<p>Im obigen Code gibt die <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">magische Konstante<\/a> <code>__DIR__<\/code> den aktuellen Ordner zur\u00fcck. Das bedeutet, dass sich die Datei <strong>block.json<\/strong> im Unterordner <em>\/build<\/em> befindet.<\/p>\n<h3 id=\"package-json\">Die Datei package.json<\/h3>\n<p>In der <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">Datei package.json<\/a> werden JavaScript-Eigenschaften und Skripte f\u00fcr dein Projekt definiert. Hier kannst du deine Projektabh\u00e4ngigkeiten installieren.<\/p>\n<p>Um besser zu verstehen, wof\u00fcr diese Datei gedacht ist, \u00f6ffne sie mit deinem <a href=\"https:\/\/kinsta.com\/de\/blog\/kostenlose-html-editoren\/\">bevorzugten Code-Editor<\/a>:<\/p>\n<pre><code class=\"language-json\">{\n\t\"name\": \"ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"author\": \"Kinsta Students\",\n\t\"license\": \"GPL-2.0-or-later\",\n\t\"homepage\": \"https:\/\/kinsta.com\/\",\n\t\"main\": \"build\/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build\",\n\t\t\"format\": \"wp-scripts format\",\n\t\t\"lint:css\": \"wp-scripts lint-style\",\n\t\t\"lint:js\": \"wp-scripts lint-js\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"wp-scripts plugin-zip\",\n\t\t\"start\": \"wp-scripts start\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@wordpress\/scripts\": \"^24.1.0\"\n\t},\n\t\"dependencies\": {\n\t\t\"classnames\": \"^2.3.2\"\n\t}\n}<\/code><\/pre>\n<p>Die <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">Eigenschaft<\/a> <code>scripts<\/code> ist ein <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">W\u00f6rterbuch mit Befehlen<\/a>, die zu verschiedenen Zeiten im <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">Lebenszyklus eines Pakets<\/a> mit <code>npm run [cmd]<\/code> ausgef\u00fchrt werden.<\/p>\n<p>In diesem Artikel werden wir die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">folgenden Befehle<\/a> verwenden:<\/p>\n<ul>\n<li><code>npm run build<\/code> \u2014 erstellt einen (komprimierten) Produktions-Build<\/li>\n<li><code>npm run start<\/code> oder <code>npm start<\/code> \u2014 erstellt einen (unkomprimierten) Entwicklungs-Build<\/li>\n<\/ul>\n<p><code>dependencies<\/code> und <code>devDependencies<\/code> sind zwei Objekte, die einen <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">Paketnamen auf eine Version<\/a> abbilden. <code>dependencies<\/code> werden in der Produktion ben\u00f6tigt, w\u00e4hrend <code>devDependences<\/code> nur f\u00fcr die lokale Entwicklung ben\u00f6tigt werden (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">mehr dazu<\/a>).<\/p>\n<p>Die einzige Standardabh\u00e4ngigkeit ist das Paket <code>@wordpress\/scripts<\/code>, das als &#8222;eine Sammlung von wiederverwendbaren Skripten f\u00fcr die WordPress-Entwicklung&#8220; <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">definiert ist<\/a>.<\/p>\n<h3 id=\"block-json\">Die block.json-Datei<\/h3>\n<p>Seit WordPress 5.8 ist die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">Metadaten-Datei<\/a> <strong>block.json<\/strong> der <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-5-8\/#block-api-enhancements\">klassische Weg, um Blocktypen zu registrieren<\/a>.<\/p>\n<p>Eine <strong>block.json<\/strong>-Datei bietet mehrere Vorteile, darunter eine <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">bessere Leistung<\/a> und eine bessere Sichtbarkeit im <a href=\"https:\/\/wordpress.org\/plugins\/\">WordPress Plugins Directory<\/a><span style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\">:<\/span><\/p>\n<blockquote><p><em>Wenn Themes Lazy Loading Assets unterst\u00fctzen, wird das Enqueuing von Assets bei Bl\u00f6cken, die mit <strong>block.json<\/strong> registriert sind, von vornherein optimiert. Die Frontend-CSS- und JavaScript-Assets, die in den <code>style<\/code> oder <code>script<\/code>-Eigenschaften aufgelistet sind, werden nur dann in die Warteschlange gestellt, wenn der Block auf der Seite vorhanden ist, was zu einer geringeren Seitengr\u00f6\u00dfe f\u00fchrt.<\/em><\/p><\/blockquote>\n<p>Wenn du den Befehl <code>@wordpress\/create-block<\/code> ausf\u00fchrst, wird die folgende <strong>block.json<\/strong>-Datei erstellt:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<p>Hier ist die vollst\u00e4ndige Liste der <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">Standardeigenschaften<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> &#8211; die Version der vom Block verwendeten API (die aktuelle Version ist 2)<\/li>\n<li><code>name<\/code> &#8211; ein eindeutiger Bezeichner f\u00fcr einen Block einschlie\u00dflich eines Namensraums<\/li>\n<li><code>version<\/code> &#8211; die aktuelle Version eines Blocks<\/li>\n<li><code>title<\/code> &#8211; ein Anzeigetitel f\u00fcr einen Block<\/li>\n<li><code>category<\/code> &#8211; eine Blockkategorie<\/li>\n<li><code>icon<\/code> &#8211; ein <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a>-Slogan oder ein benutzerdefiniertes SVG-Symbol<\/li>\n<li><code>description<\/code> &#8211; eine kurze Beschreibung, die im Blockinspektor angezeigt wird<\/li>\n<li><code>supports<\/code> &#8211; eine Reihe von Optionen zur Steuerung der im Editor verwendeten Funktionen<\/li>\n<li><code>textdomain<\/code> &#8211; die Textdomain des Plugins<\/li>\n<li><code>editorScript<\/code> &#8211; Definition des Editor-Skripts<\/li>\n<li><code>editorStyle<\/code> &#8211; Definition des Editorstils<\/li>\n<li><code>style<\/code> &#8211; bietet alternative Stile f\u00fcr einen Block<\/li>\n<\/ul>\n<p>Zus\u00e4tzlich zu den oben aufgef\u00fchrten Eigenschaften kannst (und wirst) du ein <code>attributes<\/code>-Objekt definieren, das Informationen \u00fcber die in deinem Block gespeicherten Daten enth\u00e4lt. In deiner <strong>block.json<\/strong> kannst du eine beliebige Anzahl von Attributen in <em>Schl\u00fcssel\/Wert<\/em>-Paaren festlegen, wobei der Schl\u00fcssel der Attributname und der Wert die Attributdefinition ist.<\/p>\n<p>Sieh dir das folgende Beispiel f\u00fcr eine Attributdefinition an:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"array\",\n\t\t\"source\": \"children\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"link\": { \n\t\t\"type\": \"string\", \n\t\t\"default\": \"https:\/\/kinsta.com\" \n\t}\n},<\/code><\/pre>\n<p>Wir werden <a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#block-json-at-work\">sp\u00e4ter in diesem Artikel<\/a> n\u00e4her auf die Datei <strong>block.json<\/strong> eingehen, aber du kannst auch im Handbuch f\u00fcr den Block-Editor nachschauen, um mehr \u00fcber die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">Metadaten<\/a> und <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Attribute<\/a> der Datei <strong>block.json<\/strong> zu erfahren.<\/p>\n<h3 id=\"src-folder\">Der src-Ordner<\/h3>\n<p>Der Ordner <code>src<\/code> ist der Ort, an dem die Entwicklung stattfindet. In diesem Ordner findest du die folgenden Dateien:<\/p>\n<ul>\n<li><strong>index.js<\/strong><\/li>\n<li><strong>edit.js<\/strong><\/li>\n<li><strong>save.js<\/strong><\/li>\n<li><strong>editor.scss<\/strong><\/li>\n<li><strong>style.scss<\/strong><\/li>\n<\/ul>\n<h4>index.js<\/h4>\n<p>Die Datei <strong>index.js<\/strong> ist dein Startpunkt. Hier importierst du Abh\u00e4ngigkeiten und registrierst den Blocktyp auf dem Server:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from '@wordpress\/blocks';\n\nimport '.\/style.scss';\n\nimport Edit from '.\/edit';\nimport save from '.\/save';\nimport metadata from '.\/block.json';\n\nregisterBlockType( metadata.name, {\n\t\/**\n\t * @see .\/edit.js\n\t *\/\n\tedit: Edit,\n\n\t\/**\n\t * @see .\/save.js\n\t *\/\n\tsave,\n} );<\/code><\/pre>\n<p>Die erste Anweisung importiert die Funktion <code>registerBlockType<\/code> aus dem <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">Paket<\/a> <code>@wordpress\/blocks<\/code>. Die folgenden <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">Importanweisungen<\/a> importieren das Stylesheet sowie die Funktionen <span style=\"color: #ff0000\"><code>Edit<\/code><\/span> und <span style=\"color: #ff0000\"><code>save<\/code><\/span> und ein Metadatenobjekt aus der Datei <em>block.json<\/em>.<\/p>\n<p>Mit der Funktion <code>registerBlockType<\/code> wird die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">Komponente auf dem Client registriert<\/a>. Die Funktion ben\u00f6tigt zwei Parameter: einen Blocknamen und ein Blockkonfigurationsobjekt.<\/p>\n<p>Die Funktion <code>Edit<\/code> liefert die Blockschnittstelle, wie sie im Blockeditor dargestellt wird, w\u00e4hrend die Funktion <code>save<\/code> die Struktur liefert, die serialisiert und in der Datenbank gespeichert wird (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">mehr dazu<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p>In <strong>edit.js<\/strong> baust du die Blockverwaltungsoberfl\u00e4che auf:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p {...useBlockProps()}&gt;\n\t\t\t{__('My First Block \u2013 hello from the editor!', 'my-first-block')}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Zun\u00e4chst importiert es die Funktion <code>__<\/code> aus dem Paket <code>@wordpress\/i18n<\/code> (dieses Paket enth\u00e4lt eine JavaScript-Version der \u00dcbersetzungsfunktionen), den <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">React-Hook<\/a> <code><a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">useBlockProps<\/a><\/code> und die Datei <code>editor.scss<\/code>.<\/p>\n<p>Danach exportiert sie die React-Komponente (lies mehr \u00fcber <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">Import<\/a>&#8211; und <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">Export<\/a>-Anweisungen).<\/p>\n<h4>save.js<\/h4>\n<p>In der Datei <strong>save.js<\/strong> bauen wir die Blockstruktur auf, die in der Datenbank gespeichert werden soll:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\n\nexport default function save() {\n\treturn (\n\t\t&lt;p {...useBlockProps.save()}&gt;\n\t\t\t{__(\n\t\t\t\t'My First Block \u2013 hello from the saved content!',\n\t\t\t\t'my-first-block'\n\t\t\t)}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<h4>editor.scss and style.scss<\/h4>\n<p>Neben den Skripten befinden sich zwei <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a>-Dateien in den <strong>src<\/strong>-Ordnern. Die Datei <strong>editor.scss<\/strong> enth\u00e4lt die Stile, die auf den Block im Kontext des Editors angewendet werden, w\u00e4hrend die Datei <strong>style.scss<\/strong> die Stile des Blocks f\u00fcr die Anzeige <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">im Frontend und im Editor<\/a> enth\u00e4lt. Im zweiten Teil dieses Leitfadens werden wir diese Dateien genauer unter die Lupe nehmen.<\/p>\n<h3 id=\"node_modules-build\">The node_modules and build Folders<\/h3>\n<p>Der Ordner <code>node_modules<\/code> enth\u00e4lt die Node-Module und ihre Abh\u00e4ngigkeiten. Wir werden nicht n\u00e4her auf die Node-Pakete eingehen, da es den Rahmen dieses Artikels sprengen w\u00fcrde, aber du kannst in <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">diesem Artikel mehr dar\u00fcber lesen, wo npm die Pakete installiert<\/a>.<\/p>\n<p>Der <code>build<\/code>-Ordner enth\u00e4lt die JS- und CSS-Dateien, die w\u00e4hrend des Build-Prozesses entstehen. In den Anleitungen zur <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext-Syntax<\/a> und zum <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">JavaScript-Build-Setup<\/a> kannst du tiefer in den Build-Prozess eintauchen.<\/p>\n<h2>Das Projekt: Baue deinen ersten Gutenberg-Block<\/h2>\n<p>Jetzt wird es Zeit, sich die H\u00e4nde schmutzig zu machen. In diesem Abschnitt lernst du, wie du ein Plugin erstellst, das einen CTA-Block mit dem Namen Kinsta Academy Block bereitstellt.<\/p>\n<p>Der Block wird aus zwei Spalten bestehen, mit einem Bild auf der linken Seite und einem Textabsatz auf der rechten Seite. Unter dem Text wird eine Schaltfl\u00e4che mit einem anpassbaren Link platziert:<\/p>\n<figure id=\"attachment_137853\" aria-describedby=\"caption-attachment-137853\" style=\"width: 1502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-137853 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/custom-block-final-2.jpg\" alt=\"Der Blocktyp, den du in diesem Leitfaden lernen wirst zu bauen.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">Der Blocktyp, den du in diesem Leitfaden lernen wirst zu bauen.<\/figcaption><\/figure>\n<p>Dies ist nur ein einfaches Beispiel, aber es erm\u00f6glicht uns, die Grundlagen der Gutenberg-Blockentwicklung zu vermitteln. Sobald du die Grundlagen verstanden hast, kannst du mit Hilfe des <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Block Editor Handbook<\/a> und anderer umfangreicher Ressourcen mehr und komplexere Gutenberg-Bl\u00f6cke erstellen.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Der Code der Beispiele in diesem Tutorial ist auch auf <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">Gist zu deiner Information verf\u00fcgbar<\/a>.<\/p>\n<\/aside>\n\n<p>Vorausgesetzt, du hast die neueste Version von WordPress auf deiner lokalen Entwicklungsumgebung laufen, erf\u00e4hrst du hier, was du von jetzt an lernen wirst:<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">Wie man das Starter Block Plugin einrichtet<\/a><\/li>\n<li><a href=\"#block-json-at-work\">json bei der Arbeit<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Eingebaute Komponenten verwenden: Die RichText-Komponente<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">Hinzuf\u00fcgen von Steuerelementen zur Block-Symbolleiste<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Die Sidebar f\u00fcr die Blockeinstellungen anpassen<\/a><\/li>\n<li><a href=\"#external-link\">Hinzuf\u00fcgen und Anpassen eines externen Links<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">Hinzuf\u00fcgen mehrerer Blockstile<\/a><\/li>\n<li><a href=\"#innerblocks-component\">Verschachtelung von Bl\u00f6cken mit der InnerBlocks-Komponente<\/a><\/li>\n<li><a href=\"#additional-improvements\">Zus\u00e4tzliche Verbesserungen<\/a><\/li>\n<\/ul>\n<p>Auf die Pl\u00e4tze&#8230; fertig&#8230; los!<\/p>\n<h3 id=\"set-up-the-plugin\">So richtest du das Starter Block Plugin ein<\/h3>\n<p>Starte dein Command-Line Tool und navigiere zum Ordner <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<figure id=\"attachment_105130\" aria-describedby=\"caption-attachment-105130\" style=\"width: 1224px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105130 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/new-terminal-at-folder.jpg\" alt=\"Neues Terminal im Ordner in Mac OS.\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">Neues Terminal im Ordner in Mac OS.<\/figcaption><\/figure>\n<p>F\u00fchre nun den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Dieser Befehl generiert die PHP-, SCSS- und JS-Dateien f\u00fcr die Registrierung eines Blocks im interaktiven Modus, so dass du die notwendigen Daten f\u00fcr deinen Block einfach hinzuf\u00fcgen kannst. F\u00fcr unser Beispiel verwenden wir die folgenden Angaben:<\/p>\n<ul>\n<li><strong>Template-Variante<\/strong>: static<\/li>\n<li><strong>Block-Slug<\/strong>: ka-example-block<\/li>\n<li><strong>Interner Namespace<\/strong>: ka-example-block<\/li>\n<li><strong>Titel der Blockanzeige<\/strong>: Kinsta Academy Block<\/li>\n<li><strong>Kurze Blockbeschreibung<\/strong>: Ein Beispielblock f\u00fcr Kinsta Academy-Sch\u00fcler<\/li>\n<li><strong>Dashicon<\/strong>: superhero-alt<\/li>\n<li><strong>Kategoriename<\/strong>: Widgets<\/li>\n<li><strong>Willst du das WordPress-Plugin anpassen?<\/strong>: ja<\/li>\n<li><strong>Die Startseite des Plugins<\/strong>: https:\/\/kinsta.com\/<\/li>\n<li><strong>Aktuelle Plugin-Version<\/strong>: 0.1.0<\/li>\n<li><strong>Plugin-Autor<\/strong>: dein Name<\/li>\n<li><strong>Lizenz<\/strong>: &#8211;<\/li>\n<li><strong>Link zum Lizenztext<\/strong>: &#8211;<\/li>\n<li><strong>Benutzerdefinierter Domain-Pfad f\u00fcr \u00dcbersetzungen<\/strong>: &#8211;<\/li>\n<\/ul>\n<p>Die Installation des Plugins und aller Abh\u00e4ngigkeiten dauert nur ein paar Minuten. Wenn der Vorgang abgeschlossen ist, siehst du die folgende Antwort:<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134076 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"Der Beispielblock wurde installiert und f\u00fcr die Entwicklung registriert.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">Der Beispielblock wurde installiert und f\u00fcr die Entwicklung registriert.<\/figcaption><\/figure>\n<p>F\u00fchre nun den folgenden Befehl im Ordner <strong>\/wp-content\/plugins<\/strong> aus:<\/p>\n<pre><code class=\"language-bash\">cd ka-example-block<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Wenn du deine WordPress-Umgebung betreibst, solltest du zuerst Docker Desktop starten und dann <code>wp-env start<\/code> aus dem Ordner deines Plugins ausf\u00fchren.<\/p>\n<p>Dann kannst du http:\/\/localhost:8888\/wp-login von deinem Webbrowser aus starten und dich mit <strong>Benutzername: admin<\/strong> und <strong>Passwort: password<\/strong> bei deinem WordPress Dashboard anmelden.<\/p>\n<\/aside>\n\n<figure id=\"attachment_105184\" aria-describedby=\"caption-attachment-105184\" style=\"width: 2508px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105184 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/visual-studio-code-terminal.jpg\" alt=\"Befehle aus dem Visual Studio Code Terminal ausf\u00fchren.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">Befehle aus dem Visual Studio Code Terminal ausf\u00fchren.<\/figcaption><\/figure>\n<p>Schlie\u00dflich kannst du im Ordner deines Plugins (in unserem Beispiel <strong>ka-example-block<\/strong>) mit der Entwicklung beginnen:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>\u00d6ffne nun den Plugins-Bildschirm, um das <strong>Kinsta Academy<\/strong> <strong>Block<\/strong> Plugin zu finden und zu aktivieren:<\/p>\n<figure id=\"attachment_133866\" aria-describedby=\"caption-attachment-133866\" style=\"width: 2214px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133866 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/plugins-screen.jpg\" alt=\"Aktiviere den Beispielblock\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Aktiviere den Beispielblock<\/figcaption><\/figure>\n<p>Erstelle einen neuen Beitrag, \u00f6ffne den Block-Inserter und scrolle runter zur Kategorie <strong>Design<\/strong>. Klicke darauf, um den Kinsta Academy-Block hinzuzuf\u00fcgen:<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133869 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"Ein Starterblock, der mit @wordpress\/create-block erstellt wurde.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Ein Starterblock, der mit @wordpress\/create-block erstellt wurde.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json bei der Arbeit<\/h3>\n<p>Wie wir bereits erw\u00e4hnt haben, findet die serverseitige Blockregistrierung in der Haupt-<strong>.php<\/strong>-Datei statt. Allerdings werden wir die Einstellungen nicht in der <strong>.php<\/strong>-Datei festlegen. Stattdessen werden wir die Datei <strong>block.json<\/strong> verwenden.<\/p>\n<p>\u00d6ffne also noch einmal die Datei <strong>block.json<\/strong> und sieh dir die Standardeinstellungen genauer an:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<h4><strong>Skripte und Stile<\/strong><\/h4>\n<p>Die Eigenschaften <code>editorScript<\/code>, <code>editorStyle<\/code> und <code>style<\/code> geben die relativen Pfade zu den Skripten und Stilen im Frontend und Backend an.<\/p>\n<p>Du musst die hier definierten Skripte und Stile nicht manuell registrieren, denn sie werden von WordPress automatisch registriert und in die Warteschlange gestellt. Um das zu \u00fcberpr\u00fcfen, rufe den Browser-Inspektor auf und \u00f6ffne die Registerkarte <strong>Netzwerk<\/strong>:<\/p>\n<figure id=\"attachment_133870\" aria-describedby=\"caption-attachment-133870\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133870 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Ressourcen in den Chrome DevTools inspizieren.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Ressourcen in den Chrome DevTools inspizieren.<\/figcaption><\/figure>\n<p>Wie du im obigen Bild sehen kannst, wurde unser <strong>index.js<\/strong>-Skript, das sich im <strong>Build<\/strong>-Ordner befindet, regelm\u00e4\u00dfig in die Warteschlange aufgenommen, <strong>ohne dass wir irgendeinen PHP-Code hinzuf\u00fcgen<\/strong> mussten.<\/p>\n<h4>UI Labels<\/h4>\n<p>Die Eigenschaften <code>title<\/code> und <code>description<\/code> liefern die Beschriftungen, die zur Identifizierung des Blocks im Editor ben\u00f6tigt werden:<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133871 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Blockname und Beschreibung in der Blockseitenleiste.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Blockname und Beschreibung in der Blockseitenleiste.<\/figcaption><\/figure>\n<h4>Keywords<\/h4>\n<p>Wie wir bereits erw\u00e4hnt haben, kannst du deine Blockeinstellungen mithilfe von <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">Eigenschaften<\/a> und <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Attributen<\/a> genau konfigurieren. Du kannst zum Beispiel ein oder mehrere <code>keywords<\/code> hinzuf\u00fcgen, um den Nutzern die Suche nach Bl\u00f6cken zu erleichtern:<\/p>\n<pre><code class=\"language-json\">\"keywords\": [ \n\t\t\"kinsta\", \n\t\t\"academy\", \n\t\t\"superhero\" \n\t],<\/code><\/pre>\n<p>Wenn du jetzt &#8222;kinsta&#8220;, &#8222;academy&#8220; oder &#8222;superhero&#8220; in den Quick-Inserter eingibst, wird dir der Editor den Kinsta Academy-Block vorschlagen:<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133969 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"Suche nach einem Block mit einem Keyword im Quick Inserter.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">Suche nach einem Block mit einem Keyword im Quick Inserter.<\/figcaption><\/figure>\n<h4>Lokalisierung<\/h4>\n<p>Wenn du dich fragst, wie die Lokalisierung der Zeichenketten in der JSON-Datei funktioniert, hier ist <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">die Antwort<\/a>:<\/p>\n<blockquote><p><em>In JavaScript kannst du jetzt die Methode <code>registerBlockTypeFromMetadata<\/code> aus dem Paket <code>@wordpress\/blocks<\/code> verwenden, um einen Blocktyp mit den Metadaten aus der Datei <strong>block.json<\/strong> zu registrieren. Alle lokalisierten Eigenschaften werden automatisch in <code>_x<\/code> (aus dem <code>@wordpress\/i18n<\/code>-Paket) Funktionsaufrufe verpackt, \u00e4hnlich wie es in PHP mit <code>register_block_type_from_metadata<\/code> funktioniert. Die einzige Voraussetzung ist, dass du die Eigenschaft <code>textdomain<\/code> in der <strong>block.json<\/strong>-Datei setzt.<\/em><\/p><\/blockquote>\n<p>Hier verwenden wir die Funktion <code>registerBlockType<\/code> anstelle von <code>registerBlockTypeFromMetadata<\/code>, da letztere seit <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a> <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">veraltet ist<\/a>, aber der Mechanismus ist der gleiche.<\/p>\n<h3 id=\"using-richtext-component\">Eingebaute Komponenten verwenden: Die RichText-Komponente<\/h3>\n<p>Die Elemente, aus denen ein Gutenberg-Block besteht, sind React-Komponenten und du kannst \u00fcber die globale Variable <code>wp<\/code> auf diese Komponenten zugreifen. Gib zum Beispiel <code>wp.editor<\/code> in die Konsole deines Browsers ein. Daraufhin erh\u00e4ltst du eine vollst\u00e4ndige Liste der Komponenten, die im Modul <code>wp.editor<\/code> enthalten sind.<\/p>\n<p>Scrolle durch die Liste und errate anhand der Namen, wof\u00fcr die Komponenten gedacht sind.<\/p>\n<p>Auf \u00e4hnliche Weise kannst du die Liste der Komponenten im Modul <code>wp.components<\/code> \u00fcberpr\u00fcfen:<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133970 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"WP-Komponenten\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">WP-Komponenten<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><strong>Modulare Programmierung<\/strong> ist eine Softwareentwicklungstechnik, bei der die Funktionalit\u00e4t eines Programms in unabh\u00e4ngige, austauschbare <strong>Module<\/strong> aufgeteilt wird, so dass jedes Modul alles enth\u00e4lt, was notwendig ist, um nur einen Aspekt der gew\u00fcnschten Funktionalit\u00e4t auszuf\u00fchren (Quelle: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>).<\/p>\n<\/aside>\n\n<p>Gehe nun zur\u00fcck zur Datei <strong>edit.js<\/strong> und schau dir das Skript genauer an:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p { ...useBlockProps() }&gt;\n\t\t\t{ __(\n\t\t\t\t'Kinsta Academy Block \u2013 hello from the editor!',\n\t\t\t\t'ka-example-block'\n\t\t\t) }\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Dieser Code erzeugt einen statischen Block mit einfachem, nicht editierbarem Text. Aber wir k\u00f6nnen die Dinge leicht \u00e4ndern:<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133971 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"Der Startblock im Code-Editor.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">Der Startblock im Code-Editor.<\/figcaption><\/figure>\n<p>Um den Text bearbeitbar zu machen, musst du das aktuelle <code>&lt;p&gt;<\/code>-Tag durch eine Komponente ersetzen, die den eingegebenen <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">Inhalt bearbeitbar macht<\/a>. Daf\u00fcr bietet Gutenberg die integrierte <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">RichText-Komponente<\/a>.<\/p>\n<p>Das Hinzuf\u00fcgen einer eingebauten Komponente zu deinem Block ist ein Prozess mit 5 Schritten:<\/p>\n<ol>\n<li><a href=\"#import-components\">Importiere die ben\u00f6tigten Komponenten aus einem WordPress-Paket<\/a><\/li>\n<li><a href=\"#jsx-elements\">F\u00fcge die entsprechenden Elemente in deinen JSX-Code ein<\/a><\/li>\n<li><a href=\"#define-attributes\">Definiere die notwendigen Attribute in der Datei block.json<\/a><\/li>\n<li><a href=\"#define-event-handlers\">Definiere Ereignishandler<\/a><\/li>\n<li><a href=\"#save-data\">Speichere Daten<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Schritt 1: Importiere die ben\u00f6tigten Komponenten aus einem WordPress-Paket<\/h4>\n<p>\u00d6ffne nun die Datei <strong>edit<\/strong>.<strong>js<\/strong> und \u00e4ndere die folgende <code>import<\/code>-Anweisung:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>&#8230;zu:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>Auf diese Weise importierst du die Funktion <code>useBlockProps<\/code> und die <code>RichText<\/code>-Komponente aus dem Paket <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p>Der React-Hook <code><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">useBlockProps<\/a><\/code> markiert das <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">Wrapper-Element des Blocks<\/a>:<\/p>\n<blockquote><p><em>Wenn du die API-Version 2 verwendest, musst du den neuen <code>useBlockProps<\/code>-Haken in der Bearbeitungsfunktion des Blocks verwenden (<code>edit<\/code>), um das Wrapper-Element des Blocks zu markieren. Der Hook f\u00fcgt die Attribute und Event-Handler ein, die f\u00fcr das Verhalten des Blocks ben\u00f6tigt werden. Alle Attribute, die du an das Blockelement \u00fcbergeben m\u00f6chtest, m\u00fcssen \u00fcber <code>useBlockProps<\/code> \u00fcbergeben werden und der zur\u00fcckgegebene Wert muss auf das Element verteilt werden.<\/em><\/p><\/blockquote>\n<p>Vereinfacht gesagt, weisen <code>useBlockProps<\/code> dem Wrapper-Element (in unserem Beispiel dem <code>p<\/code>-Element) automatisch Attribute und Klassen zu:<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133973 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"Elemente und Klassen, die von useBlockProps erzeugt werden.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Elemente und Klassen, die von useBlockProps erzeugt werden.<\/figcaption><\/figure>\n<p>Wenn du <code>useBlockProps<\/code> aus dem Wrapper-Element entfernst, h\u00e4ttest du einen einfachen Textstring ohne Zugriff auf die Blockfunktionalit\u00e4t und den Stil:<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133974 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"Derselbe Block ohne useBlockProps.\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">Derselbe Block ohne useBlockProps.<\/figcaption><\/figure>\n<p>Wie wir <a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#additional-improvements\">sp\u00e4ter noch erkl\u00e4ren<\/a> werden, kannst du <code>useBlockProps<\/code> auch ein Objekt mit Eigenschaften \u00fcbergeben, um die Ausgabe anzupassen.<\/p>\n<h5>RichText<\/h5>\n<p>Die RichText-Komponente bietet eine <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">inhaltsver\u00e4nderbare<\/a> Eingabe, die es den Nutzern erm\u00f6glicht, den Inhalt zu bearbeiten und zu formatieren.<\/p>\n<p>Du findest die Komponente auf GitHub unter <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">gutenberg\/packages\/block-editor\/src\/components\/rich-text\/README.md<\/a> dokumentiert.<\/p>\n<h4 id=\"jsx-elements\">Schritt 2: F\u00fcge die entsprechenden Elemente in deinen JSX-Code ein<\/h4>\n<pre><code class=\"language-jsx\">...\n\nconst blockProps = useBlockProps();\n\nreturn (\n\t&lt;RichText \n\t\t{ ...blockProps }\n\t\ttagName=\"p\"\n\t\tonChange={ onChangeContent }\n\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\tvalue={ attributes.content }\n\t\tplaceholder={ __( 'Write your text...' ) }\n\t\/&gt;\n);<\/code><\/pre>\n<p>Lass uns den Code Zeile f\u00fcr Zeile kommentieren:<\/p>\n<ul>\n<li><code>tagName<\/code> &#8211; der Tag-Name des bearbeitbaren HTML-Elements<\/li>\n<li><code>onChange<\/code> &#8211; Funktion, die aufgerufen wird, wenn sich der Inhalt des Elements \u00e4ndert<\/li>\n<li><code>allowedFormats<\/code> &#8211; ein Array der erlaubten Formate. Standardm\u00e4\u00dfig sind alle Formate erlaubt<\/li>\n<li><code>value<\/code> &#8211; der HTML-String, der editierbar gemacht werden soll<\/li>\n<li><code>placeholder<\/code> &#8211; Platzhaltertext, der angezeigt wird, wenn das Element leer ist<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Schritt 3: Definiere die notwendigen Attribute in der Datei block.json<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Attribute<\/a> liefern Informationen \u00fcber die in einem Block gespeicherten Daten, wie z. B. Rich Content, Hintergrundfarbe, URLs usw.<\/p>\n<p>Du kannst eine beliebige Anzahl von Attributen in einem <code>attributes<\/code>-Objekt in Schl\u00fcssel\/Wert-Paaren festlegen, wobei der Schl\u00fcssel der Attributname und der Wert die Attributdefinition ist.<\/p>\n<p>\u00d6ffne nun die Datei <strong>block.json<\/strong> und f\u00fcge die folgenden <code>attributes<\/code> prop:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t}\n},<\/code><\/pre>\n<p>Das Attribut <code>content<\/code> erm\u00f6glicht es, den vom Benutzer in das bearbeitbare Feld eingegebenen Text zu speichern:<\/p>\n<ul>\n<li><code>type<\/code> gibt den Typ der Daten an, die in dem Attribut gespeichert werden. Der Typ ist erforderlich, es sei denn, du definierst eine <code>enum<\/code>-Eigenschaft.<\/li>\n<li><code>source<\/code> legt fest, wie der Attributwert aus dem Inhalt des Beitrags extrahiert wird. In unserem Beispiel ist es der HTML-Inhalt. Wenn du keine Quelleigenschaft angibst, werden die Daten im Blockbegrenzer gespeichert (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">mehr dazu<\/a>).<\/li>\n<li><code>selector<\/code> ist ein HTML-Tag oder ein anderer Selektor, z. B. ein Klassenname oder ein id-Attribut.<\/li>\n<\/ul>\n<p>Wir werden der <code>Edit<\/code>-Funktion ein Objekt mit Eigenschaften \u00fcbergeben. Gehe also zur\u00fcck zur Datei <strong>edit.js<\/strong> und nimm die folgende \u00c4nderung vor:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Schritt 4: Ereignishandler definieren<\/h4>\n<p>Das <code>RichText<\/code>-Element hat ein <code>onChange<\/code>-Attribut, das eine Funktion bereitstellt, die aufgerufen wird, wenn sich der Inhalt des Elements \u00e4ndert.<\/p>\n<p>Definieren wir diese Funktion und sehen wir uns das gesamte <strong>edit.js<\/strong>-Skript an:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\n\treturn (\n\t\t&lt;RichText \n\t\t\t{ ...blockProps }\n\t\t\ttagName=\"p\"\n\t\t\tonChange={ onChangeContent }\n\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\tvalue={ attributes.content }\n\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Speichere nun die Datei und gehe zur\u00fcck in dein WordPress Dashboard, erstelle einen neuen Beitrag oder eine neue Seite und f\u00fcge deinen benutzerdefinierten Block hinzu:<\/p>\n<figure id=\"attachment_134001\" aria-describedby=\"caption-attachment-134001\" style=\"width: 2618px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134001 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/rich-text-component.jpg\" alt=\"Die Ausgabe der RichText-Komponente im Block-Editor.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">Die Ausgabe der RichText-Komponente im Block-Editor.<\/figcaption><\/figure>\n<p>F\u00fcge etwas Text hinzu und wechsle in die Codeansicht. So sollte dein Code aussehen:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\"&gt;Kinsta Academy Block \u2013 hello from the saved content!&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<p>Wie du sehen kannst, hat sich der Inhalt deines Blocks ge\u00e4ndert, wenn du zum Code Editor wechselst. Das liegt daran, dass du die Datei <strong>save.js<\/strong> \u00e4ndern musst, um die Benutzereingaben in der Datenbank zu speichern, wenn der Beitrag gespeichert wird.<\/p>\n<h4 id=\"save-data\">Schritt 5: Daten speichern<\/h4>\n<p>\u00d6ffne nun die Datei <strong>save.js<\/strong> und \u00e4ndere das Skript wie folgt:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Das ist es, was wir hier tun:<\/p>\n<ul>\n<li>Importiere die <code>RichText<\/code>-Komponente aus dem <code>block-editor<\/code>-Paket.<\/li>\n<li>\u00dcbergib mehrere Eigenschaften \u00fcber ein Objektargument an die <code>save<\/code>-Funktion (in diesem Beispiel \u00fcbergeben wir nur die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\">Eigenschaft <code>attributes<\/code><\/a>)<\/li>\n<li>Gib den Inhalt der <code>RichText<\/code>-Komponente zur\u00fcck<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Wenn du die Speicherfunktion \u00e4nderst, musst du jeden Block im Editor-Canvas l\u00f6schen und ihn wieder einf\u00fcgen, damit er richtig funktioniert. Lies mehr \u00fcber die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">Blockvalidierung<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_134002\" aria-describedby=\"caption-attachment-134002\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134002 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-content-in-the-code-editor.jpg\" alt=\"Der Inhalt des Blocks wurde in der Datenbank gespeichert.\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">Der Inhalt des Blocks wurde in der Datenbank gespeichert.<\/figcaption><\/figure>\n<p>Du kannst mehr \u00fcber die <code>RichText<\/code>-Komponente im <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Handbuch f\u00fcr den Block-Editor<\/a> lesen und die <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">vollst\u00e4ndige Liste der Requisiten auf Github<\/a> finden.<\/p>\n<p>Jetzt gehen wir noch einen Schritt weiter. Im n\u00e4chsten Abschnitt erf\u00e4hrst du, wie du der Blocksymbolleiste Steuerelemente hinzuf\u00fcgst.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">Hinzuf\u00fcgen von Steuerelementen zur Blocksymbolleiste<\/h3>\n<p>Die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">Blocksymbolleiste<\/a> enth\u00e4lt eine Reihe von Steuerelementen, mit denen du Teile des Blockinhalts bearbeiten kannst. F\u00fcr jedes Steuerelement der Symbolleiste findest du eine Komponente:<\/p>\n<figure id=\"attachment_134007\" aria-describedby=\"caption-attachment-134007\" style=\"width: 1212px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134007 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/paragraph-toolbar.jpg\" alt=\"Die zentrale Absatzblock-Symbolleiste.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">Die zentrale Absatzblock-Symbolleiste.<\/figcaption><\/figure>\n<p>Du k\u00f6nntest zum Beispiel eine Textausrichtungssteuerung f\u00fcr deinen Block hinzuf\u00fcgen. Dazu musst du nur zwei Komponenten aus dem Paket <code>@wordpress\/block-editor<\/code> importieren.<\/p>\n<p>Wir gehen die gleichen Schritte wie im vorherigen Beispiel durch:<\/p>\n<ol>\n<li>Erforderliche Komponenten aus WordPress-Paketen importieren<\/li>\n<li>F\u00fcge die entsprechenden Elemente in deinen JSX-Code ein<\/li>\n<li>Definiere die notwendigen Attribute in der <strong>block.json<\/strong>-Datei<\/li>\n<li>Definiere Event Handler<\/li>\n<li>Daten speichern<\/li>\n<\/ol>\n<h4>Schritt 1: Importiere BlockControls und AlignmentControl-Komponenten aus @wordpress\/block-editor<\/h4>\n<p>Um der Block-Symbolleiste eine Ausrichtungssteuerung hinzuzuf\u00fcgen, brauchst du zwei Komponenten:<\/p>\n<ul>\n<li><code>BlockControls<\/code> stellt eine dynamische Symbolleiste mit Steuerelementen dar (undokumentiert).<\/li>\n<li><code>AlignmentControl<\/code> stellt ein Dropdown-Men\u00fc dar, das Ausrichtungsoptionen f\u00fcr den ausgew\u00e4hlten Block anzeigt (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">mehr Informationen<\/a>)<\/li>\n<\/ul>\n<p>\u00d6ffnen Sie die Datei <strong>edit.js<\/strong> und bearbeiten Sie die <code>import<\/code>-Anweisung wie unten gezeigt:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls \n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Schritt 2: Hinzuf\u00fcgen der Elemente BlockControls und AlignmentControl<\/h4>\n<p>Gehen Sie zur Funktion <code>Edit<\/code> und f\u00fcgen Sie das Element <code>&lt;BlockControls \/&gt;<\/code> auf der gleichen Ebene wie <code>&lt;RichText \/&gt;<\/code> ein. F\u00fcgen Sie dann <code>&lt;AlignmentControl \/&gt;<\/code> innerhalb von <code>&lt;BlockControls \/&gt;<\/code> hinzu:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Im obigen Code sind <code>&lt;&gt;<\/code> und <code>&lt;\/&gt;<\/code> die kurze Syntax f\u00fcr die Deklaration von <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">React-Fragmenten<\/a>, mit denen wir mehrere Elemente in React zur\u00fcckgeben.<\/p>\n<p>In diesem Beispiel hat <code>AlignmentControl<\/code> zwei Attribute:<\/p>\n<ul>\n<li><code>value<\/code> liefert den aktuellen Wert f\u00fcr das Element<\/li>\n<li><code>onChange<\/code> liefert einen <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">Event-Handler<\/a>, der ausgef\u00fchrt wird, wenn sich der Wert \u00e4ndert<\/li>\n<\/ul>\n<p>Wir haben auch zus\u00e4tzliche Attribute f\u00fcr das <code>RichText<\/code>-Element definiert (siehe die <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">vollst\u00e4ndige Liste der Attribute mit Beispielen<\/a>)<\/p>\n<h4>Schritt 3: Definieren Sie das Attribut align in block.json<\/h4>\n<p>Gehen Sie nun zur Datei <strong>block.json<\/strong> und f\u00fcgen Sie das Attribut <code>align<\/code> hinzu:<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>Wenn du fertig bist, gehe zur\u00fcck zum Block Editor, aktualisiere die Seite und w\u00e4hle den Block aus. Du solltest eine Fehlermeldung innerhalb deines Blocks sehen.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134008 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt=\"Der Block zeigt eine Fehlermeldung an\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">Der Block zeigt eine Fehlermeldung an<\/figcaption><\/figure>\n<p>Der Grund daf\u00fcr ist, dass wir unseren Event-Handler noch nicht definiert haben.<\/p>\n<h4>Schritt 4: Definiere die Ereignishandler<\/h4>\n<p>Definiere nun <code>onChangeAlign<\/code>:<\/p>\n<pre><code class=\"language-js\">const onChangeAlign = ( newAlign ) =&gt; {\n\tsetAttributes( { \n\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t} )\n}<\/code><\/pre>\n<p>Wenn <code>newAlign<\/code> undefiniert (<code>undefined<\/code>) ist, setzen wir <code>newAlign<\/code> auf <code>none<\/code>. Andernfalls verwenden wir <code>newAlign<\/code>.<\/p>\n<p>Unser <strong>edit.js<\/strong>-Skript sollte nun (vorerst) fertig sein:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Jetzt kannst du zur\u00fcck zum Editor gehen und den Inhalt des Blocks ausrichten. Dein Block sollte jetzt stolz eine Ausrichtungs-Symbolleiste anzeigen.<\/p>\n<figure id=\"attachment_134009\" aria-describedby=\"caption-attachment-134009\" style=\"width: 1772px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134009 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/alignment-toolbar.jpg\" alt=\"Unser Block hat jetzt eine Ausrichtungs-Symbolleiste\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Unser Block hat jetzt eine Ausrichtungs-Symbolleiste<\/figcaption><\/figure>\n<p>Wenn du den Beitrag speicherst, wirst du jedoch feststellen, dass der Inhalt deines Blocks im Frontend nicht so ausgerichtet ist wie im Editor. Das liegt daran, dass wir die <span style=\"color: #ff0000\"><code>save<\/code><\/span>-Funktion \u00e4ndern m\u00fcssen, um den Inhalt und die Attribute des Blocks in der Datenbank zu speichern.<\/p>\n<h4>Schritt 5: Daten speichern<\/h4>\n<p>\u00d6ffne <strong>save.js<\/strong> und \u00e4ndere die <code>save<\/code>-Funktion wie folgt:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Um den Code lesbarer zu machen, kannst du die einzelnen Eigenschaften aus dem <code>attribute<\/code>-Objekt extrahieren, indem du die <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">Syntax der Destrukturierungszuweisung<\/a> verwendest:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Das kannst du auch in der Datei <strong>edit.js<\/strong> machen.<\/p>\n<p>Speichere nun die Datei und wechsle zum Code Editor. Der Blockcode sollte in etwa so aussehen:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block {\"align\":\"right\"} --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\" style=\"text-align:right\"&gt;This is my first editable &lt;strong&gt;Gutenberg&lt;\/strong&gt; &lt;em&gt;block&lt;\/em&gt; \ud83d\ude0e&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<figure id=\"attachment_134010\" aria-describedby=\"caption-attachment-134010\" style=\"width: 1446px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134010 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-toolbar-controls.jpg\" alt=\"\u00dcberpr\u00fcfen der Steuerelemente der Block-Symbolleiste\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">\u00dcberpr\u00fcfen der Steuerelemente der Block-Symbolleiste<\/figcaption><\/figure>\n<p>Und das war&#8217;s schon! Du hast soeben eine Ausrichtungssteuerung zur Blocksymbolleiste hinzugef\u00fcgt \ud83e\udd13<\/p>\n<p>Mehr \u00fcber die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">Steuerelemente der Blocksymbolleiste<\/a> erf\u00e4hrst du im Handbuch f\u00fcr den Blockeditor.<\/p>\n<h3 id=\"settings-sidebar\">Die Sidebar der Blockeinstellungen anpassen<\/h3>\n<p>Du kannst auch Steuerelemente zur Sidebar f\u00fcr die <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">Blockeinstellungen<\/a> hinzuf\u00fcgen (oder sogar eine neue Sidebar f\u00fcr deine Anwendung erstellen).<\/p>\n<p>Die API bietet daf\u00fcr eine <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\"><code>InspectorControls<\/code>-Komponente<\/a>.<\/p>\n<p>Im Handbuch f\u00fcr den Blockeditor wird erkl\u00e4rt, <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">wie du die Settings Sidebar verwendest<\/a>:<\/p>\n<blockquote><p><em>Die Sidebar f\u00fcr Einstellungen wird verwendet, um weniger h\u00e4ufig genutzte Einstellungen oder Einstellungen, die mehr Platz auf dem Bildschirm ben\u00f6tigen, anzuzeigen. Die Sidebar f\u00fcr Einstellungen sollte nur f\u00fcr Einstellungen auf <strong>Blockebene verwendet werden<\/strong>.<\/em><\/p>\n<p><em>Wenn du Einstellungen hast, die sich nur auf ausgew\u00e4hlte Inhalte innerhalb eines Blocks auswirken (z. B. die Einstellung &#8222;fett&#8220; f\u00fcr ausgew\u00e4hlten Text innerhalb eines Absatzes), solltest du sie nicht in der Sidebar f\u00fcr Einstellungen platzieren. Die Sidebar wird auch dann angezeigt, wenn du einen Block im HTML-Modus bearbeitest, also sollte sie nur Einstellungen auf Blockebene enthalten.<\/em><\/p><\/blockquote>\n<p>Nochmal:<\/p>\n<ol>\n<li>Erforderliche Komponenten aus WordPress-Paketen importieren<\/li>\n<li>F\u00fcge die entsprechenden Elemente in deinen JSX-Code ein<\/li>\n<li>Definiere die notwendigen Attribute in der block.json-Datei<\/li>\n<li>Definiere Event Handler<\/li>\n<li>Daten speichern<\/li>\n<\/ol>\n<h4>Schritt 1. Importiere die Komponenten InspectorControls und PanelColorSettings aus @wordpress\/block-editor<\/h4>\n<p>Du kannst verschiedene Steuerelemente hinzuf\u00fcgen, mit denen die Nutzer bestimmte Aspekte des Blocks anpassen k\u00f6nnen. Du kannst zum Beispiel ein Farbkontrollfeld einrichten. Dazu musst du die Komponenten <code>InspectorControls<\/code> und <code>PanelColorSettings<\/code> aus dem Modul <code>block-editor<\/code> importieren:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls,\n\tInspectorControls,\n\tPanelColorSettings\n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Schritt 2: F\u00fcge die entsprechenden Elemente in deinen JSX-Code ein<\/h4>\n<p>Jetzt kannst du die entsprechenden Elemente in den JSX-Code einf\u00fcgen, der von der <code>Edit<\/code>-Funktion zur\u00fcckgegeben wird:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;InspectorControls&gt;\n\t\t\t\t&lt;PanelColorSettings \n\t\t\t\t\ttitle={ __( 'Color settings', 'ka-example-block' ) }\n\t\t\t\t\tinitialOpen={ false }\n\t\t\t\t\tcolorSettings={ [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: textColor,\n\t\t\t\t\t\t  onChange: onChangeTextColor,\n\t\t\t\t\t\t  label: __( 'Text color', 'ka-example-block' )\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: backgroundColor,\n\t\t\t\t\t\t  onChange: onChangeBackgroundColor,\n\t\t\t\t\t\t  label: __( 'Background color', 'ka-example-block' )\n\t\t\t\t\t\t}\n\t\t\t\t\t] }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/InspectorControls&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Beachte, dass wir auch das <code>style<\/code>-Attribut des <code>RichText<\/code>-Elements aktualisiert haben:<\/p>\n<pre><code class=\"language-jsx\">&lt;RichText \n\t { ...blockProps }\n\t tagName=\"p\"\n\t onChange={ onChangeContent }\n\t allowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t value={ content }\n\t placeholder={ __( 'Write your text...', 'my-affiliate-block' ) }\n\t style={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\/&gt;<\/code><\/pre>\n<h4>Schritt 3: Definiere die notwendigen Attribute in block.json<\/h4>\n<p>Definiere nun die Attribute <code>backgroundColor<\/code> und <code>textColor<\/code> in der Datei <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"backgroundColor\": {\n\t\t\"type\": \"string\"\n\t},\t \n\t\"textColor\": {\n\t\t\"type\": \"string\"\n\t}\n},<\/code><\/pre>\n<h4>Schritt 4: Definiere die Event Handler<\/h4>\n<p>Jetzt musst du zwei Funktionen definieren, um <code>backgroundColor<\/code> und <code>textColor<\/code> bei Benutzereingaben zu aktualisieren:<\/p>\n<pre><code class=\"language-js\">const onChangeBackgroundColor = ( newBackgroundColor ) =&gt; {\n\tsetAttributes( { backgroundColor: newBackgroundColor } )\n}\nconst onChangeTextColor = ( newTextColor ) =&gt; {\n\tsetAttributes( { textColor: newTextColor } )\n}<\/code><\/pre>\n<h4>Schritt 5: Daten speichern<\/h4>\n<p>Ein letzter Schritt: \u00d6ffne die Datei <strong>save.js<\/strong> und \u00e4ndere das Skript wie folgt:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Speichere die Datei und \u00fcberpr\u00fcfe den Block im Editor. Vielleicht findest du eine unliebsame \u00dcberraschung: eine Fehlermeldung, die dich darauf hinweist, dass der Block unerwartete oder ung\u00fcltige Inhalte enth\u00e4lt.<\/p>\n<figure id=\"attachment_134011\" aria-describedby=\"caption-attachment-134011\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134011 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/unexpected-or-invalid-content.jpg\" alt=\"Unerwarteter oder ung\u00fcltiger Inhalt Fehlermeldung\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Unerwarteter oder ung\u00fcltiger Inhalt Fehlermeldung<\/figcaption><\/figure>\n<p>Das passiert, weil die Datei <strong>save.js<\/strong> ge\u00e4ndert wurde und der in der Datenbank gespeicherte Code nicht mit dem im Editor verwendeten Code \u00fcbereinstimmt.<\/p>\n<p>Um dies zu beheben, aktualisiere die Seite, l\u00f6sche eine Instanz deines Blocks und f\u00fcge ihn erneut zu deinem Beitrag hinzu:<\/p>\n<figure id=\"attachment_134012\" aria-describedby=\"caption-attachment-134012\" style=\"width: 1962px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134012 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/color-settings-panel.jpg\" alt=\"Das Farbeinstellungsfeld in der Seitenleiste der Blockeinstellungen\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">Das Farbeinstellungsfeld in der Seitenleiste der Blockeinstellungen<\/figcaption><\/figure>\n<p>Nimm deine \u00c4nderungen vor, speichere den Beitrag und zeige ihn im Frontend an. Jetzt sollten die \u00c4nderungen, die du im Block Editor vorgenommen hast, auf der vorderen Seite zu sehen sein.<\/p>\n<figure id=\"attachment_134013\" aria-describedby=\"caption-attachment-134013\" style=\"width: 1918px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134013 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/custom-settings-applied.jpg\" alt=\"Der benutzerdefinierte Block funktioniert jetzt korrekt im Frontend\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">Der benutzerdefinierte Block funktioniert jetzt korrekt im Frontend<\/figcaption><\/figure>\n<h3 id=\"external-link\">Hinzuf\u00fcgen und Anpassen eines externen Links<\/h3>\n<p>In diesem Abschnitt f\u00fcgst du neue Komponenten zu deinem Blocktyp hinzu:<\/p>\n<ul>\n<li>Eine <code>ExternalLink<\/code>-Komponente, mit der Nutzer einen anpassbaren Link zu deinem benutzerdefinierten Block hinzuf\u00fcgen k\u00f6nnen<\/li>\n<li>Verschiedene Steuerelemente in der Sidebar, mit denen du die Linkeinstellungen anpassen kannst<\/li>\n<\/ul>\n<h4>Schritt 1. Komponenten aus @wordpress\/components importieren<\/h4>\n<p>Jetzt musst du mehrere Komponenten aus <code>@wordpress\/components<\/code> importieren. \u00d6ffne deine edit.js-Datei und f\u00fcge die folgende <code>import<\/code>-Anweisung hinzu:<\/p>\n<pre><code class=\"language-js\">import {\n\tTextControl,\n\tPanelBody,\n\tPanelRow,\n\tToggleControl,\n\tExternalLink\n} from '@wordpress\/components';<\/code><\/pre>\n<ul>\n<li><code><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelbody\">PanelBody<\/a><\/code> f\u00fcgt der Sidebar der Einstellungen einen zusammenklappbaren Container hinzu.<\/li>\n<li><code><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\">PaneRow<\/a><\/code> erzeugt einen generischen Container f\u00fcr Sidebar-Steuerelemente.<\/li>\n<li><code><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\">TextControl<\/a><\/code> ist ein Steuerelement f\u00fcr die Texteingabe.<\/li>\n<li><code><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\">ToggleControl<\/a><\/code> ist ein Toggle, mit dem der Benutzer eine bestimmte Option aktivieren\/deaktivieren kann.<\/li>\n<li><code><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\">ExternalLink<\/a><\/code> ist eine einfache Komponente zum Hinzuf\u00fcgen eines externen Links.<\/li>\n<\/ul>\n<h4>Schritt 2. F\u00fcge die entsprechenden Elemente in deinen JSX-Code ein<\/h4>\n<p>Zuerst f\u00fcgst du das <code>ExternalLink<\/code>-Element auf der gleichen Ebene wie <code>RichText<\/code> in einen <code>div<\/code>-Container ein:<\/p>\n<pre><code class=\"language-jsx\">&lt;div { ...blockProps }&gt;\n\t&lt;RichText \n\t\t...\n\t\/&gt;\n\t&lt;ExternalLink \n\t\thref={ kaLink }\n\t\tclassName=\"ka-button\"\n\t\trel={ hasLinkNofollow ? \"nofollow\" : \"\" }\n\t&gt;\n\t\t\t{ linkLabel }\n\t&lt;\/ExternalLink&gt;\n\n&lt;\/div&gt;<\/code><\/pre>\n<p>Die <code>ExternalLink<\/code>-Komponente ist nicht dokumentiert, also haben wir uns auf die <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">Komponente selbst<\/a> bezogen, um die Liste der verf\u00fcgbaren Attribute zu erhalten. Hier verwenden wir die Attribute <code>href<\/code>, <code>className<\/code> und <code>rel<\/code>.<\/p>\n<p>Standardm\u00e4\u00dfig ist der Wert des Attributs <code>rel<\/code> auf <code>noopener noreferrer<\/code> gesetzt. Unser Code f\u00fcgt das <a href=\"https:\/\/kinsta.com\/de\/blog\/nofollow-links-in-wordpress-hinzufugen\/\"><code>nofollow<\/code> Keyword<\/a> zum <code>rel<\/code>-Attribut des resultierenden <code>a<\/code>-Tags hinzu, wenn die Umschaltfunktion <strong>aktiviert<\/strong> ist.<\/p>\n<p>Jetzt kannst du der Sidebar des Blocks Linkeinstellungen hinzuf\u00fcgen.<\/p>\n<p>Zuerst f\u00fcgst du ein <code>PanelBody<\/code>-Element innerhalb von <code>InspectorControls<\/code> auf der gleichen Ebene wie <code>PanelColorSettings<\/code> hinzu:<\/p>\n<pre><code class=\"language-jsx\">&lt;InspectorControls&gt;\n\t&lt;PanelColorSettings \n\t...\n\t\/&gt;\n\t&lt;PanelBody \n\t\ttitle={ __( 'Link Settings' )}\n\t\tinitialOpen={true}\n\t&gt;\n\t...\n\t&lt;\/PanelBody&gt;\n&lt;\/InspectorControls&gt;<\/code><\/pre>\n<p>So machen wir das hier:<\/p>\n<ol>\n<li>Das Attribut title gibt den <code>title<\/code> des Panels an.<\/li>\n<li><code>initialOpen<\/code> legt fest, ob das Panel anf\u00e4nglich ge\u00f6ffnet ist oder nicht.<\/li>\n<\/ol>\n<p>Als N\u00e4chstes f\u00fcgen wir zwei <code>PanelRow<\/code>-Elemente innerhalb von <code>PanelBody<\/code> und ein <code>TextControl<\/code>-Element innerhalb jeder <code>PanelRow<\/code> ein:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelBody \n\ttitle={ __( 'Link Settings', 'ka-example-block' )}\n\tinitialOpen={true}\n&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'KA link', 'ka-example-block' )}\n\t\t\t\tvalue={ kaLink }\n\t\t\t\tonChange={ onChangeKaLink }\n\t\t\t\thelp={ __( 'Add your Academy link', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'Link label', 'ka-example-block' )}\n\t\t\t\tvalue={ linkLabel }\n\t\t\t\tonChange={ onChangeLinkLabel }\n\t\t\t\thelp={ __( 'Add link label', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>Der obige Code sollte jetzt ziemlich einfach aussehen. Mit den beiden Textsteuerelementen k\u00f6nnen die Benutzer die Linkbezeichnung und die URL festlegen.<\/p>\n<p>Au\u00dferdem f\u00fcgen wir eine zus\u00e4tzliche <code>PanelRow<\/code> mit einem <code>ToggleControl<\/code> hinzu, um eine bestimmte Option ein- oder auszuschalten, z. B. ob ein Attribut enthalten sein soll oder nicht:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelRow&gt;\n\t&lt;fieldset&gt;\n\t\t&lt;ToggleControl\n\t\t\tlabel=\"Add rel = nofollow\"\n\t\t\thelp={\n\t\t\t\thasLinkNofollow\n\t\t\t\t\t? 'Has rel nofollow.'\n\t\t\t\t\t: 'No rel nofollow.'\n\t\t\t}\n\t\t\tchecked={ hasLinkNofollow }\n\t\t\tonChange={ toggleNofollow }\n\t\t\/&gt;\n\t&lt;\/fieldset&gt;\n&lt;\/PanelRow&gt;<\/code><\/pre>\n<h4>Schritt 3: Definiere die notwendigen Attribute in block.json<\/h4>\n<p>Definiere nun die Attribute <code>kaLink<\/code>, <code>linkLabel<\/code> und <code>hasLinkNofollow<\/code> in der Datei <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"kaLink\": {\n\t\"type\": \"string\",\n\t\"default\": \"\"\n},\n\"linkLabel\": {\n\t\"type\": \"string\",\n\t\"default\": \"Check it out!\"\n},\n\"hasLinkNofollow\": {\n\t\"type\": \"boolean\",\n\t\"default\": false\n}<\/code><\/pre>\n<p>Hier gibt es nichts mehr hinzuzuf\u00fcgen! Jetzt geht es an die Definition der <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">Ereignisbehandlungsfunktionen<\/a>.<\/p>\n<h4>Schritt 4: Definiere die Ereignishandler<\/h4>\n<p>Gehe zur\u00fcck zur Datei <strong>edit.js<\/strong>, f\u00fcge die neuen Attribute in das Attribute-Objekt ein und f\u00fcge die folgenden Funktionen hinzu:<\/p>\n<pre><code class=\"language-js\">const { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\nconst onChangeKaLink = ( newKaLink ) =&gt; {\n\tsetAttributes( { kaLink: newKaLink === undefined ? '' : newKaLink } )\n}\n\nconst onChangeLinkLabel = ( newLinkLabel ) =&gt; {\n\tsetAttributes( { linkLabel: newLinkLabel === undefined ? '' : newLinkLabel } )\n}\n\nconst toggleNofollow = () =&gt; {\n\tsetAttributes( { hasLinkNofollow: ! hasLinkNofollow } )\n}<\/code><\/pre>\n<p>Diese Funktionen aktualisieren die entsprechenden Attributwerte bei Benutzereingaben.<\/p>\n<h4>Schritt 5: Daten speichern<\/h4>\n<p>Zuletzt m\u00fcssen wir die Speicherfunktion <code>save<\/code>\u00a0in <strong>save.js<\/strong> aktualisieren:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\t\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t\n\treturn (\n\t\t&lt;div \n\t\t\t{ ...blockProps }\n\t\t\tstyle={ { backgroundColor: backgroundColor } }\n\t\t&gt;\n\t\t\t&lt;RichText.Content \n\t\t\t\ttagName=\"p\" \n\t\t\t\tvalue={ content } \n\t\t\t\tstyle={ { color: textColor } }\n\t\t\t\/&gt;\n\t\t\t&lt;p&gt;\n\t\t\t\t&lt;a \n\t\t\t\t\thref={ kaLink }\n\t\t\t\t\tclassName=\"ka-button\"\n\t\t\t\t\trel={ hasLinkNofollow ? \"nofollow\" : \"noopener noreferrer\" }\n\t\t\t\t&gt;\n\t\t\t\t\t{ linkLabel }\n\t\t\t\t&lt;\/a&gt;\n\t\t\t&lt;\/p&gt;\n\t\t&lt;\/div&gt;\n\t);\n}<\/code><\/pre>\n<p>Beachte, dass wir hier ein normales <code>a<\/code>-Element anstelle von <code>ExternalLink<\/code> verwendet haben.<\/p>\n<p>Das Ergebnis kannst du in der folgenden Abbildung sehen.<\/p>\n<figure id=\"attachment_134015\" aria-describedby=\"caption-attachment-134015\" style=\"width: 1964px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134015 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/link-settings.jpg\" alt=\"Das Link-Einstellungsfeld in der Seitenleiste der Blockeinstellungen\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">Das Link-Einstellungsfeld in der Seitenleiste der Blockeinstellungen<\/figcaption><\/figure>\n<p>Speichere jetzt die Daten und starte deine Umgebung neu.<\/p>\n<h3 id=\"multiple-block-styles\">Hinzuf\u00fcgen mehrerer Blockstile<\/h3>\n<p>Im vorigen Abschnitt hast du gelernt, wie man eine Blocksymbolleiste hinzuf\u00fcgt, mit der man die Benutzereingaben ausrichten kann. Wir k\u00f6nnen der Block-Symbolleiste weitere Stil-Steuerelemente hinzuf\u00fcgen, aber wir k\u00f6nnen auch eine Reihe von vordefinierten Blockstilen bereitstellen, aus denen der Benutzer mit einem einzigen Klick ausw\u00e4hlen kann.<\/p>\n<p>Zu diesem Zweck werden wir eine n\u00fctzliche Funktion der Block-API nutzen: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Blockstile<\/a>.<\/p>\n<p>Alles, was du tun musst, ist, die Eigenschaft <strong>block.json<\/strong> styles zu definieren und die entsprechenden <code>styles<\/code> in deinen Stylesheets zu deklarieren.<\/p>\n<p>Du kannst zum Beispiel die folgende Reihe von Stilen hinzuf\u00fcgen:<\/p>\n<pre><code class=\"language-json\">\"styles\": [\n\t{\n\t\t\"name\": \"default\",\n\t\t\"label\": \"Default\",\n\t\t\"isDefault\": true\n\t},\n\t{\n\t\t\"name\": \"border\",\n\t\t\"label\": \"Border\"\n\t}\n],<\/code><\/pre>\n<p>Damit hast du gerade einen Standardstil und einen zus\u00e4tzlichen Stil namens <code>border<\/code> hinzugef\u00fcgt. Jetzt gehst du zur\u00fcck zum Block-Editor:<\/p>\n<figure id=\"attachment_134064\" aria-describedby=\"caption-attachment-134064\" style=\"width: 1874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134064 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles.jpg\" alt=\"Zwei vorgefertigte Blockstile.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Zwei vorgefertigte Blockstile.<\/figcaption><\/figure>\n<p>Die Stile stehen dem Nutzer zur Verf\u00fcgung, wenn er auf den <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-5-8\/#normalized-block-toolbars\">Blockschalter<\/a> klickt und dann in der Sidebar der <strong>Blockeinstellungen<\/strong> nach dem <strong>Bereich Stile<\/strong> sucht.<\/p>\n<p>W\u00e4hle einen Stil aus und \u00fcberpr\u00fcfe die Klassen, die auf das <code>p<\/code>-Element angewendet werden. Klicke mit der rechten Maustaste auf den Block und w\u00e4hle <strong>Untersuchen<\/strong>. Es wurde eine neue Klasse mit einem Namen hinzugef\u00fcgt, der wie folgt aufgebaut ist:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Wenn du den Stil &#8222;Border&#8220; ausgew\u00e4hlt hast, wird dem <code>p<\/code>-Element die Klasse <code>is-style-border<\/code> hinzugef\u00fcgt. Wenn du den Stil &#8222;Standard&#8220; ausgew\u00e4hlt hast, wird stattdessen eine <code>is-style-default<\/code>-Klasse hinzugef\u00fcgt.<\/p>\n<p>Jetzt musst du nur noch die CSS-Eigenschaften deklarieren. \u00d6ffne die Datei <strong>editor.scss<\/strong> und ersetze die aktuellen Stile durch die folgenden:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Jetzt kannst du das Gleiche mit <strong>style.scss<\/strong> machen. Wie wir bereits erw\u00e4hnt haben, werden die in <strong>style.scss<\/strong> definierten Stile sowohl im Frontend als auch im Editor angewendet:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n\t&.is-style-default{\n\t\tborder: 0;\n        background-color: #FFE2C7;\n\t}\n\t&.is-style-border{\n\t\tborder: 2px solid #000;\n        border-radius: 16px;\n        background-color: #F6F6F6;\n\t}\n}<\/code><\/pre>\n<p>Halte den Prozess an (^C) und f\u00fchre <code>npm run start<\/code> erneut aus.<\/p>\n<p>Und das war&#8217;s schon! Aktualisiere die Seite und hab Spa\u00df mit deinen neuen Blockstilen:<\/p>\n<figure id=\"attachment_134067\" aria-describedby=\"caption-attachment-134067\" style=\"width: 1876px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134067 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles-compared.jpg\" alt=\"Blockstile im Vergleich\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Blockstile im Vergleich<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Verschachtelte Gutenberg-Bl\u00f6cke mit der InnerBlocks-Komponente<\/h3>\n<p>Obwohl unser benutzerdefinierter Block voll funktionsf\u00e4hig ist, ist er immer noch nicht sehr ansprechend. Um es f\u00fcr das Publikum ansprechender zu machen, k\u00f6nnten wir ein Bild hinzuf\u00fcgen.<\/p>\n<p>Zum Gl\u00fcck musst du das Rad aber nicht neu erfinden, denn Gutenberg bietet eine spezielle Komponente, mit der du eine Struktur aus <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">verschachtelten Bl\u00f6cken<\/a> erstellen kannst.<\/p>\n<p>Die <code>InnerBlocks<\/code>-Komponente ist <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">wie folgt definiert<\/a>:<\/p>\n<blockquote><p><em><code>InnerBlocks<\/code> exportiert ein Paar Komponenten, die in Blockimplementierungen verwendet werden k\u00f6nnen, um verschachtelte Blockinhalte zu erm\u00f6glichen.<\/em><\/p><\/blockquote>\n<p>Zuerst musst du eine neue <strong>.js<\/strong>-Datei im Ordner <strong>src<\/strong> erstellen. In unserem Beispiel nennen wir diese Datei <strong>container.js<\/strong>.<\/p>\n<p>Nun musst du die neue Ressource in die Datei <strong>index.js<\/strong> importieren:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>Gehe zur\u00fcck zu <strong>container.js<\/strong> und importiere die notwendigen Komponenten:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from \"@wordpress\/blocks\";\nimport { __ } from \"@wordpress\/i18n\";\nimport {\n\tuseBlockProps, \n\tInnerBlocks \n} from \"@wordpress\/block-editor\";<\/code><\/pre>\n<p>Der n\u00e4chste Schritt ist die Definition eines Templates, das die Struktur vorgibt, in der die Bl\u00f6cke platziert werden sollen. Im folgenden Beispiel definieren wir ein Template, das aus zwei Spalten besteht, die einen Kernblock &#8222;Bild&#8220; und unseren benutzerdefinierten Block enthalten:<\/p>\n<pre><code class=\"language-js\">const TEMPLATE = [ [ 'core\/columns', { backgroundColor: 'yellow', verticalAlignment: 'center' }, [\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'core\/image' ],\n\t] ],\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'ka-example-block\/ka-example-block', { placeholder: 'Enter side content...' } ],\n\t] ],\n] ] ];<\/code><\/pre>\n<p>Das Template ist als <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">Array von blockTypes<\/a> (Blockname und optionale Attribute) aufgebaut.<\/p>\n<p>Im obigen Code haben wir mehrere Attribute verwendet, um die Bl\u00f6cke Columns und Column zu konfigurieren. Das Attribut <code>templateLock: 'all'<\/code> sperrt die Spaltenbl\u00f6cke, so dass der Benutzer keine Bl\u00f6cke hinzuf\u00fcgen, neu anordnen oder l\u00f6schen kann. <code>templateLock<\/code> kann einen der folgenden Werte annehmen:<\/p>\n<ul>\n<li><code>all<\/code> &#8211; <code>InnerBlocks<\/code> ist gesperrt, und es k\u00f6nnen keine Bl\u00f6cke hinzugef\u00fcgt, umgeordnet oder entfernt werden.<\/li>\n<li><code>insert<\/code> &#8211; Bl\u00f6cke k\u00f6nnen nur umsortiert oder entfernt werden.<\/li>\n<li><code>false<\/code> &#8211; Das Template ist nicht gesperrt.<\/li>\n<\/ul>\n<p>Das Template wird dann dem <code>InnerBlocks<\/code>-Element zugewiesen:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>Um Kompatibilit\u00e4tsprobleme zu vermeiden, haben wir au\u00dferdem ein <code>TemplateLock<\/code>-Attribut zur <code>InnerBlocks<\/code>-Komponente hinzugef\u00fcgt (siehe auch Issue #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> und Pull #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Hier ist unsere endg\u00fcltige <strong>container.js<\/strong>-Datei:<\/p>\n<pre><code class=\"language-jsx\">registerBlockType('ka-example-block\/ka-example-container-block', {\n\ttitle: __( 'KA Container block', 'ka-example-block' ),\n\tcategory: 'design',\n\n\tedit( { className } ) {\n\t\t\n\t\treturn(\n\t\t\t&lt;div className={ className }&gt;\n\t\t\t\t&lt;InnerBlocks\n\t\t\t\t\ttemplate={ TEMPLATE }\n\t\t\t\t\ttemplateLock=\"all\"\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n\n\tsave() {\n\t\tconst blockProps = useBlockProps.save();\n\t\treturn(\n\t\t\t&lt;div { ...blockProps }&gt;\n\t\t\t\t&lt;InnerBlocks.Content \/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n});<\/code><\/pre>\n<figure id=\"attachment_134068\" aria-describedby=\"caption-attachment-134068\" style=\"width: 2060px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134068 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-final.jpg\" alt=\"Der endg\u00fcltige Block im Block Editor\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">Der endg\u00fcltige Block im Block Editor<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Zus\u00e4tzliche Verbesserungen<\/h3>\n<p>Unser Block ist voll funktionsf\u00e4hig, aber wir k\u00f6nnten ihn mit ein paar kleinen \u00c4nderungen noch ein wenig verbessern.<\/p>\n<p>Wir haben das Attribut <code>backgroundColor<\/code> dem Absatz zugewiesen, der von der <code>RichText<\/code>-Komponente erzeugt wird. Wir k\u00f6nnten es jedoch vorziehen, die Hintergrundfarbe dem Container-<code>div<\/code> zuzuweisen:<\/p>\n<p>\u00c4ndere also die Datei <strong>edit.js<\/strong> und die <code>div<\/code>s <strong>save.js<\/strong> wie folgt:<\/p>\n<pre><code class=\"language-jsx\">&lt;div \n\t{ ...blockProps }\n\tstyle={ { backgroundColor: backgroundColor } }\n&gt;\n...\n&lt;\/div&gt;<\/code><\/pre>\n<p>Damit kann der Benutzer den Hintergrund des gesamten Blocks \u00e4ndern.<\/p>\n<p>Eine wichtigere \u00c4nderung betrifft jedoch die Methode <code>useBlockProps<\/code>. Im urspr\u00fcnglichen Code haben wir die Konstante <code>blockProps<\/code> wie folgt definiert:<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Aber wir k\u00f6nnen <code>useBlockProps<\/code> noch effektiver nutzen, indem wir eine <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">Reihe von Eigenschaften \u00fcbergeben<\/a>. Zum Beispiel k\u00f6nnen wir <code>classnames<\/code> aus dem <code>classnames<\/code>-Modul importieren und den Namen der Wrapper-Klasse entsprechend festlegen.<\/p>\n<p>Im folgenden Beispiel weisen wir einen Klassennamen zu, der auf dem Wert des Attributs <code>align<\/code> (<strong>edit.js<\/strong>) basiert.s<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function Edit( { attributes, setAttributes } ) {\n\t...\n\t\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Die gleiche \u00c4nderung nehmen wir in der Datei <strong>save.js<\/strong> vor:<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function save( { attributes } ) {\n\t...\n\tconst blockProps = useBlockProps.save({\n\t\tclassName: classnames( {\n\t\t\t[ `has-text-align-${ align }` ]: align,\n\t\t} )\n\t});\n\t...\n}<\/code><\/pre>\n<p>Und das war&#8217;s schon! Du kannst jetzt den <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">Build f\u00fcr die Produktion ausf\u00fchren<\/a>.<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Zusammenfassung<\/h2>\n<p>Und hier sind wir nun, am Ende dieser unglaublichen Reise! Wir haben mit der Konfiguration der Entwicklungsumgebung begonnen und schlie\u00dflich einen kompletten Blocktyp erstellt.<\/p>\n<p>Wie wir in der Einleitung erw\u00e4hnt haben, sind solide Kenntnisse in Node.js, Webpack, Babel und React unerl\u00e4sslich, um fortgeschrittene Gutenberg-Bl\u00f6cke zu erstellen und sich als professioneller Gutenberg-Entwickler auf dem Markt zu positionieren.<\/p>\n<p>Du musst aber keine fundierte React-Erfahrung haben, um Spa\u00df an der Blockentwicklung zu haben. Die Entwicklung von Bl\u00f6cken kann dich motivieren und dir Ziele setzen, um immer umfassendere Kenntnisse \u00fcber die Technologien hinter den Gutenberg-Bl\u00f6cken zu erwerben.<\/p>\n<p>Dieser Leitfaden ist daher bei weitem nicht vollst\u00e4ndig. Es ist lediglich eine Einleitung in eine Vielzahl von Themen, die dir helfen werden, deine ersten Gutenberg-Bl\u00f6cke zu erstellen.<\/p>\n<p>Deshalb empfehlen wir dir, dein Wissen zu vertiefen, indem du die Online-Dokumentation und Anleitungen sorgf\u00e4ltig liest. Unter den vielen Ressourcen, die es da drau\u00dfen gibt, empfehlen wir die folgenden:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Offizielles Tutorial zum Erstellen eines Blocks<\/a> f\u00fcr Anf\u00e4nger<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Offizielles Block-Tutorial<\/a> f\u00fcr fortgeschrittene Entwickler<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Dynamische Bl\u00f6cke<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/dynamische-bloecke\/\">Wie man dynamische Bl\u00f6cke f\u00fcr Gutenberg erstellt<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Meta-Boxen<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Erstellen einer Sidebar f\u00fcr dein Plugin<\/a><\/li>\n<\/ul>\n<p>Wenn du gerade erst mit der WordPress-Entwicklung beginnst, m\u00f6chtest du vielleicht die grundlegenden Konzepte der Frontend-Entwicklung verstehen. Hier ist eine kurze Liste von Ressourcen, die dir den Einstieg erleichtern k\u00f6nnen:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/de\/ebooks\/wordpress\/wordpress-lokale-entwicklung\/\">Wie man WordPress lokal installiert<\/a> (kostenloses Ebook)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/ebooks\/wordpress\/verwaltetes-wordpress-hosting\/\">Der wahre Wert von Managed WordPress Hosting<\/a> (kostenloses Ebook)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-javascript\/\">Was ist JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/html-vs-html5\/\">HTML vs. HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-css\/\">Wie bearbeite ich CSS in WordPress?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-php\/\">Was ist PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-hooks\/\">Das WordPress Hooks Bootcamp: Wie man Aktionen, Filter und benutzerdefinierte Hooks verwendet<\/a><\/li>\n<\/ul>\n<p>Und vergiss nicht, dass der komplette Code der Beispiele dieses Leitfadens auf <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">Gist verf\u00fcgbar<\/a> ist.<\/p>\n<p>Jetzt bist du an der Reihe: Hast du schon Gutenberg-Bl\u00f6cke entwickelt? Was sind die gr\u00f6\u00dften Schwierigkeiten, die du bisher erlebt hast? Lass uns in den Kommentaren von deinen Erfahrungen wissen!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viele beschweren sich \u00fcber die H\u00fcrden, die der Einstieg in die Erstellung von Gutenberg-Bl\u00f6cken und -Apps mit sich bringt. Die Lernkurve ist steil, was vor allem &#8230;<\/p>\n","protected":false},"author":36,"featured_media":44088,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[501,420,52],"topic":[999],"class_list":["post-44070","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg","topic-wordpress-entwicklung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung<\/title>\n<meta name=\"description\" content=\"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung\" \/>\n<meta property=\"og:description\" content=\"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-29T10:46:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:26:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"49\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung\",\"datePublished\":\"2021-10-29T10:46:24+00:00\",\"dateModified\":\"2023-08-24T10:26:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\"},\"wordCount\":8309,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"articleSection\":[\"WordPress Entwicklung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\",\"name\":\"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png\",\"datePublished\":\"2021-10-29T10:46:24+00:00\",\"dateModified\":\"2023-08-24T10:26:04+00:00\",\"description\":\"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png\",\"width\":1460,\"height\":730,\"caption\":\"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress Entwicklung\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/wordpress-entwicklung\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/de\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung","description":"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/","og_locale":"de_DE","og_type":"article","og_title":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung","og_description":"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.","og_url":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2021-10-29T10:46:24+00:00","article_modified_time":"2023-08-24T10:26:04+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Carlo Daniele","Gesch\u00e4tzte Lesezeit":"49\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung","datePublished":"2021-10-29T10:46:24+00:00","dateModified":"2023-08-24T10:26:04+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/"},"wordCount":8309,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png","keywords":["Block Editor","development","Gutenberg"],"articleSection":["WordPress Entwicklung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/","url":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/","name":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png","datePublished":"2021-10-29T10:46:24+00:00","dateModified":"2023-08-24T10:26:04+00:00","description":"Gutenberg-Bl\u00f6cke zu bauen, kann anfangs entmutigend wirken. Aber das ist es nicht! Diese ausf\u00fchrliche Anleitung zeigt dir, wie du deinen ersten WP-Block erstellst.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/10\/gutenberg-blocke.png","width":1460,"height":730,"caption":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"WordPress Entwicklung","item":"https:\/\/kinsta.com\/de\/thema\/wordpress-entwicklung\/"},{"@type":"ListItem","position":3,"name":"Benutzerdefinierte Gutenberg-Bl\u00f6cke erstellen: Das ultimative Tutorial zur Blockentwicklung"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/de\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/44070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=44070"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/44070\/revisions"}],"predecessor-version":[{"id":62866,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/44070\/revisions\/62866"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/translations\/se"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/44070\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/44088"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=44070"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=44070"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=44070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}