{"id":40688,"date":"2021-11-11T10:40:07","date_gmt":"2021-11-11T09:40:07","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=40688&#038;preview=true&#038;preview_id=40688"},"modified":"2023-08-07T08:24:37","modified_gmt":"2023-08-07T06:24:37","slug":"gutenberg-blokken","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/","title":{"rendered":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen"},"content":{"rendered":"<p>Veel mensen klagen dat het lastig is om aan de slag te gaan met het bouwen van Gutenberg blokken en -apps. De leercurve is steil, voornamelijk omdat het moeilijk is de ontwikkelomgeving te installeren en configureren. Daarnaast zijn een gedegen kennis van JavaScript, Node.js, React en Redux onmisbare ingredi\u00ebnten voor dit vrij complexe recept.<\/p>\n<p>Het offici\u00eble <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">WordPress Block Editor handboek<\/a> biedt ontwikkelaars een enorme hoeveelheid informatie, maar het kan zijn dat je verdwaalt in de zee van details.<\/p>\n<p>En het is de moeite waard om te vermelden wat Mat\u00edas Ventura, hoofdarchitect van het Gutenberg project, meldde in <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">zijn interview met WP Tavern<\/a>:<\/p>\n<blockquote><p><em>Hoewel er mensen zijn die het snel kunnen leren, is het nog steeds een grote barri\u00e8re voor mensen. Ik denk dat er verschillende lagen zijn; documentatie zou zowel qua organisatie als presentatie een orde van grootte beter kunnen zijn. Ik hoop dat we daar nog veel kunnen doen.<\/em><\/p><\/blockquote>\n<p>Met dat in gedachten hebben we besloten om een \u200b\u200bstapsgewijze tutorial aan te bieden om onze lezers te helpen aan de slag te gaan met de ontwikkeling van Gutenberg blokken.<\/p>\n<p>Klinkt interessant? Laten we erin duiken!<\/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>Vereisten voor Gutenberg blokontwikkeling<\/h2>\n<p>Voor deze tutorial zijn de enige vereiste vaardigheden een goede kennis van de ontwikkeling van WordPress plugins en ten minste een <a href=\"https:\/\/kinsta.com\/nl\/blog\/html-best-practices\/\">basiskennis van HTML<\/a>, CSS, JavaScript en React.<\/p>\n<p>Wordt dit een ambitieus project? Reken daar maar op!<\/p>\n<p>Het was niet eenvoudig om het juiste compromis tussen volledigheid en eenvoud te vinden of te beslissen welke onderwerpen wel en niet moesten worden opgenomen.<\/p>\n<p>Hopelijk zullen gemiddelde en gevorderde lezers ons vergeven dat we niet diep in bepaalde concepten zijn gedoken, zoals de <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">React-status<\/a>, <a href=\"https:\/\/redux.js.org\/api\/store\">Redux-winkel<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">hoogwaardige componenten<\/a>, enzovoort. Deze onderwerpen vereisen extra ruimte en aandacht en zijn waarschijnlijk te geavanceerd voor het ontwikkelen van beginnende blokken (tenzij je een React-ontwikkelaar bent).<\/p>\n<p>Om dezelfde reden zullen we enkele van de meer geavanceerde onderwerpen met betrekking tot de ontwikkeling van Gutenberg blokken, zoals <a href=\"https:\/\/kinsta.com\/nl\/blog\/dynamische-blokken\/\">dynamische blokken<\/a> en <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">metaboxen<\/a>, niet behandelen.<\/p>\n<p>Met de kennis die je aan het einde van dit artikel opdoet, kun je meteen beginnen met plezier maken en productief zijn.<\/p>\n<p>Als je eenmaal aan de slag gaat met het bouwen van blokken, ben je klaar om je vaardigheden verder te verbeteren en zelf nog geavanceerdere Gutenberg blokken te bouwen.<\/p>\n\n<h2>Wat is een Gutenberg blok?<\/h2>\n<p>Sinds de release in december 2018 is de <a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-wordpress-editor\/\">Block Editor<\/a> in alle opzichten sterk verbeterd: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">krachtigere API&#8217;s<\/a>, een geavanceerdere gebruikersinterface, verbeterde bruikbaarheid, een heleboel nieuwe blokken, <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">de eerste implementaties van Full Site Editing<\/a> en nog veel meer.<\/p>\n<p>Kortom, Gutenberg is nog volop in ontwikkeling en heeft al een lange weg afgelegd, maar desalniettemin is de Bock Editor een volwaardige kandidaat als een betrouwbare, functionele pagina- en sitebouwer.<\/p>\n<p>Vanuit het oogpunt van een ontwikkelaar is Gutenberg een op React gebaseerde <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">Single Page Application<\/a> (SPA) waarmee WordPress gebruikers inhoud in WordPress kunnen maken, bewerken en verwijderen. Dit zou je echter niet moeten doen denken aan een verbeterde versie van de <a href=\"https:\/\/kinsta.com\/blog\/wordpress-tinymce-editor\/\">traditionele inhoudseditor<\/a>.<\/p>\n<p>Dit willen we duidelijk maken:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg is <em>geen<\/em> gewone WYSIWYG editor. Het herdefinieert eerder de hele bewerkingservaring in WordPress.<\/strong><\/p>\n<\/aside>\n\n<p>In Gutenberg is de inhoud verdeeld in blokken, dit zijn &#8216;stenen&#8217; die gebruikers kunnen gebruiken om berichten en pagina&#8217;s of hun volledige websites te maken.<\/p>\n<p>Maar wat is technisch gezien een blok?<\/p>\n<p>We zijn wel fan van de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">definitie van WordPress:<\/a><\/p>\n<blockquote><p><em>&#8220;Blok&#8221; is de abstracte term die wordt gebruikt om eenheden van opmaak te beschrijven die, samengesteld, de inhoud of layout van een webpagina vormen. Het idee combineert concepten van wat we tegenwoordig in WordPress bereiken met shortcodes, aangepaste HTML en embed discovery in een enkele consistente API en gebruikerservaring.<\/em><\/p><\/blockquote>\n<p>Titels, alinea&#8217;s, kolommen, afbeeldingen, galerijen en alle elementen waaruit de interface van de editor bestaat, van zijbalkpanelen tot blokbesturingselementen, zijn React componenten.<\/p>\n<p>Maar wat zijn React componenten? W3Schools geeft de <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">volgende definitie<\/a>:<\/p>\n<blockquote><p><em>Componenten zijn onafhankelijke en herbruikbare stukjes code. Ze hebben hetzelfde doel als JavaScript functies, maar werken afzonderlijk en retourneren HTML via een <\/em><em><code>render()<\/code>\u00a0<\/em><em>functie.<\/em><\/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=\"Werken met Gutenberg blokken in WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Werken met Gutenberg blokken in WordPress 5.8.<\/figcaption><\/figure>\n<p>Hoewel de bewerkingservaring van Gutenberg nieuw is in vergelijking met de klassieke WordPress editor, verandert de manier waarop WordPress je stukken inhoud in de database opslaat niet. Dat komt omdat Gutenberg een applicatie is die binnen WordPress werkt, maar de manier waarop het CMS in de kern werkt niet verandert.<\/p>\n<p>Artikelen (en dit zijn berichten, pagina&#8217;s en aangepaste berichttypen) die met Gutenberg zijn gemaakt, worden nog steeds opgeslagen in de <code>wp_posts<\/code>\u00a0tabel, precies zoals met de klassieke editor.<\/p>\n<p>Maar in een bericht dat met Gutenberg is gemaakt, vind je extra stukjes informatie in de tabel die een fundamenteel verschil vertegenwoordigen tussen berichten die zijn gemaakt via de klassieke editor versus Gutenberg.<\/p>\n<p>Deze stukjes informatie zien eruit als HTML opmerkingen en hebben een specifieke functie: scheidingsblokken.<\/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=\"Een blogbericht in de Code editor.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Een blogbericht in de Code editor.<\/figcaption><\/figure>\n<p><strong>Blokscheidingstekens<\/strong> vertellen WordPress welk blok op het scherm moet worden weergegeven. Ze bieden ook waarden voor blokeigenschappen in een JSON object. Die rekwisieten bepalen de manier waarop het blok op het scherm moet worden weergegeven:<\/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=\"Een blogbericht opgeslagen in de wp_poststabel.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Een blogbericht opgeslagen in de <code>wp_posts<\/code> tabel.<\/figcaption><\/figure>\n<h2>Je WordPress ontwikkelomgeving instellen<\/h2>\n<p>Het opzetten van een moderne JavaScript ontwikkelomgeving vereist een gedegen kennis van geavanceerde technologie\u00ebn zoals <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">React<\/a> en <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>, etc.<\/p>\n<p>Ge\u00efntimideerd? Niet nodig! De WordPress community is te hulp gekomen door krachtige tools te bieden waarmee je een rommelig handmatig configuratieproces kunt vermijden.<\/p>\n<p>Om het simpel te houden, behandelen we <a href=\"https:\/\/kinsta.com\/nl\/blog\/transpilen-php\/\">transpilen<\/a> niet in dit artikel (wat we toch aanraden om jezelf vertrouwd mee te maken als je eenmaal de basis van blokontwikkeling hebt geleerd). In plaats daarvan introduceren we twee alternatieve tools die je kunt gebruiken om binnen enkele minuten snel en eenvoudig een moderne JavaScript ontwikkelomgeving op te zetten. Het is aan jou om degene te kiezen die je het handigst vindt voor je project.<\/p>\n<p>Het opzetten van een JavaScript ontwikkelomgeving om Gutenberg blokken te bouwen is een proces in drie stappen:<\/p>\n<ol>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#node-npm\">Installeer Node.js en npm<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#dev-environment\">Stel de ontwikkelomgeving in<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#block-plugin\">Stel de blokplugin in<\/a><\/li>\n<\/ol>\n<p>Laten we beginnen.<\/p>\n<h3 id=\"node-npm\">1. Installeer Node.js en npm<\/h3>\n<p>Voordat je je ontwikkelomgeving installeert en je eerste blok registreert, moet je <a href=\"https:\/\/kinsta.com\/it\/knowledgebase\/node-js\/\">Node.js<\/a> en de Node-pakketmanager (npm) installeren.<\/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> is een JavaScript runtime die is gebouwd op de V8 JavaScript engine van Chrome. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, algemeen bekend als de Node package manager, wordt beschouwd als &#8220;&#8217;s werelds grootste softwareregister.&#8221;<\/p>\n<\/aside>\n\n<p>Je kunt <a href=\"https:\/\/kinsta.com\/nl\/blog\/node-js-installeren\/\">Node.js en npm<\/a> op <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">verschillende manieren installeren<\/a>. Maar eerst wil je misschien controleren of de software al op je computer is ge\u00efnstalleerd.<\/p>\n<p>Om dit te doen, start je de terminal en voer je de volgende opdracht uit:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Als het resultaat <code>command not found<\/code> is, is Node.js niet op je computer ge\u00efnstalleerd en kun je doorgaan met de installatie.<\/p>\n<p>Voor dit artikel hebben we de eenvoudigste installatie-optie gekozen, namelijk de <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Het enige wat je hoeft te doen is de versie te downloaden die overeenkomt met je besturingssysteem en de installatiewizard te 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 downloadpagina.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">Node.js downloadpagina.<\/figcaption><\/figure>\n<p>Nadat je Node.js hebt ge\u00efnstalleerd, voer je de opdracht <code>node -v<\/code> opnieuw in je terminal uit. Je kunt ook de opdracht <code>nmp -v<\/code> uitvoeren om te bevestigen dat het npm pakket beschikbaar is.<\/p>\n<p>Je bent nu uitgerust met de volgende tools:<\/p>\n<ul>\n<li>De <code>npx<\/code> Node.js package runner. Hiermee kun je een\u00a0<code>npm<\/code> opdracht uitvoeren zonder deze eerst te installeren.<\/li>\n<li>De <code>npm<\/code> Node.js package manager (<a href=\"https:\/\/docs.npmjs.com\/\">zie documenten<\/a>). Dit wordt gebruikt om dependencies te installeren en scripts uit te voeren.<\/li>\n<\/ul>\n<p>De volgende stap is het installeren van de ontwikkelomgeving.<\/p>\n<h3 id=\"dev-environment\">2. Stel je ontwikkelomgeving in<\/h3>\n<p>Zodra je de nieuwste versies van Node.js en npm op je lokale computer hebt staan, heb je een ontwikkelomgeving voor WordPress nodig.<\/p>\n<p>Je kunt een lokale ontwikkelomgeving zoals DevKinsta of de offici\u00eble WordPress tool gebruiken. Laten we een kijkje nemen naar beide opties.<\/p>\n<h4 id=\"devkinsta\">Optie 1: Lokale ontwikkelomgeving (DevKinsta)<\/h4>\n<p>Met slechts een paar klikken kun je <a href=\"https:\/\/kinsta.com\/nl\/ebooks\/wordpress\/wordpress-lokale-ontwikkeling\/\">WordPress lokaal installeren<\/a> met <a href=\"https:\/\/kinsta.com\/nl\/devkinsta\/\">DevKinsta<\/a>, onze moderne lokale WordPress ontwikkeltool. Of je kunt kiezen voor een andere lokale ontwikkelingstool, zoals <a href=\"https:\/\/kinsta.com\/nl\/blog\/lokale-wordpress-installatie\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> of <a href=\"https:\/\/kinsta.com\/nl\/blog\/lokale-wordpress-installatie\/#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=\"Maak een nieuwe WordPress website in DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Maak een nieuwe WordPress website in DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Optie 2: wp-env<\/h4>\n<p>Je kunt ook kiezen voor de offici\u00eble <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\/\"><code>wp-env<\/code> -tool<\/a>, die een lokale WordPress ontwikkelomgeving biedt die je rechtstreeks vanaf de opdrachtregel kunt starten. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">definieert het als volgt<\/a>:<\/p>\n<blockquote><p><em>Lokale WordPress omgevingen zijn nu net zo eenvoudig als het uitvoeren van een enkele opdracht. <\/em><code><em>wp-env<\/em><\/code><em>\u00a0is een nulconfiguratietool voor pijnloze lokale WordPress omgevingen. Het biedt vele<\/em><em>\u00a0opties, zodat gebruikers WordPress snel kunnen opstarten zonder tijd te verspillen. Het doel is inderdaad om deze omgevingen voor iedereen gemakkelijk toegankelijk te maken &#8211; of je nu een ontwikkelaar, ontwerper, manager of iemand anders bent.<\/em><\/p><\/blockquote>\n<p>Als je besluit om het eens te proberen, vereist het installeren van <code>wp-env<\/code>\u00a0minimale inspanning. Volg gewoon deze stappen:<\/p>\n<h5>Stap 1: Bevestig de installatie van Docker en Node.js<\/h5>\n<p>Om aan de technische vereisten te voldoen, moetje eerst zowel <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> als Node.js op je computer hebben ge\u00efnstalleerd. Dat komt omdat <code>wp-env<\/code> een Docker instantie maakt waarop een WordPress website wordt uitgevoerd. Alle wijzigingen die in de code worden aangebracht, worden onmiddellijk weergegeven in de WordPress instantie.<\/p>\n<h5>Stap 2: Installeer <code>@wordpress\/env<\/code> vanaf de opdrachtregel<\/h5>\n<p>Met Docker en Node.js op je computer kun je doorgaan en de WordPress <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">ontwikkelomgeving installeren<\/a>.<\/p>\n<p>Je kunt <code>wp-env<\/code> wereldwijd of lokaal installeren. Om het wereldwijd te doen, moet je de volgende opdracht uitvoeren vanuit de map met plugins (meer hierover in het onderstaande berichtvenster &#8220;Belangrijk&#8221;):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>Laten we dat opsplitsen:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">installeert het pakket<\/a>.<\/li>\n<li><code>-g<\/code> toegevoegd aan de opdracht <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">installeert het opgegeven pakket wereldwijd<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> is het <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\/\">pakket dat je gaat installeren<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Standaard worden op Mac of Linux node pakketten ge\u00efnstalleerd in <strong>\/usr\/local\/lib\/node_modules.<\/strong><\/p>\n<p>Als de huidige gebruiker geen schrijfrechten heeft voor die map, wordt een EACCES foutmelding gegeven. Lees meer over het <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">oplossen van EACCES toegangsfouten bij het wereldwijd installeren van pakketten<\/a><\/p>\n<\/aside>\n\n<p>Voer de volgende opdracht uit om te bevestigen dat <code>wp-env<\/code>\u00a0is ge\u00efnstalleerd:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Je zou de huidige <code>wp-env<\/code> versie moeten zien, wat betekent dat je de omgeving nu kunt starten met de volgende opdracht uit <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">van je plugin\u2019s map:<\/a><\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Je hebt toegang tot het WordPress dashboard via de volgende link:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>De standaardreferenties zijn als volgt:<\/p>\n<ul>\n<li>Gebruikersnaam: <code>admin<\/code><\/li>\n<li>Wachtwoord: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Stel je blokplugin in<\/h3>\n<p>Nu heb je een startblok plugin nodig om op voort te bouwen. Maar in plaats van handmatig een plugin voor ontwikkelingsblokken te maken met alle benodigde bestanden en mappen, kun je eenvoudig een dev-tool uitvoeren die alle bestanden en configuraties biedt die je nodig hebt om aan de slag te gaan met blokontwikkeling.<\/p>\n<p>Nogmaals, je hebt een aantal opties om uit te kiezen. Laten we ze eens bekijken.<\/p>\n<h4 id=\"create-block\">Optie 1: een blokplugin instellen met @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> is de offici\u00eble nulconfiguratietool voor het maken van Gutenberg blokken:<\/p>\n<blockquote><p><em>Create Block is een officieel ondersteunde manier om blokken te maken voor het registreren van een blok voor een WordPress plugin. Het biedt een moderne build-setup zonder configuratie. Het genereert PHP, JS, CSS code en al het andere dat je nodig hebt om het project te starten.<\/em><\/p>\n<p>Het is grotendeels ge\u00efnspireerd op de <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Dikke pluim voor <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, het hele Facebookteam en de React community.<\/p><\/blockquote>\n<p>Zodra je lokale omgeving actief is, kun je een startblok instellen door simpelweg de <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">opdracht<\/a>\u00a0<code>npx @wordpress\/create-block<\/code>\u00a0uit te voeren, en het zal alle bestanden en mappen bieden die je nodig hebt om de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">plugin-steiger te maken<\/a> en een nieuw blok te registreren .<\/p>\n<p>Laten we een test uitvoeren om te zien hoe het werkt.<\/p>\n<p>Navigeer vanuit je opdrachtregelprogramma naar de map <strong>\/wp-content\/plugins\/<\/strong> en voer de volgende opdracht uit:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>Wanneer er wordt gevraagd om te bevestigen, voer je <code>y<\/code> in om door te gaan:<\/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=\"Een blok maken met @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Een blok maken met @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Het proces duurt enkele ogenblikken. Wanneer het voltooid is, zou je het volgende antwoord moeten krijgen:<\/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=\"De blokplugin is gemaakt.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">De blokplugin is gemaakt.<\/figcaption><\/figure>\n<p>En dat is alles!<\/p>\n<p>Start nu je WordPress ontwikkelomgeving en ga naar het scherm <strong>Plugins<\/strong>\u00a0in het WordPress dashboard. Een nieuwe plugin met de naam &#8220;My First Block&#8221; zou aan je pluginlijst moeten zijn toegevoegd:<\/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=\"De blokplugin is succesvol ge\u00efnstalleerd.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">De blokplugin is succesvol ge\u00efnstalleerd.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Alsje de <code>wp-env<\/code>\u00a0tool gebruikt en <code>wp-env start<\/code> uitvoert vanuit de map die de plugin bevat, wordt de plugin automatisch gemount en geactiveerd. Als je <code>wp-env start<\/code>\u00a0vanuit een andere directory uitvoert, wordt een generieke WordPress omgeving gemaakt (zie ook <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress Development Site<\/a>).<\/p>\n<\/aside>\n\n<p>Activeer indien nodig de plugin, maak een nieuwe blogpost, scrol omlaag in de blokinvoeger naar het gedeelte <strong>Widgets<\/strong>\u00a0en selecteer je nieuwe blok:<\/p>\n<figure id=\"attachment_134071\" aria-describedby=\"caption-attachment-134071\" style=\"width: 2190px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134071\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt=\"Een voorbeeldblok gemaakt met @wordpress\/create-block.\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Een voorbeeldblok gemaakt met @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Ga nu terug naar de terminal en verander de huidige directory in <strong>my-first-block<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>Voer vervolgens de volgende opdracht uit:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Hierdoor kun je de plugin in de ontwikkelingsmodus uitvoeren. Om de productiecode te maken, moet je de volgende opdracht gebruiken:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Optie 2: een blokplugin instellen met create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> is een externe ontwikkelingstool voor het bouwen van Gutenberg blokken:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code><\/em><em>is een nulconfiguratie dev-toolkit (#0CJS) om WordPress Gutenberg blokken in enkele minuten te ontwikkelen zonder React, webpack, ES6\/7\/8\/Next, ESLint, Babel, etc. te configureren.<\/em><\/p><\/blockquote>\n<p>Net als de offici\u00eble <code>create-block<\/code>\u00a0tool, is <code>create-guten-block<\/code> gebaseerd op de <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a> en kan het je helpen om zonder gedoe je eerste blokplugin te genereren.<\/p>\n<p>De toolkit biedt alles wat je nodig hebt om een \u200b\u200bmoderne WordPress plugin te maken, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">inclusief het volgende<\/a>:<\/p>\n<ul>\n<li>Ondersteuning voor React, JSX en ES6-syntaxis.<\/li>\n<li>webpack dev\/productie bouwproces achter de schermen.<\/li>\n<li>Taalextra&#8217;s buiten ES6 zoals de <a href=\"https:\/\/kinsta.com\/nl\/blog\/spread-operator-javascript\/\">objectspreidingsoperator<\/a>.<\/li>\n<li>CSS met automatisch voorvoegsel, dus je hebt geen -webkit of andere voorvoegsels nodig.<\/li>\n<li>Een buildscript om JS, CSS en afbeeldingen voor productie te bundelen met bronkaarten.<\/li>\n<li>Probleemloze updates voor de bovenstaande tools met een enkele dependency cgb-scripts.<\/li>\n<\/ul>\n<p>Let op het volgende voorbehoud:<\/p>\n<blockquote><p><em>Het nadeel is dat deze tools vooraf zijn geconfigureerd om op een specifieke manier te werken. Als je project meer maatwerk nodig heeft, kun je het &#8220;<\/em><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\"><em>uitwerpen<\/em><\/a><em>&#8221; en aanpassen, maar dan moet je deze configuratie behouden.<\/em><\/p><\/blockquote>\n<p>Zodra je een lokale WordPress website bij de hand hebt, start je je Command Line tool, navigeer je naar de map <strong>\/wp-content\/plugins<\/strong> van je installatie en voer je de volgende opdracht uit:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Je moet een minuut of twee wachten terwijl de projectstructuur wordt gemaakt en dependencies worden gedownload:<\/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=\"Een Gutenberg blok maken met create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Een Gutenberg blok maken met create-guten-block.<\/figcaption><\/figure>\n<p>Wanneer het proces is voltooid, zou je het volgende scherm moeten zien:<\/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 blok succesvol gemaakt met create-guten-block.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Gutenberg blok succesvol gemaakt met create-guten-block.<\/figcaption><\/figure>\n<p>Deze volgende afbeelding toont de projectstructuur met de terminal die wordt uitgevoerd in <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-teksteditors\/#visual-studio-code\">Visual Studio Code<\/a>:<\/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=\"De blokplugin in Visual Studio Code.\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">De blokplugin in Visual Studio Code.<\/figcaption><\/figure>\n<p>Ga nu terug naar je WordPress dashboard. Er moet een nieuw item worden vermeld in het scherm Plugins &#8211; het is de plugin <strong>my-first-block<\/strong>\u00a0:<\/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=\"Het Plugins scherm met een nieuwe plugin gemaakt met create-guten-block.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">Het Plugins scherm met een nieuwe plugin gemaakt met create-guten-block.<\/figcaption><\/figure>\n<p>Activeer de plugin en ga terug naar de terminal. Wijzig de huidige map in <strong>my-first-block<\/strong> en voer vervolgens <code>npm startuit<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Je zou de volgende respons moeten krijgen:<\/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 is gestart.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm is gestart.<\/figcaption><\/figure>\n<p>Nogmaals, dit stelt je in staat om de plugin in de ontwikkelingsmodus uit te voeren. Om de productiecode te maken, moet je de volgende code gebruiken:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Activeer de plugin en maak een nieuwe post of pagina aan, blader vervolgens door je blokken en selecteer je gloednieuwe Gutenberg blok:<\/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=\"Een nieuw blok gemaakt met create-guten-block.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Een nieuw blok gemaakt met create-guten-block.<\/figcaption><\/figure>\n<p>Raadpleeg <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">de documentatie van Ahmad Awais<\/a> voor een meer diepgaand overzicht of in geval van fouten.<\/p>\n<h2>Een overzicht van de startbloksteigers<\/h2>\n<p>Welke van de twee dev-tools &#8211; <code>create-block<\/code>\u00a0of <code>create-guten-block<\/code>\u00a0&#8211; je ook kiest, je hebt nu een \u201csteiger\u201d, een scaffold, die je als startpunt kunt gebruiken om een \u200b\u200bblokplugin te bouwen.<\/p>\n<p>Maar wat is <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">block scaffolding<\/a> precies?<\/p>\n<blockquote><p><em>Block scaffolding is een verkorte term die de ondersteunende directorystructuur beschrijft die WordPress nodig heeft om een \u200b\u200bblok te herkennen. Meestal bevat die map bestanden zoals <strong>index.php<\/strong>,\u00a0<strong>index.js<\/strong>,\u00a0<strong>style.css<\/strong> en anderen &#8211; die op hun beurt oproepen bevatten zoals <\/em><code><em>register_block_type<\/em><\/code><em>.<\/em><\/p><\/blockquote>\n<p>We hebben gekozen voor de offici\u00eble <strong>Create Block<\/strong> dev-tool, <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">zoals die wordt gebruikt in het Block Editor Handbook<\/a>. Maar zelfs als je zou besluiten om met een externe tool zoals <code>create-guten-block<\/code> in zee te gaan, zal je ervaring niet al te veel anders zijn.<\/p>\n<p>Dat gezegd hebbende, laten we dieper ingaan op de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\"><code>create-block<\/code> tool<\/a>.<\/p>\n<h3>Een nadere blik op de Create Block Dev-Tool<\/h3>\n<p>Zoals hierboven vermeld, is <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> de offici\u00eble opdrachtregeltool om Gutenberg blokken te maken. Als je <code>@wordpress\/create-block<\/code> in je terminal uitvoert, worden de PHP, JS en SCSS bestanden en code gegenereerd die nodig zijn om een \u200b\u200bnieuw bloktype te registreren:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (optioneel) \u2014 gebruikt om de block slug toe te wijzen en de plugin te installeren<\/li>\n<li><code>[options]<\/code> (optioneel) \u2014 beschikbare opties<\/li>\n<\/ul>\n<p>Standaard wordt een <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a> template toegewezen. Dit betekent dat je de <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">volgende versie van JavaScript<\/a> krijgt, met toevoeging van de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-jsx\/\">JSX syntaxis.<\/a><\/p>\n<p>Als je de bloknaam weglaat, wordt de opdracht in interactieve modus uitgevoerd, zodat je verschillende opties kunt aanpassen voordat je de bestanden genereert:<\/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=\"size-full wp-image-133845\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"Create Block uitvoeren in interactieve modus.\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">Create Block uitvoeren in interactieve modus.<\/figcaption><\/figure>\n<p>De onderstaande afbeelding toont de bestandsstructuur van een blokplugin die is gemaakt met de offici\u00eble Create Block tool:<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133848\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"Bestanden en mappen van een blokplugin gemaakt met @wordpress\/create-block.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Bestanden en mappen van een blokplugin gemaakt met @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Dat gezegd hebbende, laten we de hoofdbestanden en mappen van onze nieuwe blokplugin doornemen.<\/p>\n<h3 id=\"plugin-file\">Het pluginbestand<\/h3>\n<p>Met het hoofdpluginbestand <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registreer je het blok op de 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>De <code>register_block_type<\/code>\u00a0functie <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registreert een bloktype op de server<\/a> met behulp van de metagegevens die zijn opgeslagen in het bestand <strong>block.json<\/strong><\/p>\n<p>De functie heeft twee parameters:<\/p>\n<ul>\n<li>De naam van het bloktype inclusief naamruimte, of een pad naar de map waar het <strong>json<\/strong> bestand zich bevindt, of een compleet <code>WP_Block_Type<\/code> object<\/li>\n<li>Een reeks van bloktypeargumenten<\/li>\n<\/ul>\n<p>In bovenstaande code geeft de <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">magic constante<\/a> <code>__DIR__<\/code> de huidige map terug. Dat betekent dat het <strong>block.json<\/strong> bestand in de <em>\/build<\/em> submap staat.<\/p>\n<h3 id=\"package-json\">Het package.json bestand<\/h3>\n<p>Het <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">bestand package.json<\/a> definieert JavaScript eigenschappen en scripts voor je project. Hier kunt je je projectdependencies installeren.<\/p>\n<p>Om beter te begrijpen waar dit bestand voor bedoeld is, open je het met je <a href=\"https:\/\/kinsta.com\/nl\/blog\/gratis-html-editors\/\">favoriete 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>De <code>scripts<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">eigenschap<\/a> is een <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">directory met opdrachten<\/a> die op verschillende momenten in de <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">levenscyclus van een pakket<\/a> worden uitgevoerd met <code>npm run [cmd]<\/code>.<\/p>\n<p>In dit artikel gebruiken we de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">volgende opdrachten<\/a>:<\/p>\n<ul>\n<li><code>npm run build<\/code> \u2014 maak een (gecomprimeerde) productiebuild<\/li>\n<li><code>npm run start<\/code> of <code>npm start<\/code> \u2014 maak een (ongecomprimeerde) ontwikkelingsbuild<\/li>\n<\/ul>\n<p><code>dependencies<\/code> en <code>devDependencies<\/code> zijn twee objecten die een <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">pakketnaam toewijzen aan een versie<\/a>. dependencies zijn vereist in productie, terwijl <code>devDependences<\/code> alleen nodig zijn voor lokale ontwikkeling (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">lees meer<\/a>).<\/p>\n<p>De enige standaard dev dependency is het <code>@wordpress\/script<\/code>, dat wordt <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">gedefinieerd<\/a> als &#8220;een verzameling herbruikbare scripts die is afgestemd op de ontwikkeling van WordPress.&#8221;<\/p>\n<h3 id=\"block-json\">Het block.json bestand<\/h3>\n<p>Vanaf WordPress 5.8 is het <strong>block.json<\/strong>\u00a0<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadatabestand<\/a> de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-5-8\/#block-api-enhancements\">manier om bloktypes te registreren<\/a>.<\/p>\n<p>Het hebben van een <strong>block.json<\/strong>\u00a0bestand biedt verschillende voordelen, waaronder <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">verbeterde prestaties<\/a> en betere zichtbaarheid in de <a href=\"https:\/\/wordpress.org\/plugins\/\">WordPress Plugins Directory<\/a>:<\/p>\n<blockquote><p><em>Vanuit een prestatieperspectief, wanneer thema&#8217;s lazyloaden van assets ondersteunen, zullen blokken die zijn geregistreerd bij <strong>block.json<\/strong>\u00a0, hun assets-enqueuing out-of-the-box geoptimaliseerd hebben. De frontend CSS- en JavaScript- assets die in de <\/em><code><em>style<\/em><\/code><em> of <\/em><code><em>script<\/em><\/code><em> eigenschappen worden vermeld, worden alleen in de wachtrij geplaatst wanneer het blok op de pagina aanwezig is, wat resulteert in kleinere paginaformaten.<\/em><\/p><\/blockquote>\n<p>Het uitvoeren van de opdracht <code>@wordpress\/create-block<\/code>\u00a0genereert het volgende <strong>block.json<\/strong>\u00a0-bestand:<\/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 is de volledige lijst met <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">standaardeigenschappen<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> \u2014 de versie van de API die door het blok wordt gebruikt (huidige versie is 2)<\/li>\n<li><code>name<\/code> \u2014 een unieke identificatie voor een blok inclusief een naamruimte<\/li>\n<li><code>version<\/code> \u2014 de huidige versie van een blok<\/li>\n<li><code>title<\/code> \u2014 een weergavetitel voor een blok<\/li>\n<li><code>category<\/code> \u2014 een blokcategorie<\/li>\n<li><code>icon<\/code> \u2014 een <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a>-slug of een aangepast SVG-pictogram<\/li>\n<li><code>description<\/code> \u2014 een korte beschrijving die zichtbaar is in de blokinspecteur<\/li>\n<li><code>supports<\/code> \u2014 een set opties om functies te besturen die in de editor worden gebruikt<\/li>\n<li><code>textdomain<\/code> \u2014 het tekstdomein van de plugin<\/li>\n<li><code>editorScript<\/code> \u2014 definitie van editorscript<\/li>\n<li><code>editorStyle<\/code> \u2014 definitie van editorstijl<\/li>\n<li><code>style<\/code> \u2014 biedt alternatieve stijlen voor een blok<\/li>\n<\/ul>\n<p>Naast de hierboven genoemde eigenschappen, kun je (en zul je waarschijnlijk) een <code>attributes<\/code> object defini\u00ebren dat informatie geeft over gegevens die door jouw blok zijn opgeslagen. In je <strong>block.json<\/strong>\u00a0kun je een willekeurig aantal attributen instellen in <em>sleutel\/waarde<\/em>-paren, waarbij de sleutel de attribuutnaam en de waarde de attribuutdefinitie is.<\/p>\n<p>Bekijk het volgende voorbeeld van attribuutdefinities:<\/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>We zullen <a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#block-json-at-work\">later in het artikel<\/a> dieper ingaan op het <strong>block.json<\/strong>\u00a0bestand, maar je kunt ook het Block Editor handboek raadplegen voor meer gedetailleerde informatie over <strong>block.json<\/strong> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadata<\/a> en <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributen<\/a>.<\/p>\n<h3 id=\"src-folder\">De src map<\/h3>\n<p>De <code>src<\/code>\u00a0map is waar de ontwikkeling plaatsvindt. In die map vind je de volgende bestanden:<\/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>Het bestand <strong>index.js<\/strong> is je startpunt. Hier importeer je afhankelijkheden en registreer je het bloktype op de client:<\/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>De eerste instructie importeert de functie <code>registerBlockType<\/code>\u00a0uit het <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">pakket<\/a> <code>@wordpress\/block<\/code>.\u00a0De volgende <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">import statements<\/a> importeren de stylesheet samen met de <code>Edit<\/code> en <code>save<\/code> functies, en een metadata object uit het <em>block.json<\/em> bestand.<\/p>\n<p>De functie <code>registerBlockType<\/code>\u00a0<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">registreert het onderdeel op de client<\/a>. De functie neemt twee parameters: een bloknaam en een object voor de blokconfiguratie.<\/p>\n<p>De <code>Edit<\/code> functie biedt de blokinterface zoals weergegeven in de Block Editor, terwijl de <code>save<\/code> functie de structuur biedt die wordt geserialiseerd en in de database wordt opgeslagen (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">lees meer<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p><strong>edit.js<\/strong>\u00a0is waar je de blokbeheerdersinterface gaat bouwen:<\/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>Eerst importeert het de <code>__<\/code>-functie uit het <code>@wordpress\/i18n<\/code> pakket (dit pakket bevat een JavaScript versie van de vertaalfuncties), de <code><a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">useBlockProps<\/a><\/code><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">React hook<\/a> en het <code>editor.scss<\/code>\u00a0bestand.<\/p>\n<p>Daarna exporteert het de React component (lees meer over <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">import<\/a>&#8211; en <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">export<\/a> statements).<\/p>\n<h4>save.js<\/h4>\n<p>In het bestand <strong>save.js<\/strong>\u00a0bouwen we de blokstructuur die in de database moet worden opgeslagen:<\/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 en style.scss<\/h4>\n<p>Afgezien van de scripts bevinden zich twee <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a> bestanden in de <strong>src<\/strong> -mappen.\u00a0Het bestand <strong>editor.scss<\/strong> bevat de stijlen die op het blok worden toegepast in de context van de editor, terwijl het bestand <strong>style.scss<\/strong> de stijlen van het blok bevat voor weergave in <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">zowel de frontend als de editor<\/a>. In het tweede deel van deze gids gaan we dieper in op deze bestanden.<\/p>\n<h3 id=\"node_modules-build\">De node_modules en build-mappen<\/h3>\n<p>De map <code>node_modules<\/code>\u00a0bevat nodemodules en hun dependencies. We zullen niet dieper ingaan op nodepackages omdat dit buiten het bestek van dit artikel valt, maar je kunt in <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">dit artikel meer lezen over waar npm de pakketten installeert.<\/a><\/p>\n<p>De <code>build<\/code> map bevat de JS en CSS bestanden die het resultaat zijn van het buildproces. Je kan dieper in het bouwproces duiken in de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext-syntaxis<\/a> en <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">JavaScript Build Setup<\/a> handleidingen.<\/p>\n<h2>Het project: je eerste Gutenberg blok bouwen<\/h2>\n<p>Het is tijd om onze handen vuil te maken. In dit gedeelte leer je hoe je een plugin maakt die een CTA blok met de naam Kinsta Academy Block biedt.<\/p>\n<p>Het blok zal uit twee kolommen bestaan, met links een afbeelding en rechts een tekstparagraaf. Een knop met een aanpasbare link wordt onder de tekst geplaatst:<\/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=\"Het bloktype dat u in deze handleiding leert bouwen.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">Het bloktype dat u in deze handleiding leert bouwen.<\/figcaption><\/figure>\n<p>Dit is slechts een eenvoudig voorbeeld, maar het stelt ons in staat om de basisprincipes van de ontwikkeling van Gutenberg blokken te behandelen. Als je eenmaal een duidelijk begrip hebt van de basis, kun je doorgaan en steeds complexere Gutenberg blokken maken met behulp van het <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">Block Editor Handbook<\/a> en alle andere uitgebreide bronnen die er zijn.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>De code van de voorbeelden in deze tutorial is ook <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">beschikbaar op Gist<\/a> voor je referentie.<\/p>\n<\/aside>\n\n<p>Ervan uitgaande dat je de nieuwste versie van WordPress in je lokale ontwikkelomgeving draait, ga je hier het volgende leren:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#set-up-the-plugin\">Hoe de Starter Block plugin in te stellen<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#block-json-at-work\">json aan het werk<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#using-richtext-component\">Ingebouwde componenten gebruiken: de RichText component<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#adding-block-toolbar-controls\">Besturingselementen toevoegen aan de blokwerkbalk<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#settings-sidebar\">De zijbalk met blokinstellingen aanpassen<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#external-link\">Een externe link toevoegen en aanpassen<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#multiple-block-styles\">Meerdere blokstijlen toevoegen<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#innerblocks-component\">Blokken nesten met de component InnerBlocks<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#additional-improvements\">Aanvullende verbeteringen<\/a><\/li>\n<\/ul>\n<p>Klaar voor de start, af!<\/p>\n<h3 id=\"set-up-the-plugin\">Hoe de Starter Block plugin in te stellen<\/h3>\n<p>Start je opdrachtregel tool en navigeer naar de map <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=\"Nieuwe terminal in map in Mac OS.\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">Nieuwe terminal in map in Mac OS.<\/figcaption><\/figure>\n<p>Voer nu de volgende opdracht uit:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Deze opdracht genereert de PHP, SCSS en JS bestanden voor het registreren van een blok in interactieve modus, zodat je eenvoudig de benodigde gegevens voor je blok kunt toevoegen. Voor ons voorbeeld gebruiken we de volgende details:<\/p>\n<ul>\n<li><strong>Template variant<\/strong>: static<\/li>\n<li><strong>Block slug<\/strong>: ka-example-block<\/li>\n<li><strong>Internal namespace<\/strong>: ka-example-block<\/li>\n<li><strong>Block display title<\/strong>: Kinsta Academy Block<\/li>\n<li><strong>Short block description<\/strong>: An example block for Kinsta Academy students<\/li>\n<li><strong>Dashicon<\/strong>: superhero-alt<\/li>\n<li><strong>Category name<\/strong>: widgets<\/li>\n<li><strong>Do you want to customize the WordPress plugin?<\/strong>: yes<\/li>\n<li><strong>The home page of the plugin<\/strong>: https:\/\/kinsta.com\/<\/li>\n<li><strong>Current plugin version<\/strong>: 0.1.0<\/li>\n<li><strong>Plugin author<\/strong>: your name<\/li>\n<li><strong>License<\/strong>: &#8211;<\/li>\n<li><strong>Link to the license text<\/strong>: &#8211;<\/li>\n<li><strong>Custom domain path for translations<\/strong>: &#8211;<\/li>\n<\/ul>\n<p>Het installeren van de plugin en alle dependencies duurt een paar minuten. Wanneer het proces is voltooid, zie je het volgende antwoord:<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134076\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"Het Affiliate-blok is ge\u00efnstalleerd en geregistreerd voor ontwikkeling.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">Het Affiliate-blok is ge\u00efnstalleerd en geregistreerd voor ontwikkeling.<\/figcaption><\/figure>\n<p>Voer nu de volgende opdracht uit vanuit de map <strong>\/wp-content\/plugins<\/strong>:<\/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>IAls je je WordPress omgeving gebruikt, moet je eerst Docker Desktop starten en vervolgens <code>wp-env start<\/code>\u00a0uitvoeren vanuit de map van je plugin.<\/p>\n<p>Vervolgens kun je <em>http:\/\/localhost:8888\/wp-login<\/em>\u00a0starten vanuit je webbrowser en <strong>Username: admin<\/strong>\u00a0en\u00a0<strong>Wachtwoord: password<\/strong>\u00a0gebruiken om in te loggen op je WordPress dashboard.<\/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=\"Opdrachten uitvoeren vanuit Visual Studio Code Terminal.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">Opdrachten uitvoeren vanuit Visual Studio Code Terminal.<\/figcaption><\/figure>\n<p>Ten slotte kun je vanuit de map van je plugin (<strong>ka-example-block<\/strong>\u00a0in ons voorbeeld) de ontwikkeling starten met:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Open nu het scherm Plugins om de plugin <strong>Kinsta Academy Block<\/strong>\u00a0te zoeken en te activeren:<\/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=\"Activeer het voorbeeldblok\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Activeer het voorbeeldblok<\/figcaption><\/figure>\n<p>Maak een nieuw bericht, open de blokinvoeger en scrol omlaag naar de categorie <strong>Design<\/strong>. Klik om het Kinsta Academy Block toe te voegen:<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133869\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"Startblok gebouwd met @wordpress\/create-block.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Startblok gebouwd met @wordpress\/create-block.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json aan het werk<\/h3>\n<p>Zoals we eerder vermeldden, vindt de blokregistratie aan de serverzijde plaats in het hoofd <strong>.php<\/strong>\u00a0bestand. We zullen echter geen instellingen defini\u00ebren in het <strong>.php<\/strong>\u00a0bestand. In plaats daarvan gebruiken we het bestand <strong>block.json<\/strong>.<\/p>\n<p>Dus, open <strong>block.json<\/strong>\u00a0opnieuw en bekijk de standaardinstellingen van dichterbij:<\/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>Scripts en stijlen<\/h4>\n<p><code>editorScript<\/code>, <code>editorStyle<\/code>, en <code>style<\/code> properties bieden de relatieve paden naar frontend en backend scripts en stijlen.<\/p>\n<p>Je hoeft de hier gedefinieerde scripts en stijlen niet handmatig te registreren, omdat deze automatisch worden geregistreerd en in de wachtrij worden geplaatst door WordPress. Om dat te bewijzen, start je de browserinspecteur en open je het tabblad <strong>Network<\/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=\"size-full wp-image-133870\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Bronnen inspecteren in Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Bronnen inspecteren in Chrome DevTools.<\/figcaption><\/figure>\n<p>Zoals je kunt zien in de afbeelding hierboven, is ons <strong>index.js<\/strong>\u00a0script dat zich in de <strong>build<\/strong>\u00a0map bevindt regelmatig in de wachtrij geplaatst <strong>zonder dat je PHP code hoeft toe te voegen.<\/strong><\/p>\n<h4>UI labels<\/h4>\n<p>De properties <code>title<\/code> en <code>description<\/code>\u00a0bieden de labels die nodig zijn om het blok in de editor te identificeren:<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133871\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Bloknaam en beschrijving in de blokzijbalk.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Bloknaam en beschrijving in de blokzijbalk.<\/figcaption><\/figure>\n<h4>Trefwoorden<\/h4>\n<p>Zoals we eerder vermeldden, kun je je blokinstellingen nauwkeurig configureren met behulp van <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">properties<\/a> en <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributes<\/a>. Je kunt bijvoorbeeld een of meer <code>keywords<\/code> toevoegen om gebruikers te helpen bij het zoeken naar blokken:<\/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>Als je nu &#8220;kinsta&#8221;, &#8220;academy&#8221; of &#8220;superhero&#8221; invoert in de snelinvoer, zal de editor je het Kinsta Academy blok voorstellen:<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133969\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"Zoeken naar een blok met behulp van een trefwoord in de snelle invoegfunctie.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">Zoeken naar een blok met behulp van een trefwoord in de snelle invoegfunctie.<\/figcaption><\/figure>\n<h4>Lokalisatie<\/h4>\n<p>Als je je afvraagt \u200b\u200bhoe de lokalisatie van de strings in het JSON bestand gebeurt, is hier <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">het antwoord<\/a>:<\/p>\n<blockquote><p><em>In JavaScript kun je nu de <\/em><code><em>registerBlockTypeFromMetadata<\/em><\/code><em>\u00a0methode uit het <\/em><code><em>@wordpress\/blocks<\/em><\/code><em>\u00a0pakket gebruiken om een \u200b\u200bbloktype te registreren met behulp van de metagegevens die zijn geladen uit het <strong>block.json<\/strong>\u00a0bestand. Alle gelokaliseerde eigenschappen worden automatisch verpakt in <\/em><code><em>_x<\/em><\/code><em>\u00a0(van het <\/em><code><em>@wordpress\/i18n<\/em><\/code><em>\u00a0-pakket) functieaanroepen vergelijkbaar met hoe het werkt in PHP met <\/em><code><em>register_block_type_from_metadata<\/em><\/code><em>. De enige vereiste is om de eigenschap <\/em><code><em>textdomain<\/em><\/code><em>\u00a0in het bestand <strong>block.json<\/strong>\u00a0in te stellen.<\/em><\/p><\/blockquote>\n<p>Hier gebruiken we de functie <code>registerBlockType<\/code> in plaats van <code>registerBlockTypeFromMetadata<\/code>, aangezien de laatste sinds <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a> is <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">verouderd<\/a>, maar het mechanisme is hetzelfde.<\/p>\n<h3 id=\"using-richtext-component\">Ingebouwde componenten gebruiken: de RichText component<\/h3>\n<p>De elementen waaruit een Gutenberg blok bestaat, zijn React componenten en je hebt toegang tot deze componenten via de global variabele <code>wp<\/code>. Probeer bijvoorbeeld <code>wp.editor<\/code> in de console van je browser te typen. Dit geeft je de volledige lijst van de componenten die zijn opgenomen in de <code>wp.editor<\/code> module.<\/p>\n<p>Scrol door de lijst en raad welke componenten met hun naam bedoeld zijn.<\/p>\n<p>Op dezelfde manier kun je de lijst met componenten in de <code>wp.components<\/code>\u00a0module controleren:<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133970\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"WP componenten\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">WP componenten<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><strong>Modulair programmeren<\/strong> is een techniek voor softwareontwerp die de nadruk legt op het scheiden van de functionaliteit van een programma in onafhankelijke, uitwisselbare <strong>modules<\/strong>, zodat elke module alles bevat wat nodig is om slechts \u00e9\u00e9n aspect van de gewenste functionaliteit uit te voeren (Bron: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>).<\/p>\n<\/aside>\n\n<p>Ga nu terug naar het <strong>edit.js<\/strong>\u00a0bestand en bekijk het script van dichterbij:<\/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>Deze code genereert een statisch blok met eenvoudige, niet-bewerkbare tekst. Maar we kunnen dingen gemakkelijk veranderen:<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133971\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"Het startblok in de code-editor.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">Het startblok in de code-editor.<\/figcaption><\/figure>\n<p>Om de tekst bewerkbaar te maken, moet je de huidige <code>&lt;p&gt;<\/code>\u00a0tag vervangen door een component die de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">invoerinhoud bewerkbaar<\/a> maakt. Daarvoor biedt Gutenberg de ingebouwde <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">RichText component<\/a>.<\/p>\n<p>Het toevoegen van een ingebouwd onderdeel aan je blok is een proces van 5 stappen:<\/p>\n<ol>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#import-components\">Importeer de benodigde componenten uit een WordPress pakket<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#jsx-elements\">Neem de corresponderende elementen op in je JSX code<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#define-attributes\">Definieer de benodigde attributen in het bestand block.json<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#define-event-handlers\">Definieer event-handlers<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#save-data\">Gegevens opslaan<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Stap 1: Importeer de benodigde componenten uit een WordPress pakket<\/h4>\n<p>Open nu het bestand <strong>edit.js<\/strong>\u00a0en wijzig het volgende <code>import<\/code> statement:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>\u2026naar:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>Op deze manier importer je de <code>useBlockProps<\/code>\u00a0functie en <code>RichText<\/code> component uit het <code>@wordpress\/block-editor<\/code> pakket.<\/p>\n<h5>useBlockProps<\/h5>\n<p>De <code><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">useBlockProps<\/a><\/code> React hook markeert het <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">wrapper-element van het blok<\/a>:<\/p>\n<blockquote><p><em>Wanneer je API versie 2 gebruikt, moet je de nieuwe <\/em><code><em>useBlockProps<\/em><\/code><em>\u00a0hook gebruiken in de <\/em><code><em>edit<\/em><\/code><em> functie van het blok om het wrapper-element van het blok te markeren. De hook zal attributen en event-handlers invoegen die nodig zijn om blokgedrag mogelijk te maken. Alle attributen die je aan het blokelement wil doorgeven, moeten via <\/em><code><em>useBlockProps<\/em><\/code><em>\u00a0worden doorgegeven en de geretourneerde waarde moet op het element worden gespreid.<\/em><\/p><\/blockquote>\n<p>Simpel gezegd, <code>useBlockProps<\/code> wijst automatisch attributen en klassen toe aan het wrapper-element (het <code>p<\/code> element in ons voorbeeld):<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133973\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"Elementen en klassen gegenereerd door useBlockProps.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Elementen en klassen gegenereerd door useBlockProps.<\/figcaption><\/figure>\n<p>Als je <code>useBlockProps<\/code>\u00a0uit het wrapper-element verwijdert, heb je een eenvoudige tekenreeks zonder toegang tot blokfunctionaliteit en -stijl:<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133974\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"Hetzelfde blok zonder useBlockProps\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">Hetzelfde blok zonder useBlockProps.<\/figcaption><\/figure>\n<p>Zoals we <a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#additional-improvements\">later zullen uitleggen<\/a>, kun je <code>useBlockProps<\/code>\u00a0ook een object met eigenschappen doorgeven om de uitvoer aan te passen.<\/p>\n<h5>RichText<\/h5>\n<p>De RichText component biedt een <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">inhoudbewerkbare<\/a> invoer, waarmee gebruikers de inhoud kunnen bewerken en opmaken.<\/p>\n<p>Je vindt de component gedocumenteerd op GitHub op <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>.<\/p>\n<h4 id=\"jsx-elements\">Stap 2: Neem de corresponderende elementen op in uw JSX-code<\/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>Laten we de code regel voor regel becommentari\u00ebren:<\/p>\n<ul>\n<li><code>tagName<\/code> \u2014 de tagnaam van het bewerkbare HTML-element<\/li>\n<li><code>onChange<\/code> \u2014 functie aangeroepen wanneer de inhoud van het element verandert<\/li>\n<li><code>allowedFormats<\/code> \u2014 een reeks toegestane formats. Standaard zijn alle formats toegestaan<\/li>\n<li><code>value<\/code> \u2014 de HTML tekenreeks die bewerkbaar moet worden gemaakt<\/li>\n<li><code>placeholder<\/code> \u2014 tijdelijke tekst om te tonen wanneer het element leeg is<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Stap 3: Definieer de benodigde attributen in het block.json bestand<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Attributes<\/a>\u00a0geven informatie over de gegevens die door een blok zijn opgeslagen, zoals rich content, achtergrondkleur, URL&#8217;s, enz.<\/p>\n<p>Je kunt een willekeurig aantal attributen binnen een <code>attributes<\/code> object instellen in key\/value paren, waarbij de sleutel de attribuutnaam is en de waarde de attribuutdefinitie.<\/p>\n<p>Open nu het bestand <strong>block.json<\/strong> en voeg de volgende <code>attributes<\/code>\u00a0prop toe:<\/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>Met het <code>content<\/code>\u00a0attribuut kan de door de gebruiker getypte tekst in het bewerkbare veld worden opgeslagen:<\/p>\n<ul>\n<li><code>type<\/code> geeft het type gegevens aan dat door het attribuut is opgeslagen. Het type is vereist, tenzij je een eigenschap <code>enum<\/code>\u00a0definieert.<\/li>\n<li><code>source<\/code> definieert hoe de attribuutwaarde wordt ge\u00ebxtraheerd uit de berichtinhoud. In ons voorbeeld is dit de HTML inhoud. Houd er rekening mee dat als je geen broneigenschap opgeeft, gegevens worden opgeslagen in het blokscheidingsteken (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">lees meer<\/a>).<\/li>\n<li><code>selector<\/code> is een HTML tag of een andere selector, zoals een klassenaam of een id-attribuut.<\/li>\n<\/ul>\n<p>We zullen de <code>Edit<\/code> functie een object van eigenschappen doorgeven. Ga dus terug naar het <strong>edit.js<\/strong>\u00a0bestand en breng de volgende wijziging aan:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Stap 4: Definieer event-handlers<\/h4>\n<p>Het <code>RichText<\/code> element heeft een <code>onChange<\/code>-attribuut, dat een functie biedt die kan worden aangeroepen wanneer de inhoud van het element verandert.<\/p>\n<p>Laten we die functie defini\u00ebren en het hele <strong>edit.js<\/strong>\u00a0script bekijken:<\/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>Sla nu het bestand op en ga terug naar je WordPress dashboard, maak een nieuw bericht of nieuwe pagina en voeg je aangepaste blok toe:<\/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=\"De uitvoer van de RichText component in de Block Editor.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">De uitvoer van de RichText component in de Block Editor.<\/figcaption><\/figure>\n<p>Voeg wat tekst toe en schakel over naar de codeweergave. Dit is hoe je code eruit zou moeten zien:<\/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>Zoals je kunt zien, is de inhoud van je blok veranderd als je overschakelt naar de code-editor. Dat komt omdat je het bestand <strong>save.js<\/strong> moet aanpassen om de gebruikersinput op te slaan in de database wanneer het bericht wordt opgeslagen.<\/p>\n<h4 id=\"save-data\">Stap 5: Gegevens opslaan<\/h4>\n<p>Open nu het bestand <strong>save.js<\/strong>\u00a0en wijzig het script als volgt:<\/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>Dat is wat we hier doen:<\/p>\n<ul>\n<li>Importeer de <code>RichText<\/code> component uit het <code>block-editor<\/code><\/li>\n<li>Geef verschillende eigenschappen door via een objectargument aan de <code>save<\/code> functie (in dit voorbeeld geven we alleen de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\"><code>attributes<\/code>property<\/a> door)<\/li>\n<li>Retourneer de inhoud van de <code>RichText<\/code> component<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Telkens wanneer je de opslagfunctie wijzigt, moet je elke blokinstantie in het canvas van de editor verwijderen en opnieuw opnemen om te zien of deze correct werkt. Lees meer over <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">blokvalidatie<\/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=\"De inhoud van het blok is opgeslagen in de database\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">De inhoud van het blok is opgeslagen in de database<\/figcaption><\/figure>\n<p>Je kunt meer lezen over de <code>RichText<\/code>\u00a0component in het <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Block Editor Handboek<\/a> en de <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">volledige lijst met rekwisieten vinden op Github<\/a>.<\/p>\n<p>Laten we nu een stap verder gaan. In het volgende gedeelte leer je hoe je besturingselementen aan de blokwerkbalk kunt toevoegen.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">Besturingselementen toevoegen aan de blokwerkbalk<\/h3>\n<p>De <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">blokwerkbalk<\/a> bevat een set bedieningselementen waarmee gebruikers delen van blokinhoud kunnen manipuleren. Voor elk werkbalkbesturingselement vind je een onderdeel:<\/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=\"De blokwerkbalk van het core paragraph.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">De blokwerkbalk van het core paragraph.<\/figcaption><\/figure>\n<p>Je kunt bijvoorbeeld een besturingselement voor tekstuitlijning voor je blok toevoegen. Het enige wat je hoeft te doen, is twee componenten uit het pakket <code>@wordpress\/block-editor<\/code> te importeren.<\/p>\n<p>We doorlopen dezelfde stappen als in het vorige voorbeeld:<\/p>\n<ol>\n<li>Importeer vereiste componenten uit WordPress pakketten<\/li>\n<li>Neem de corresponderende elementen op in je JSX code<\/li>\n<li>Definieer de benodigde attributen in het <strong>block.json <\/strong>bestand<\/li>\n<li>Definieer event-handlers<\/li>\n<li>Gegevens opslaan<\/li>\n<\/ol>\n<h4>Stap 1: Importeer BlockControls en AlignmentControl componenten van @wordpress\/block-editor<\/h4>\n<p>Om een \u200b\u200buitlijningsbesturingselement aan de blokwerkbalk toe te voegen, heb je twee componenten nodig:<\/p>\n<ul>\n<li><code>BlockControls<\/code> maakt een dynamische werkbalk met besturingselementen (ongedocumenteerd).<\/li>\n<li><code>AlignmentControl<\/code> geeft een vervolgkeuzemenu weer dat uitlijningsopties voor het geselecteerde blok weergeeft (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">lees meer<\/a>)<\/li>\n<\/ul>\n<p>Open het <strong>edit.js<\/strong> bestand en bewerk het <code>import<\/code> statement zoals hieronder weergegeven:<\/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>Stap 2: BlockControls en AlignmentControl elementen toevoegen<\/h4>\n<p>Ga naar de <code>Edit<\/code>\u00a0functie en voeg het element <code>&lt;BlockControls \/&gt;<\/code> in op hetzelfde niveau als <code>&lt;RichText \/&gt;<\/code>. Voeg vervolgens <code>&lt;AlignmentControl \/&gt;<\/code> toe binnen <code>&lt;BlockControls \/&gt;<\/code>:<\/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>In de bovenstaande code zijn <code>&lt;&gt;<\/code> en <code>&lt;\/&gt;<\/code> de korte syntaxis voor het declareren van <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">React fragmenten<\/a>, en zo retourneren we meerdere elementen in React.<\/p>\n<p>In dit voorbeeld heeft <code>AlignmentControl<\/code>\u00a0twee attributen:<\/p>\n<ul>\n<li><code>value<\/code> geeft de huidige waarde voor het element<\/li>\n<li><code>onChange<\/code> biedt een <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">gebeurtenishandler<\/a> die kan worden uitgevoerd wanneer de waarde verandert<\/li>\n<\/ul>\n<p>We hebben ook extra attributen gedefinieerd voor het <code>RichText<\/code> element (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">bekijk de volledige lijst met attributen met voorbeelden<\/a>)<\/p>\n<h4>Stap 3: Definieer het uitlijnattribuut in block.json<\/h4>\n<p>Ga nu naar het bestand <strong>block.json<\/strong>\u00a0en voeg het <code>align<\/code>\u00a0attribuut toe:<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>Ga terug naar de blok-editor, ververs de pagina en selecteer het blok. Je zou een foutmelding in je blok moeten zien.<\/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=\"Het blok geeft een foutmelding\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">Het blok geeft een foutmelding<\/figcaption><\/figure>\n<p>De reden is dat we onze event handler nog niet gedefinieerd hebben.<\/p>\n<h4>Stap 4: Definieer de event-handlers<\/h4>\n<p>Definieer nu <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>Als <code>newAlign<\/code> <code>undefined<\/code> is, stellen we <code>newAlign<\/code> in op <code>none<\/code>. Anders gebruiken we <code>newAlign<\/code>.<\/p>\n<p>Ons <strong>edit.js<\/strong>\u00a0script zou (voorlopig) compleet moeten zijn:<\/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>Ga nu terug naar de editor en zorg dat je de blokinhoud uitlijnt. Je blok zou nu een Alignment Toolbar moeten tonen.<\/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=\"Ons blok heeft nu een Alignment Toolbar\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Ons blok heeft nu een Alignment Toolbar<\/figcaption><\/figure>\n<p>Maar als je het bericht opslaat, zul je zien dat de inhoud van je blok aan de frontend niet is uitgelijnd zoals in de blok-editor. Dat komt omdat we de <code>save<\/code> functie moeten aanpassen om blokinhoud en attributen in de database op te slaan.<\/p>\n<h4>Stap 5: Gegevens opslaan<\/h4>\n<p>Open <strong>save.js<\/strong> en wijzig de <code>save<\/code>\u00a0functie als volgt:<\/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>Ten slotte, om de code leesbaarder te maken, kun je de individuele eigenschappen uit het <code>attribute<\/code> object extraheren met behulp van de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">destructurerende toewijzingssyntaxis<\/a>:<\/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>Sla nu het bestand op en schakel over naar de code-editor. De blokcode moet er ongeveer zo uitzien:<\/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=\"Tekst rechts uitlijnen.\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">Tekst rechts uitlijnen.<\/figcaption><\/figure>\n<p>En dat was het! Je hebt zojuist een alignmentmethode toegevoegd aan de toolbar van je blok \ud83e\udd13<\/p>\n<p>Je kunt meer lezen over <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">blokwerkbalkbesturingselementen<\/a> in het Block Editor Handboek.<\/p>\n<h3 id=\"settings-sidebar\">De zijbalk met blokinstellingen aanpassen<\/h3>\n<p>Je kunt ook bedieningselementen toevoegen aan het blok <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">instellingenzijbalk<\/a> (of zelfs een nieuwe zijbalk voor je toepassing maken).<\/p>\n<p>De API biedt daarvoor een <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\"><code>InspectorControls<\/code>&#8211;\u00a0component<\/a>.<\/p>\n<p>In het Block Editor handboek wordt uitgelegd <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">hoe je de Instellingenzijbalk gebruikt<\/a>:<\/p>\n<blockquote><p><em>De instellingenzijbalk wordt gebruikt om minder vaak gebruikte instellingen of instellingen weer te geven waarvoor meer schermruimte nodig is. De Instellingenzijbalk mag alleen worden gebruikt voor <strong>instellingen op blokniveau<\/strong>.<\/em><\/p>\n<p><em>Als je instellingen hebt die alleen van invloed zijn op geselecteerde inhoud in een blok (bijvoorbeeld: de &#8220;vet&#8221; instelling voor geselecteerde tekst in een alinea): <\/em>plaats deze dan niet in de Instellingenzijbalk.<em> De instellingenzijbalk wordt zelfs weergegeven wanneer een blok in HTML modus wordt bewerkt, dus deze mag alleen instellingen op blokniveau bevatten.<\/em><\/p><\/blockquote>\n<p>Nogmaals:<\/p>\n<ol>\n<li>Importeer vereiste componenten uit WordPress pakketten<\/li>\n<li>Neem de corresponderende elementen op in je JSX code<\/li>\n<li>Definieer de benodigde attributen in het block.json bestand<\/li>\n<li>Definieer event-handlers<\/li>\n<li>Gegevens opslaan<\/li>\n<\/ol>\n<h4>Stap 1. Importeer InspectorControls en PanelColorSettings componenten van @wordpress\/block-editor<\/h4>\n<p>Je kunt verschillende bedieningselementen toevoegen zodat gebruikers specifieke aspecten van het blok kunnen aanpassen. Je kunt bijvoorbeeld een kleurenbedieningspaneel leveren. Om dit te doen, moet je de componenten <code>InspectorControls<\/code> en <code>PanelColorSettings<\/code> uit de <code>block-editor<\/code> module importeren:<\/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>Stap 2: De corresponderende elementen op in je JSX code opnemen<\/h4>\n<p>Nu kun je de overeenkomstige elementen toevoegen aan de JSX die wordt geretourneerd door de <code>Edit<\/code>\u00a0functie:<\/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>Merk op dat we ook het <code>style<\/code>\u00a0attribuut van het <code>RichText<\/code>\u00a0element hebben bijgewerkt:<\/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...' ) }\n\t style={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\/&gt;<\/code><\/pre>\n<h4>Stap 3: Definieer de benodigde attributen in block.json<\/h4>\n<p>Definieer nu de attributen <code>backgroundColor<\/code>\u00a0en <code>textColor<\/code> in het bestand <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>Stap 4: Definieer de event-handlers<\/h4>\n<p>Nu moet je twee functies defini\u00ebren om <code>backgroundColor<\/code>\u00a0en <code>textColor<\/code>\u00a0bij gebruikersinvoer bij te werken:<\/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>Stap 5: Gegevens opslaan<\/h4>\n<p>Nog een laatste stap: Open het bestand <strong>save.js<\/strong>\u00a0en wijzig het script als volgt:<\/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>Sla het bestand op en controleer het blok in de editor. Mogelijk vind je een ongewenste verrassing: een foutmelding om je te laten weten dat het blok onverwachte of ongeldige inhoud bevat.<\/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=\"Foutbericht unexpected or invalid content\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Foutbericht unexpected or invalid content<\/figcaption><\/figure>\n<p>Dit gebeurt omdat het bestand <strong>save.js<\/strong> is gewijzigd en de in de database opgeslagen code niet overeenkomt met de in de editor gebruikte code.<\/p>\n<p>Om dit te verhelpen, vernieuw je de pagina, verwijder je een instantie van je blok en voeg je het opnieuw toe aan je bericht:<\/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=\"Het paneel Color settings in het blok Settings Sidebar\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">Het paneel Color settings in het blok Settings Sidebar<\/figcaption><\/figure>\n<p>Breng je wijzigingen aan, sla het bericht op en bekijk het aan de frontend. De wijzigingen die je in de blokeditor hebt aangebracht, moeten nu aan de frontend worden weergegeven.<\/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=\"Het aangepaste blok werkt nu correct op de frontend\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">Het aangepaste blok werkt nu correct op de frontend<\/figcaption><\/figure>\n<h3 id=\"external-link\">Een externe link toevoegen en aanpassen<\/h3>\n<p>In deze sectie voeg je nieuwe componenten toe aan je bloktype:<\/p>\n<ul>\n<li>Een <code>ExternalLink<\/code> component waarmee gebruikers een aanpasbare link aan je aangepaste blok kunnen toevoegen<\/li>\n<li>Verschillende bedieningselementen in de zijbalk waarmee gebruikers linkinstellingen kunnen aanpassen<\/li>\n<\/ul>\n<h4>Stap 1. Importeer componenten van @wordpress\/components<\/h4>\n<p>Nu moet je verschillende componenten importeren uit <code>@wordpress\/components<\/code>. Open je edit.js bestand en voeg het volgende <code>import<\/code> statement toe:<\/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><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelbody\"><code>PanelBody<\/code><\/a> voegt een inklapbare container toe aan de Instellingenzijbalk.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> produceert een generieke container voor zijbalkbedieningen.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> biedt een besturingselement voor tekstinvoer.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> biedt een schakelaar waarmee gebruikers een specifieke optie kunnen in-\/uitschakelen<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> is een eenvoudig onderdeel om een \u200b\u200bexterne link toe te voegen.<\/li>\n<\/ul>\n<h4>Stap 2. Neem de corresponderende elementen op in je JSX code<\/h4>\n<p>Je voegt eerst het <code>ExternalLink<\/code> element toe op hetzelfde niveau als <code>RichText<\/code> in een <code>div<\/code> container:<\/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>De <code>ExternalLink<\/code>\u00a0component is niet gedocumenteerd, dus we verwezen naar de <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">component zelf<\/a> om de lijst met beschikbare attributen te krijgen. Hier gebruiken we de attributen <code>href<\/code>, <code>className<\/code> en <code>rel<\/code>\u00a0.<\/p>\n<p>Standaard is de <code>rel<\/code> attribuutwaarde ingesteld op<code> noopener noreferrer<\/code>. Onze code voegt het <a href=\"https:\/\/kinsta.com\/nl\/blog\/nofollow-links-aan-wordpress-toevoegen\/\"><code>nofollow<\/code>\u00a0sleutelwoord<\/a> toe aan het <code>rel<\/code> attribuut van de resulterende <code>a<\/code> tag wanneer de toggle-besturing is <strong>ingeschakeld<\/strong>.<\/p>\n<p>Nu kun je de linkinstellingen toevoegen aan de blokzijbalk.<\/p>\n<p>Eerst voeg je een <code>PanelBody<\/code> element toe in <code>InspectorControls<\/code>\u00a0op hetzelfde niveau als <code>PanelColorSettings<\/code>:<\/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>Dit is wat we hiermee doen:<\/p>\n<ol>\n<li>Het <code>title<\/code> attribuut levert de paneeltitel.<\/li>\n<li><code>initialOpen<\/code> stelt in of het paneel initieel open is of niet.<\/li>\n<\/ol>\n<p>Vervolgens voegen we twee <code>PanelRow<\/code>\u00a0elementen toe in <code>PanelBody<\/code> en een <code>TextControl<\/code>\u00a0element in elke <code>PanelRow<\/code>:<\/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>De bovenstaande code zou er nu vrij eenvoudig uit moeten zien. Met de twee tekstbesturingselementen kunnen gebruikers het linklabel en de URL instellen.<\/p>\n<p>We zullen ook een extra <code>PanelRow<\/code> toevoegen met een <code>ToggleControl<\/code> om een \u200b\u200bspecifieke optie in of uit te schakelen, zoals het wel of niet opnemen van een attribuut:<\/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>Stap 3: Definieer de benodigde attributen in block.json<\/h4>\n<p>Definieer nu de attributen <code>kaLink<\/code>, <code>linkLabel<\/code> en <code>hasLinkNofollow<\/code> in het bestand <strong>block.json<\/strong>\u00a0:<\/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 valt niets meer aan toe te voegen! Laten we verder gaan met het defini\u00ebren van de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">event-handler<\/a> functies.<\/p>\n<h4>Stap 4: Definieer de event-handlers<\/h4>\n<p>Ga terug naar het <strong>edit.js<\/strong> bestand, voeg de nieuwe attributen toe aan het attributen object en voeg de volgende functies toe:<\/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>Deze functies updaten de corresponderende attribuutwaarden bij gebruikersinvoer.<\/p>\n<h4>Stap 5: Gegevens opslaan<\/h4>\n<p>Als laatste moeten we de <code>save<\/code> functie in <strong>save.js<\/strong> bijwerken:<\/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>Merk op dat we hier een regulier <code>a<\/code> element hebben gebruikt in plaats van <code>ExternalLink<\/code>.<\/p>\n<p>Je kunt het resultaat in de afbeelding hieronder zien.<\/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=\"Het paneel met Link settings in de zijbalk met blokinstellingen\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">Het paneel met Link settings in de zijbalk met blokinstellingen<\/figcaption><\/figure>\n<p>\u00a0<\/p>\n<h3 id=\"multiple-block-styles\">Meerdere blokstijlen toevoegen<\/h3>\n<p>In een vorige sectie heb je geleerd hoe je een blokwerkbalkbesturingselement kunt toevoegen waarmee gebruikers de gebruikersinvoer kunnen uitlijnen. We kunnen meer stijlbesturingselementen toevoegen aan de blokwerkbalk, maar we kunnen ook een set vooraf gedefinieerde blokstijlen bieden waaruit de gebruiker met een enkele klik kan kiezen.<\/p>\n<p>Voor dit doel gaan we een handige functie van de Blok API gebruiken: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Block Styles<\/a>.<\/p>\n<p>Het enige wat je hoeft te doen, is de property <strong>block.json<\/strong>\u00a0<code>styles<\/code> defini\u00ebren en de bijbehorende stijlen in je stylesheets declareren.<\/p>\n<p>Je kunt bijvoorbeeld de volgende reeks stijlen toevoegen:<\/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>Hiermee heb je zojuist een standaardstijl en een extra stijl met de naam <code>border<\/code> toegevoegd. Ga nu terug naar de 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=\"Twee voorgebouwde blokstijlen.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Twee voorgebouwde blokstijlen.<\/figcaption><\/figure>\n<p>De stijlen zijn beschikbaar voor de gebruiker door op de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-5-8\/#normalized-block-toolbars\">blok switcher<\/a> te klikken en vervolgens naar het <strong>Styles panel<\/strong> in de <strong>Block Settings Sidebar<\/strong> te zoeken.<\/p>\n<p>Selecteer een stijl en controleer de klassen die op het <code>p<\/code> element zijn toegepast. Klik met de rechtermuisknop op het blok en <strong>Inspect<\/strong>. Er is een nieuwe klasse toegevoegd met een naam die als volgt is opgebouwd:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Als je de &#8220;Border&#8221; stijl hebt aangevinkt, wordt een <code>is-style-border<\/code>\u00a0toegevoegd aan het <code>p<\/code> -element. Als je de stijl &#8221; Default&#8221; hebt aangevinkt, wordt in plaats daarvan een <code>is-style-default<\/code> klasse toegevoegd.<\/p>\n<p>Nu kun je hetzelfde doen met <strong>style.scss<\/strong>. Zoals we hierboven al zeiden, worden stijlen die zijn gedefinieerd in <strong>style.scss<\/strong> zowel op de frontend als in de editor toegepast:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Nu kun je hetzelfde doen met <strong>style.scss<\/strong>:<\/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>En dat is het! Ververs de pagina en veel plezier met je nieuwe blokstijlen:<\/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=\"Vergelijking blokstijlen\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Vergelijking blokstijlen<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Gutenberg blokken nesten met de InnerBlocks component<\/h3>\n<p>Hoewel volledig functioneel, is ons aangepaste blok nog steeds niet erg aantrekkelijk. Om het aantrekkelijker te maken voor het publiek kunnen we een afbeelding toevoegen.<\/p>\n<p>Dit voegt misschien een laag complexiteit toe aan ons blok, maar gelukkig hoef je het wiel niet opnieuw uit te vinden omdat Gutenberg een specifiek component biedt dat je kunt gebruiken om een \u200b\u200bstructuur van <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">geneste blokken<\/a> te maken.<\/p>\n<p>De component <code>InnerBlocks<\/code>\u00a0is als <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">volgt gedefinieerd<\/a>:<\/p>\n<blockquote><p><em><code>InnerBlocks<\/code> exporteert een paar componenten die kunnen worden gebruikt in blokimplementaties om geneste blokinhoud mogelijk te maken.<\/em><\/p><\/blockquote>\n<p>Eerst moet je een nieuw <strong>.js<\/strong>\u00a0bestand maken in de <strong>src<\/strong>\u00a0map. In ons voorbeeld noemen we dit bestand <strong>container.js<\/strong>.<\/p>\n<p>Nu moet je de nieuwe bron importeren in het <strong>index.js<\/strong>\u00a0bestand:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>Ga terug naar <strong>container.js<\/strong>\u00a0en importeer de benodigde componenten:<\/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>De volgende stap is het defini\u00ebren van een template die de structuur biedt waarbinnen de blokken worden geplaatst. In het volgende voorbeeld defini\u00ebren we een template die bestaat uit twee kolommen met een core Image blok en ons aangepaste blok:<\/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>De template is gestructureerd als een <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">reeks blok typen<\/a> (bloknaam en optionele attributen).<\/p>\n<p>In de bovenstaande code hebben we verschillende attributen gebruikt om de kolommen en kolomblokken te configureren. In het bijzonder vergrendelt het <code>templateLock: 'all'<\/code>\u00a0attribuut Kolomblokken zodat de gebruiker geen bestaande blokken kan toevoegen, opnieuw ordenen of verwijderen. <code>templateLock<\/code>\u00a0kan een van de volgende waarden aannemen:<\/p>\n<ul>\n<li><code>all<\/code> \u2014 <code>InnerBlocks<\/code> is vergrendeld en er kunnen geen blokken worden toegevoegd, opnieuw gerangschikt of verwijderd.<\/li>\n<li><code>insert<\/code> \u2014 Blokken kunnen alleen opnieuw worden gerangschikt of verwijderd.<\/li>\n<li><code>false<\/code> \u2014 De template is niet vergrendeld.<\/li>\n<\/ul>\n<p>De sjabloon wordt vervolgens toegewezen aan het <code>InnerBlocks<\/code>\u00a0element:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>Om compatibiliteitsproblemen te voorkomen, hebben we ook een <code>templateLock<\/code> attribuut toegevoegd aan de <code>InnerBlocks<\/code>\u00a0component (zie ook probleem #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> en #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Hier is het definitieve <strong>container.js<\/strong> bestand:<\/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=\"Het laatste blok in de blokeditor\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">Het laatste blok in de blokeditor<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Aanvullende verbeteringen<\/h3>\n<p>Ons blok is volledig functioneel, maar we kunnen het een beetje verbeteren met een paar kleine veranderingen.<\/p>\n<p>We hebben het attribuut <code>backgroundColor<\/code>\u00a0toegewezen aan de alinea die is gegenereerd door de <code>RichText<\/code> component. We kunnen er echter de voorkeur aan geven de achtergrondkleur toe te wijzen aan de container <code>div<\/code>:<\/p>\n<p>Wijzig dus het bestand <strong>edit.js<\/strong> en <strong>save.js<\/strong> <code>div<\/code> als volgt:<\/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>Hierdoor kan de gebruiker de achtergrond van het hele blok wijzigen.<\/p>\n<p>Aan de andere kant is een meer relevante verandering de <code>useBlockProps<\/code> methode. In de originele code hebben we de constante <code>blockProps<\/code>\u00a0als volgt gedefinieerd:<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Maar we kunnen de <code>useBlockProps<\/code> effectiever <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">gebruiken door een reeks properties door te geven<\/a>. We kunnen bijvoorbeeld <code>classnames<\/code>\u00a0importeren uit de module <code>classnames<\/code>\u00a0en de naam van de wrapperklasse dienovereenkomstig instellen.<\/p>\n<p>In het volgende voorbeeld wijzen we een klassenaam toe op basis van de waarde van het <code>align<\/code>\u00a0attribuut (<strong>edit.js<\/strong>).<\/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>We doen dezelfde wijziging in het bestand <strong>save.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport 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}<\/code><\/pre>\n<p>Klaar is Kees! Je kunt de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">build nu uitvoeren voor productie<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Samenvatting<\/h2>\n<p>En hier zijn we dan, aan het einde van deze ongelooflijke reis! We zijn begonnen met de configuratie van de ontwikkelomgeving en hebben uiteindelijk een compleet bloktype gemaakt.<\/p>\n<p>Zoals we in de inleiding al zeiden, is een gedegen kennis van Node.js, Webpack, Babel en React essentieel om geavanceerde Gutenberg blokken te maken en jezelf als professionele Gutenberg ontwikkelaar in de markt te positioneren.<\/p>\n<p>Maar je hoeft geen React ervaring te hebben om plezier te hebben met blokontwikkeling. Blokontwikkeling kan je motivatie en doelen geven om steeds bredere vaardigheden te verwerven in de technologie\u00ebn achter Gutenberg blokken.<\/p>\n<p>Deze gids is dan ook verre van volledig. Het is slechts een inleiding tot een breed scala aan onderwerpen die je zullen helpen om aan de slag te gaan met het bouwen van je allereerste Gutenberg blokken.<\/p>\n<p>Om deze reden raden we je aan je kennis te verdiepen door zorgvuldig online documentatie en handleidingen te lezen. Van de vele beschikbare bronnen raden we het volgende aan:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Official Create a Block Tutorial<\/a>\u00a0voor beginners<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Official Block Tutorial<\/a>\u00a0voor gevorderde ontwikkelaars<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Dynamic Blocks<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/dynamische-blokken\/\">How to Create Dynamic Blocks for Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Meta Boxes<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Creating a Sidebar for Your Plugin<\/a><\/li>\n<\/ul>\n<p>Als je net begint met WordPress ontwikkeling, wil je misschien de basisconcepten van frontend-ontwikkeling begrijpen. Hier is een korte lijst met bronnen die je kunnen helpen om aan de slag te gaan:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/nl\/ebooks\/wordpress\/wordpress-lokale-ontwikkeling\/\">Zo installeer je lokaal WordPress<\/a>\u00a0(gratis ebook)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/ebooks\/wordpress\/managed-wordpress-hosting\/\">De echte waarde van managed WordPress hosting<\/a>\u00a0(gratis ebook)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-javascript\/\">Wat is JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/html-vs-html5\/\">HTML vs HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-css\/\">Zo bewerk je CSS in WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-php\/\">Wat is PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\">De WordPress hooks bootcamp: Zo gebruik je actions, filters en custom hooks<\/a><\/li>\n<\/ul>\n<p>En onthoud dat de volledige code van de voorbeelden van deze handleiding <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">beschikbaar is op Gist<\/a>.<\/p>\n<p>Nu is het jouw beurt: heb je Gutenberg blokken ontwikkeld? Wat zijn de belangrijkste moeilijkheden die je tot nu toe hebt ondervonden? Laat ons weten wat je ervaring is in de comments!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veel mensen klagen dat het lastig is om aan de slag te gaan met het bouwen van Gutenberg blokken en -apps. De leercurve is steil, voornamelijk &#8230;<\/p>\n","protected":false},"author":36,"featured_media":40689,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[476,384,46],"topic":[892],"class_list":["post-40688","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg","topic-wordpress-ontwikkeling"],"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>Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen<\/title>\n<meta name=\"description\" content=\"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.\" \/>\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\/nl\/blog\/gutenberg-blokken\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen\" \/>\n<meta property=\"og:description\" content=\"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-11-11T09:40:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-07T06:24:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.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=\"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"52 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen\",\"datePublished\":\"2021-11-11T09:40:07+00:00\",\"dateModified\":\"2023-08-07T06:24:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\"},\"wordCount\":8156,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"articleSection\":[\"WordPress ontwikkeling\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\",\"name\":\"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png\",\"datePublished\":\"2021-11-11T09:40:07+00:00\",\"dateModified\":\"2023-08-07T06:24:37+00:00\",\"description\":\"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png\",\"width\":1460,\"height\":730,\"caption\":\"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress ontwikkeling\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-ontwikkeling\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"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\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen","description":"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.","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\/nl\/blog\/gutenberg-blokken\/","og_locale":"nl_NL","og_type":"article","og_title":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen","og_description":"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.","og_url":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2021-11-11T09:40:07+00:00","article_modified_time":"2023-08-07T06:24:37+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Carlo Daniele","Geschatte leestijd":"52 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen","datePublished":"2021-11-11T09:40:07+00:00","dateModified":"2023-08-07T06:24:37+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/"},"wordCount":8156,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png","keywords":["Block Editor","development","Gutenberg"],"articleSection":["WordPress ontwikkeling"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/","url":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/","name":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png","datePublished":"2021-11-11T09:40:07+00:00","dateModified":"2023-08-07T06:24:37+00:00","description":"Het bouwen van Gutenberg blokken kan er op het eerste gezicht enorm lastig uitzien. Maar dat is het niet! In deze uitgebreide gids laten we je zien hoe je je eerste WP blok maakt.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/11\/Gutenberg-blocks_Blog_cover.png","width":1460,"height":730,"caption":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"WordPress ontwikkeling","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-ontwikkeling\/"},{"@type":"ListItem","position":3,"name":"Custom Gutenberg blokken bouwen: de ultieme tutorial om zelf blokken te ontwikkelen"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","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\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/40688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=40688"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/40688\/revisions"}],"predecessor-version":[{"id":54747,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/40688\/revisions\/54747"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/translations\/se"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/40688\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/40689"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=40688"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=40688"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=40688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}