{"id":45508,"date":"2022-10-04T14:22:02","date_gmt":"2022-10-04T13:22:02","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=45508&#038;preview=true&#038;preview_id=45508"},"modified":"2023-08-24T11:27:05","modified_gmt":"2023-08-24T10:27:05","slug":"gutenberg-blokke","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/","title":{"rendered":"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke"},"content":{"rendered":"<p>Mange mennesker klager over de forhindringer, der er forbundet med at komme i gang med at bygge Gutenberg-blokke og -apps. Indl\u00e6ringskurven er stejl, prim\u00e6rt p\u00e5 grund af vanskeligheden ved at installere og konfigurere udviklingsmilj\u00f8et. Derudover er et solidt kendskab til JavaScript, Node.js, React og Redux uundv\u00e6rlige ingredienser til denne ret komplekse opskrift.<\/p>\n<p>Den officielle <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">WordPress Block Editor Handbook<\/a> giver udviklere en enorm m\u00e6ngde oplysninger, men du kan finde dig selv fortabt i dette hav af detaljer.<\/p>\n<p>Og det er v\u00e6rd at n\u00e6vne, hvad Mat\u00edas Ventura, ledende arkitekt for Gutenberg-projektet, rapporterede i <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">sit interview med WP Tavern<\/a>:<\/p>\n<blockquote><p><em>Selv om der er folk, der kan l\u00e6re det hurtigt, er det stadig en stor barriere for folk. Jeg tror, der er flere lag i dette; dokumentationen kunne v\u00e6re en st\u00f8rrelsesorden bedre i b\u00e5de organisation og pr\u00e6sentation. Jeg h\u00e5ber, at vi kan g\u00f8re meget mere p\u00e5 dette omr\u00e5de.<\/em><\/p><\/blockquote>\n<p>Med det i tankerne har vi besluttet at give en trinvis vejledning, der har til form\u00e5l at hj\u00e6lpe vores l\u00e6sere med at komme i gang med udvikling af Gutenberg-blokke.<\/p>\n<p>Lyder det interessant? Lad os dykke ned i det!<\/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>Foruds\u00e6tninger for udvikling af Gutenberg-blokke<\/h2>\n<p>Til denne tutorial er de eneste n\u00f8dvendige f\u00e6rdigheder et godt kendskab til udvikling af WordPress-plugins og mindst en <a href=\"https:\/\/kinsta.com\/blog\/html-best-practices\/\">grundl\u00e6ggende forst\u00e5else af HTML<\/a>, CSS, JavaScript og React.<\/p>\n<p>Bliver dette et ambiti\u00f8st projekt? Det kan du bande p\u00e5, at det vil v\u00e6re!<\/p>\n<p>Det var ikke let at finde det rette kompromis mellem fuldst\u00e6ndighed og enkelhed eller at beslutte, hvilke emner der skulle medtages og hvilke der skulle udelades.<\/p>\n<p>Forh\u00e5bentlig vil mellemliggende og avancerede l\u00e6sere tilgive, at vi ikke dykker dybt ned i visse koncepter som <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">React state<\/a>, <a href=\"https:\/\/redux.js.org\/api\/store\">Redux store<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">high order components<\/a> osv. Disse emner kr\u00e6ver ekstra plads og opm\u00e6rksomhed og er sandsynligvis for avancerede for begyndende blokudvikling (medmindre du er React-udvikler).<\/p>\n<p>Af samme grund vil vi ikke d\u00e6kke nogle af de mere avancerede emner i forbindelse med udvikling af Gutenberg-blokke, s\u00e5som <a href=\"https:\/\/kinsta.com\/blog\/dynamic-blocks\/\">dynamiske blokke<\/a> og <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">metabokse<\/a>.<\/p>\n<p>Med den viden, du f\u00e5r n\u00e5r vi n\u00e5r enden af denne artikel, vil du kunne begynde at have det sjovt og v\u00e6re produktiv med det samme.<\/p>\n<p>N\u00e5r du f\u00f8rst er kommet i gang med blokbygning, vil du v\u00e6re klar til at forbedre dine f\u00e6rdigheder yderligere og bygge endnu mere avancerede Gutenberg-blokke p\u00e5 egen h\u00e5nd.<\/p>\n\n<h2>Hvad er en Gutenberg-blok?<\/h2>\n<p>Siden den blev frigivet f\u00f8rste gang i december 2018 er <a href=\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-wordpress-editor\/\">blokredigeringsprogrammet<\/a> blevet kraftigt forbedret i alle aspekter: mere <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">kraftfulde API&#8217;er<\/a>, en mere avanceret brugergr\u00e6nseflade, forbedret brugervenlighed, et ton af nye blokke, de <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">f\u00f8rste implementeringer af Full Site Editing<\/a> og meget mere.<\/p>\n<p>Kort sagt, selv om Gutenberg stadig er under kraftig udvikling, er det kommet langt \u2014 og i dag er blokeditoren en fuldgyldig kandidat som en p\u00e5lidelig, funktionel website builder.<\/p>\n<p>Set fra en udviklers synspunkt er Gutenberg en React-baseret <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">Single Page Application<\/a> (SPA), der giver WordPress-brugere mulighed for at oprette, redigere og slette indhold i WordPress. Dette b\u00f8r dog ikke f\u00e5 dig til at t\u00e6nke p\u00e5 en forbedret version af den <a href=\"https:\/\/kinsta.com\/blog\/wordpress-tinymce-editor\/\">traditionelle indholdseditor<\/a>.<\/p>\n<p>Vi \u00f8nsker at g\u00f8re dette klart:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg er <em>ikke<\/em><\/strong> <strong>en almindelig WYSIWYG-editor. Det redefinerer snarere hele redigeringsoplevelsen i WordPress.<\/strong><\/p>\n<\/aside>\n\n<p>I Gutenberg er indholdet opdelt i blokke, som er &#8220;mursten&#8221;, som brugerne kan bruge til at oprette indl\u00e6g og sider eller hele deres websites.<\/p>\n<p>Men hvad er en blok teknisk set?<\/p>\n<p>Vi kan godt lide <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">WordPress&#8217; definition<\/a>:<\/p>\n<blockquote><p><em>&#8220;Blok&#8221; er den abstrakte betegnelse, der bruges til at beskrive enheder af markup, som, sammensat sammen, udg\u00f8r indholdet eller layoutet af en webside. Ideen kombinerer koncepter af det, som vi i WordPress i dag opn\u00e5r med shortcodes, tilpasset HTML og embed discovery, i et enkelt konsistent API og en enkelt brugeroplevelse.<\/em><\/p><\/blockquote>\n<p>Titler, afsnit, kolonner, billeder, gallerier og alle de elementer, der udg\u00f8r editorens brugerflade, fra sidebarpaneler til kontrolelementer i blokv\u00e6rkt\u00f8jslinjen, er React-komponenter.<\/p>\n<p>S\u00e5 hvad er React-komponenter? W3Schools giver <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">f\u00f8lgende definition<\/a>:<\/p>\n<blockquote><p><em>Komponenter er uafh\u00e6ngige og genanvendelige kodestykker. De tjener det samme form\u00e5l som JavaScript-funktioner, men arbejder isoleret og returnerer HTML via en <code>render()<\/code> -funktion.<\/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=\"Arbejde med Gutenberg-blokke i WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Arbejde med Gutenberg-blokke i WordPress 5.8.<\/figcaption><\/figure>\n<p>Mens den redigeringsoplevelse, der leveres af Gutenberg, er ny i forhold til den klassiske WordPress-editor, \u00e6ndres den m\u00e5de, WordPress gemmer dine stykker indhold i databasen, p\u00e5 ingen m\u00e5de. Det skyldes, at Gutenberg er et program, der fungerer i WordPress, men som ikke \u00e6ndrer den m\u00e5de, CMS&#8217;et fungerer p\u00e5 i sin kerne.<\/p>\n<p>Indl\u00e6g (og det omfatter indl\u00e6g, sider og brugerdefinerede indl\u00e6gstyper), der oprettes med Gutenberg, gemmes stadig i tabellen <code>wp_posts<\/code>, pr\u00e6cis som med den klassiske editor.<\/p>\n<p>Men i et indl\u00e6g oprettet med Gutenberg finder du yderligere bider af information i tabellen, som repr\u00e6senterer en grundl\u00e6ggende forskel mellem indl\u00e6g oprettet via den klassiske editor vs. Gutenberg.<\/p>\n<p>Disse stykker information ligner HTML-kommentarer, og de har en specifik funktion: afgr\u00e6nsning af blokke:<\/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=\"Et blogindl\u00e6g i koderedigeringsvisning.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Et blogindl\u00e6g i Code editor view.<\/figcaption><\/figure>\n<p><strong>Blokafgr\u00e6nsere<\/strong> fort\u00e6ller WordPress, hvilken blok der skal gengives p\u00e5 sk\u00e6rmen. De giver ogs\u00e5 v\u00e6rdier for blokegenskaber i et JSON-objekt. Disse rekvisitter dikterer den m\u00e5de, som blokken skal gengives p\u00e5 sk\u00e6rmen:<\/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=\"Et blogindl\u00e6g gemt i wp_posts-tabel.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Et blogindl\u00e6g gemt i tabellen <code>wp_posts<\/code>.<\/figcaption><\/figure>\n<h2>Ops\u00e6tning af dit WordPress-udviklingsmilj\u00f8<\/h2>\n<p>Ops\u00e6tning af et moderne JavaScript-udviklingsmilj\u00f8 kr\u00e6ver et solidt kendskab til avancerede teknologier som <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> og <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> osv.<\/p>\n<p>Skr\u00e6mt? Det skal du ikke v\u00e6re! WordPress-f\u00e6llesskabet er allerede kommet til unds\u00e6tning ved at levere kraftfulde v\u00e6rkt\u00f8jer, der lader dig undg\u00e5 en rodet manuel konfigurationsproces.<\/p>\n<p>For at holde tingene enkle vil vi ikke d\u00e6kke <a href=\"https:\/\/kinsta.com\/blog\/transpiling-php\/\">transpiling<\/a> i denne artikel (som vi dog anbefaler, at du g\u00f8r dig bekendt med, n\u00e5r du har l\u00e6rt det grundl\u00e6ggende i blokudvikling). I stedet vil vi pr\u00e6sentere to alternative v\u00e6rkt\u00f8jer, som du kan bruge til hurtigt og nemt at ops\u00e6tte et moderne JavaScript-udviklingsmilj\u00f8 p\u00e5 f\u00e5 minutter. Det er op til dig at v\u00e6lge det, du finder mest praktisk for dit projekt.<\/p>\n<p>Ops\u00e6tning af et JavaScript-udviklingsmilj\u00f8 til at bygge Gutenberg-blokke er en proces i tre trin:<\/p>\n<ol>\n<li><a href=\"#node-npm\">Installer Node.js og npm<\/a><\/li>\n<li><a href=\"#dev-environment\">Ops\u00e6tning af udviklingsmilj\u00f8et<\/a><\/li>\n<li><a href=\"#block-plugin\">Ops\u00e6t blokpluginet<\/a><\/li>\n<\/ol>\n<p>Lad os komme i gang.<\/p>\n<h3 id=\"node-npm\">1. Installer Node.js og npm<\/h3>\n<p>F\u00f8r du installerer dit udviklingsmilj\u00f8 og registrerer din f\u00f8rste blok, skal du installere <a href=\"https:\/\/kinsta.com\/it\/knowledgebase\/node-js\/\">Node.js<\/a> og Node-pakkeh\u00e5ndteringsprogrammet (npm).<\/p>\n<p><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> er en JavaScript-k\u00f8retid, der er bygget p\u00e5 Chromes V8 JavaScript-motor. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, der almindeligvis er kendt som Node-pakkeh\u00e5ndteringsprogrammet, betragtes som &#8220;verdens st\u00f8rste softwareregister&#8221;<\/p>\n<\/aside>\n.<\/p>\n<p>Du kan <a href=\"https:\/\/kinsta.com\/dk\/blog\/saadan-installeres-node-js\/\">installere Node.js og npm<\/a> p\u00e5 <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">flere forskellige m\u00e5der<\/a>. Men f\u00f8rst vil du m\u00e5ske tjekke, om softwaren allerede er installeret p\u00e5 din maskine.<\/p>\n<p>For at g\u00f8re dette skal du starte terminalen og k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Hvis resultatet er <code>command not found<\/code>, er Node.js ikke installeret p\u00e5 din computer, og du kan forts\u00e6tte med installationen.<\/p>\n<p>I denne artikel har vi valgt den nemmeste installationsmulighed, som er <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Det eneste, du skal g\u00f8re, er at downloade den version, der svarer til dit operativsystem, og starte installationsguiden:<\/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 Downloadside.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">Node.js Downloads side.<\/figcaption><\/figure>\n<p>N\u00e5r du har installeret Node.js, skal du k\u00f8re kommandoen <code>node -v<\/code> i din terminal igen. Du kan ogs\u00e5 k\u00f8re kommandoen <code>npm -v<\/code> for at bekr\u00e6fte, at du har npm-pakken tilg\u00e6ngelig.<\/p>\n<p>Du er nu udstyret med f\u00f8lgende v\u00e6rkt\u00f8jer:<\/p>\n<ul>\n<li><code>npx<\/code> Node.js-pakkel\u00f8beren Node.js. Dette giver dig mulighed for at k\u00f8re en <code>npm<\/code> -kommando uden at installere den f\u00f8rst.<\/li>\n<li>Node.js-pakkeh\u00e5ndteringsprogrammet <code>npm<\/code> Node.js (<a href=\"https:\/\/docs.npmjs.com\/\">se dokumentationen<\/a>). Denne bruges til at installere afh\u00e6ngigheder og k\u00f8re scripts.<\/li>\n<\/ul>\n<p>Det n\u00e6ste skridt er at installere udviklingsmilj\u00f8et.<\/p>\n<h3 id=\"dev-environment\">2. Ops\u00e6tning af dit udviklingsmilj\u00f8<\/h3>\n<p>N\u00e5r du har de nyeste versioner af Node.js og npm p\u00e5 din lokale maskine, har du brug for et udviklingsmilj\u00f8 til WordPress.<\/p>\n<p>Du kan enten bruge et lokalt udviklingsmilj\u00f8 som DevKinsta eller bruge det officielle WordPress-v\u00e6rkt\u00f8j. Lad os tage et kig p\u00e5 begge muligheder.<\/p>\n<h4 id=\"devkinsta\">Mulighed 1: Lokalt udviklingsmilj\u00f8 (DevKinsta)<\/h4>\n<p>Med f\u00e5 klik kan du <a href=\"https:\/\/kinsta.com\/dk\/ebooks\/wordpress\/wordpress-lokal-udvikling\/\">installere WordPress lokalt<\/a> ved hj\u00e6lp af <a href=\"https:\/\/kinsta.com\/dk\/devkinsta\/\">DevKinsta<\/a>, vores moderne lokale WordPress-udviklingsv\u00e6rkt\u00f8j, med f\u00e5 klik. Eller du kan v\u00e6lge et andet lokalt udviklingsv\u00e6rkt\u00f8j, som f.eks. <a href=\"https:\/\/kinsta.com\/dk\/blog\/installeres-wordpress-lokalt\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> eller <a href=\"https:\/\/kinsta.com\/dk\/blog\/installeres-wordpress-lokalt\/#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=\"Opret et nyt WordPress-websted i DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Opret et nyt WordPress-websted i DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Mulighed 2: wp-env<\/h4>\n<p>Du kan ogs\u00e5 v\u00e6lge det officielle <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">v\u00e6rkt\u00f8j<code>wp-env<\/code><\/a>, som giver et lokalt WordPress-dev-milj\u00f8, som du kan starte direkte fra kommandolinjen. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">definerer det som f\u00f8lgende<\/a>:<\/p>\n<blockquote><p><em>Lokale WordPress-milj\u00f8er er nu lige s\u00e5 enkle som at k\u00f8re en enkelt kommando. <code>wp-env<\/code> er et nulkonfigurationsv\u00e6rkt\u00f8j til smertefrie lokale WordPress-milj\u00f8er. Det giver beslutninger over indstillinger, s\u00e5 brugerne hurtigt kan spinne WordPress op uden at spilde tid. M\u00e5let er nemlig at g\u00f8re disse milj\u00f8er let tilg\u00e6ngelige for alle &#8211; uanset om du er udvikler, designer, leder eller andet.<\/em><\/p><\/blockquote>\n<p>Hvis du beslutter dig for at give det et fors\u00f8g, kr\u00e6ver installation af <code>wp-env<\/code> en minimal indsats. Du skal blot f\u00f8lge disse trin:<\/p>\n<h5>Trin 1: Bekr\u00e6ft installation af Docker og Node.js<\/h5>\n<p>For at opfylde de tekniske krav skal du f\u00f8rst have b\u00e5de <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> og Node.js installeret p\u00e5 din computer. Det skyldes, at <code>wp-env<\/code> opretter en Docker-instans, der k\u00f8rer et WordPress-websted. Alle \u00e6ndringer, der foretages i koden, afspejles straks i WordPress-instansen.<\/p>\n<h5>Trin 2: Installer <code>@wordpress\/env<\/code> fra kommandolinjen<\/h5>\n<p>N\u00e5r Docker og Node.js k\u00f8rer p\u00e5 din computer, kan du g\u00e5 videre og installere <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress-udviklingsmilj\u00f8et<\/a>.<\/p>\n<p>Du kan installere <code>wp-env<\/code> enten globalt eller lokalt. Hvis du vil g\u00f8re det globalt, skal du k\u00f8re f\u00f8lgende kommando fra plugins-mappen (mere om dette i boksen &#8220;Vigtigt&#8221; nedenfor):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>Lad os bryde det ned:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">installerer pakken<\/a>.<\/li>\n<li><code>-g<\/code> som tilf\u00f8jes til kommandoen <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">installerer den angivne pakke globalt<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> er den <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">pakke, du vil installere<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Som standard er nodepakker p\u00e5 Mac og Linux installeret i <strong>\/usr\/local\/lib\/node_modules<\/strong>.<\/p>\n<p>Hvis den aktuelle bruger ikke har skrivetilladelse til denne mappe, vil der blive udstedt en EACCES-fejl. F\u00e5 mere at vide om at <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">l\u00f8se EACCES-tilladelsesfejl ved global installation af pakker<\/a>.<\/p>\n<\/aside>\n\n<p>For at bekr\u00e6fte, at <code>wp-env<\/code> er blevet installeret med succes, skal du k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Du b\u00f8r se den aktuelle <code>wp-env<\/code> -version, hvilket betyder, at du nu kan starte milj\u00f8et ved hj\u00e6lp af f\u00f8lgende kommando <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">fra din plugin-mappe<\/a>:<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Du kan f\u00e5 adgang til WordPress-dashboardet ved hj\u00e6lp af f\u00f8lgende adresse:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>Standardoplysningerne er som f\u00f8lger:<\/p>\n<ul>\n<li>Brugernavn: <code>admin<\/code><\/li>\n<li>Adgangskode: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Ops\u00e6tning af dit blokeringsplugin<\/h3>\n<p>Nu har du brug for et startblok-plugin til at bygge videre p\u00e5. Men i stedet for manuelt at oprette et udviklingsblok-plugin med alle n\u00f8dvendige filer og mapper kan du blot k\u00f8re et dev-tool, der leverer alle de filer og konfigurationer, du har brug for for at komme i gang med blokudvikling.<\/p>\n<p>Igen har du et par muligheder at v\u00e6lge imellem. Lad os tage et kig p\u00e5 hver enkelt.<\/p>\n<h4 id=\"create-block\">Mulighed 1: Ops\u00e6tning af et blokplugin med @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> er det officielle nulkonfigurationsv\u00e6rkt\u00f8j til oprettelse af Gutenberg-blokke:<\/p>\n<blockquote><p><em>Create Block er en officielt underst\u00f8ttet m\u00e5de at oprette blokke p\u00e5 for at registrere en blok til et WordPress-plugin. Det tilbyder en moderne opbygning ops\u00e6tning uden konfiguration. Det genererer PHP-, JS- og CSS-kode og alt andet, du har brug for til at starte projektet.<\/em><\/p>\n<p>Den er i h\u00f8j grad inspireret af <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Stor ros til <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, hele Facebook-holdet og React-f\u00e6llesskabet.<\/p><\/blockquote>\n<p>N\u00e5r dit lokale milj\u00f8 er oppe at k\u00f8re, kan du oprette en startblok ved blot at k\u00f8re <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">kommandoen<\/a> <code>npx @wordpress\/create-block<\/code>, og den vil levere alle de filer og mapper, du har brug for til at <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">oprette plugin-stilladset<\/a> og registrere en ny blok.<\/p>\n<p>Lad os k\u00f8re en test for at se, hvordan det fungerer.<\/p>\n<p>Fra dit kommandolinjev\u00e6rkt\u00f8j skal du navigere til mappen <strong>\/wp-content\/plugins\/<\/strong> og k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>N\u00e5r du bliver bedt om at bekr\u00e6fte, skal du indtaste <code>y<\/code> for at forts\u00e6tte:<\/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=\"Oprettelse af en blok med @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Oprettelse af en blok med @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Processen tager et lidt tid. N\u00e5r den er f\u00e6rdig, b\u00f8r du f\u00e5 f\u00f8lgende svar:<\/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=\"Block plugin er blevet oprettet.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">Block plugin er blevet oprettet.<\/figcaption><\/figure>\n<p>Og det var det!<\/p>\n<p>Start nu dit WordPress-udviklingsmilj\u00f8 og g\u00e5 til sk\u00e6rmen <strong>Plugins<\/strong> i WordPress-dashboardet. Et nyt plugin ved navn &#8220;My First Block&#8221; skulle v\u00e6re blevet tilf\u00f8jet til din plugin-liste:<\/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=\"Block-plugin'et er blevet installeret med succes.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">Block-pluginet er blevet installeret med succes.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Hvis du bruger v\u00e6rkt\u00f8jet <code>wp-env<\/code> og k\u00f8rer <code>wp-env start<\/code> fra den mappe, der indeholder pluginet, vil det automatisk montere og aktivere pluginet. Hvis du k\u00f8rer <code>wp-env start<\/code> fra en anden mappe, vil et generisk WordPress-milj\u00f8 blive oprettet (se ogs\u00e5 <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress Development Site<\/a>).<\/p>\n<\/aside>\n\n<p>Aktiv\u00e9r pluginet om n\u00f8dvendigt, opret et nyt blogindl\u00e6g, rul ned i blokindsatsen til sektionen <strong>Widgets<\/strong>, og v\u00e6lg din nye 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=\"wp-image-134071 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt=\"En eksempelblok oprettet med @wordpress\/create-block.\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">En eksempelblok oprettet med @wordpress\/create-block.<\/figcaption><\/figure>\n<p>G\u00e5 nu tilbage til terminalen og \u00e6ndre den aktuelle mappe til <strong>my-first-block<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>K\u00f8r derefter f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Dette giver dig mulighed for at k\u00f8re pluginet i udviklingstilstand. Hvis du vil oprette produktionskoden, skal du bruge f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Mulighed 2: Ops\u00e6tning af et blokplugin med create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> er et udviklingsv\u00e6rkt\u00f8j fra en tredjepart til at bygge Gutenberg-blokke:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> is zero configuration dev-toolkit (#0CJS) til at udvikle WordPress Gutenberg-blokke p\u00e5 f\u00e5 minutter uden at konfigurere React, webpack, ES6\/7\/8\/Next, ESLint, Babel osv.<\/em><\/p><\/blockquote>\n<p>Ligesom det officielle v\u00e6rkt\u00f8j <code>create-block<\/code> er <code>create-guten-block<\/code> baseret p\u00e5 <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> og kan hj\u00e6lpe dig med at generere dit f\u00f8rste blokplugin uden besv\u00e6r.<\/p>\n<p>V\u00e6rkt\u00f8jss\u00e6ttet indeholder alt, hvad du har brug for til at oprette et moderne WordPress-plugin, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">herunder f\u00f8lgende<\/a>:<\/p>\n<blockquote>\n<ul>\n<li>React, JSX og ES6-syntaksunderst\u00f8ttelse.<\/li>\n<li>webpack dev\/produktions build proces bag scenen.<\/li>\n<li>Sproglige ekstramateriale ud over ES6 som f.eks. <a href=\"https:\/\/kinsta.com\/blog\/spread-operator-javascript\/\">objektspredningsoperatoren<\/a>.<\/li>\n<li>CSS med automatisk pr\u00e6fikseret CSS, s\u00e5 du ikke beh\u00f8ver -webkit eller andre pr\u00e6fikser.<\/li>\n<li>Et build-script til at bundle JS, CSS og billeder til produktion med source-maps.<\/li>\n<li>Probleml\u00f8se opdateringer til ovenst\u00e5ende v\u00e6rkt\u00f8jer med en enkelt afh\u00e6ngighed cgb-scripts.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Bem\u00e6rk f\u00f8lgende advarsel:<\/p>\n<blockquote><p><em>Kompromiset er, at disse v\u00e6rkt\u00f8jer er forudkonfigureret til at fungere p\u00e5 en bestemt m\u00e5de. Hvis dit projekt har brug for mere tilpasning, kan du <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">&#8220;skubbe&#8221;<\/a> det ud og tilpasse det, men s\u00e5 skal du vedligeholde denne konfiguration.<\/em><\/p><\/blockquote>\n<p>N\u00e5r du har et lokalt WordPress-websted ved h\u00e5nden, skal du starte dit kommandolinjev\u00e6rkt\u00f8j, navigere til mappen <strong>\/wp-content\/plugins<\/strong> i din installation og k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Du skal vente et minut eller to, mens projektstrukturen oprettes og afh\u00e6ngighederne downloades:<\/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=\"Oprettelse af en Gutenberg-blok med create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Oprettelse af en Gutenberg-blok med create-guten-block.<\/figcaption><\/figure>\n<p>N\u00e5r processen er afsluttet, b\u00f8r du se f\u00f8lgende sk\u00e6rm:<\/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 oprettet med succes med create-guten-block.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Gutenberg-blok oprettet med succes med create-guten-block.<\/figcaption><\/figure>\n<p>Det n\u00e6ste billede viser projektstrukturen med terminalen, der k\u00f8rer i <a href=\"https:\/\/kinsta.com\/dk\/blog\/bedste-teksteditorer\/#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=\"Block-plugin i Visual Studio Code:\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">Block-plugin i Visual Studio Code:<\/figcaption><\/figure>\n<p>G\u00e5 nu tilbage til dit WordPress-dashboard. Et nyt element b\u00f8r v\u00e6re opf\u00f8rt p\u00e5 sk\u00e6rmen Plugins \u2014 det er <strong>my-first-block<\/strong> pluginet:<\/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=\"Sk\u00e6rmbilledet Plugins med et nyt plugin oprettet med create-guten-block.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">Sk\u00e6rmbilledet Plugins med et nyt plugin oprettet med create-guten-block.<\/figcaption><\/figure>\n<p>Aktiv\u00e9r pluginet og g\u00e5 tilbage til terminalen. Skift den aktuelle mappe til <strong>my-first-block<\/strong>, og k\u00f8r derefter <code>npm start<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Du b\u00f8r f\u00e5 f\u00f8lgende svar:<\/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 started.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm started.<\/figcaption><\/figure>\n<p>Igen giver dette dig mulighed for at k\u00f8re plugin&#8217;et i udviklingstilstand. For at oprette produktionskoden skal du bruge:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Aktiv\u00e9r pluginet og opret et nyt indl\u00e6g eller en ny side, gennemse derefter dine blokke og v\u00e6lg din helt nye 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=\"En ny blok oprettet med create-guten-block.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">En ny blok oprettet med create-guten-block.<\/figcaption><\/figure>\n<p>For en mere dybdeg\u00e5ende oversigt eller i tilf\u00e6lde af fejl kan du se <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">dokumentationen fra Ahmad Awais<\/a>.<\/p>\n<h2>En gennemgang af Starter Block Scaffolding<\/h2>\n<p>Uanset hvilket af de to dev-tools \u2014 <code>create-block<\/code> eller <code>create-guten-block<\/code> \u2014 du v\u00e6lger, har du nu et block-stillads, som du kan bruge som udgangspunkt for at bygge et block-plugin.<\/p>\n<p>Men hvad er <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">block scaffolding<\/a> egentlig?<\/p>\n<blockquote><p><em>Block scaffolding er et kortfattet udtryk, der beskriver den underst\u00f8ttende mappestruktur, du har brug for, for at WordPress kan genkende en blok. Typisk indeholder denne mappe filer som <strong>index.php<\/strong>, <strong>index.js<\/strong>, <strong>style.css<\/strong> og andre &#8211; som igen indeholder kald som <code>register_block_type<\/code>.<\/em><\/p><\/blockquote>\n<p>Vi valgte det officielle <strong>Create Block<\/strong> dev-tool, da <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">det bruges i Block Editor Handbook<\/a>. Men selv hvis du v\u00e6lger at g\u00e5 med et tredjepartsv\u00e6rkt\u00f8j som <code>create-guten-block<\/code>, vil din oplevelse ikke v\u00e6re alt for anderledes.<\/p>\n<p>N\u00e5r det er sagt, s\u00e5 lad os dykke dybere ned i <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\"><code>create-block<\/code> -v\u00e6rkt\u00f8jet<\/a>.<\/p>\n<h3>Et n\u00e6rmere kig p\u00e5 Create Block Dev-v\u00e6rkt\u00f8jet<\/h3>\n<p>Som vi n\u00e6vnte ovenfor, er <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> det officielle kommandolinjev\u00e6rkt\u00f8j til at oprette Gutenberg-blokke. Ved at k\u00f8re <code>@wordpress\/create-block<\/code> i din terminal genereres de PHP-, JS- og SCSS-filer og den kode, der er n\u00f8dvendig for at registrere en ny bloktype:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (valgfrit) \u2014 bruges til at tildele blok-sluggen og installere pluginet<\/li>\n<li><code>[options]<\/code> (valgfrit) \u2014 tilg\u00e6ngelige indstillinger<\/li>\n<\/ul>\n<p>Som standard er der tildelt en <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a>-skabelon. Det betyder, at du f\u00e5r den <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">n\u00e6ste version af JavaScript<\/a> med tilf\u00f8jelsen af <a href=\"https:\/\/kinsta.com\/blog\/what-is-jsx\/\">JSX-syntaksen<\/a>.<\/p>\n<p>Hvis du udelader bloknavnet, k\u00f8rer kommandoen i interaktiv tilstand, s\u00e5 du kan tilpasse flere indstillinger, inden filerne genereres:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<figure id=\"attachment_133845\" aria-describedby=\"caption-attachment-133845\" style=\"width: 1684px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133845 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"K\u00f8rer Create Block i interaktiv tilstand\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">K\u00f8rer Create Block i interaktiv tilstand<\/figcaption><\/figure>\n<p>Billedet nedenfor viser filstrukturen for et blokplugin, der er oprettet med det officielle Create Block-v\u00e6rkt\u00f8j:<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133848 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"Filer og mapper i et blok-plugin oprettet med @wordpress\/create-block.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Filer og mapper i et blok-plugin oprettet med @wordpress\/create-block.<\/figcaption><\/figure>\n<p>N\u00e5r det er sagt, lad os gennemg\u00e5 de vigtigste filer og mapper i vores nye block plugin.<\/p>\n<h3 id=\"plugin-file\">Plugin-filen<\/h3>\n<p>Med den vigtigste plugin-fil <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registrerer du blokken p\u00e5 serveren<\/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>Funktionen <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registrerer en bloktype p\u00e5 serveren<\/a> ved hj\u00e6lp af de metadata, der er gemt i <strong>block.json<\/strong>-filen.<\/p>\n<p>Funktionen tager to parametre:<\/p>\n<ul>\n<li>Navnet p\u00e5 bloktypen, herunder namespace, eller en sti til den mappe, hvor <strong>block.json<\/strong>-filen er placeret, eller et fuldst\u00e6ndigt <code>WP_Block_Type<\/code> -objekt<\/li>\n<li>Et array af bloktypeargumenter<\/li>\n<\/ul>\n<p>I ovenst\u00e5ende kode returnerer den <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">magiske konstant<\/a> <code>__DIR__<\/code> den aktuelle mappe. Det betyder, at filen <strong>block.json<\/strong> befinder sig i undermappen <em>\/build<\/em>.<\/p>\n<h3 id=\"package-json\">Filen package.json<\/h3>\n<p>I <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">filen package.json<\/a> defineres JavaScript-egenskaber og scripts for dit projekt. Det er her, du kan installere dine projektafh\u00e6ngigheder.<\/p>\n<p>For bedre at forst\u00e5, hvad denne fil er beregnet til, skal du \u00e5bne den med din <a href=\"https:\/\/kinsta.com\/dk\/blog\/gratis-html-editors\/\">foretrukne kodeeditor<\/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><a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">Ejendommen<\/a> <code>scripts<\/code> er en <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">ordbog, der indeholder kommandoer<\/a>, som k\u00f8res p\u00e5 forskellige tidspunkter i <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">en pakkes livscyklus<\/a> ved hj\u00e6lp af <code>npm run [cmd]<\/code>.<\/p>\n<p>I denne artikel vil vi bruge <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">f\u00f8lgende kommandoer<\/a>:<\/p>\n<ul>\n<li><code>npm run build<\/code> \u2014 oprette et (komprimeret) produktionsbyggeri<\/li>\n<li><code>npm run start<\/code> eller <code>npm start<\/code> \u2014 opretter et (ukomprimeret) udviklingsbyggeri<\/li>\n<\/ul>\n<p><code>dependencies<\/code> og <code>devDependencies<\/code> er to objekter, der mapper <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">et pakkenavn til en version<\/a>. <code>dependencies<\/code> er p\u00e5kr\u00e6vet i produktion, mens <code>devDependences<\/code> kun er p\u00e5kr\u00e6vet til lokal udvikling (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">l\u00e6s mere<\/a>).<\/p>\n<p>Den eneste standard dev-afh\u00e6ngighed er pakken <code>@wordpress\/scripts<\/code>, som er <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">defineret som<\/a> &#8220;en samling af genanvendelige scripts skr\u00e6ddersyet til WordPress-udvikling.&#8221;<\/p>\n<h3 id=\"block-json\">Filen block.json<\/h3>\n<p>Fra WordPress 5.8 er <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadatafilen<\/a> <strong>block.json<\/strong> den <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-5-8\/#block-api-enhancements\">kanoniske m\u00e5de at registrere bloktyper<\/a> p\u00e5.<\/p>\n<p>At have en <strong>block.json<\/strong>-fil giver flere fordele, herunder <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">forbedret ydeevne<\/a> og bedre synlighed i <a href=\"https:\/\/wordpress.org\/plugins\/\">WordPress Plugins-kataloget<\/a>:<\/p>\n<blockquote><p><em>Fra et ydelsesperspektiv vil blokke, der er registreret med <strong>block.json<\/strong>, f\u00e5 optimeret deres asset enqueuing ud af boksen, n\u00e5r temaer underst\u00f8tter lazy loading-aktiver, n\u00e5r de er registreret med <strong>block.json<\/strong>. De CSS- og JavaScript-aktiver p\u00e5 frontend, der er anf\u00f8rt i egenskaberne <code>style<\/code> eller <code>script<\/code>, vil kun blive sat i k\u00f8, n\u00e5r blokken er til stede p\u00e5 siden, hvilket resulterer i reducerede sidest\u00f8rrelser.<\/em><\/p><\/blockquote>\n<p>K\u00f8rsel af kommandoen <code>@wordpress\/create-block<\/code> genererer f\u00f8lgende <strong>block.json<\/strong>-fil:<\/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>Her er den fulde liste over <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">standardegenskaber<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> \u2014 den version af API&#8217;en, som blokken anvender (den nuv\u00e6rende version er 2)<\/li>\n<li><code>name<\/code> \u2014 en unik identifikator for en blok, herunder et navnespace<\/li>\n<li><code>version<\/code> \u2014 den aktuelle version af en blok<\/li>\n<li><code>title<\/code> \u2014 en visningstitel for en blok<\/li>\n<li><code>category<\/code> \u2014 en blokkategori<\/li>\n<li><code>icon<\/code> \u2014 en <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a>-slug eller et brugerdefineret SVG-ikon<\/li>\n<li><code>description<\/code> \u2014 en kort beskrivelse, der er synlig i blokinspekt\u00f8ren<\/li>\n<li><code>supports<\/code> \u2014 et s\u00e6t indstillinger til at styre de funktioner, der anvendes i editoren<\/li>\n<li><code>textdomain<\/code> \u2014 plugin-tekstdom\u00e6net<\/li>\n<li><code>editorScript<\/code> \u2014 definitionen af editor-scriptet<\/li>\n<li><code>editorStyle<\/code> \u2014 definition af editor-stil<\/li>\n<li><code>style<\/code> \u2014 giver alternative stilarter for en blok<\/li>\n<\/ul>\n<p>Ud over de egenskaber, der er anf\u00f8rt ovenfor, kan du (og vil sandsynligvis) definere et <code>attributes<\/code> -objekt, der indeholder oplysninger om data, der er gemt i din blok. I din <strong>block.json<\/strong> kan du angive et vilk\u00e5rligt antal attributter i <em>n\u00f8gle\/v\u00e6rdi-par<\/em>, hvor n\u00f8glen er attributnavnet og v\u00e6rdien er attributdefinitionen.<\/p>\n<p>Tag et kig p\u00e5 f\u00f8lgende eksempel p\u00e5 attributdefinitioner:<\/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>Vi vil dykke dybere ned i <strong>block.json<\/strong>-filen <a href=\"#block-json-at-work\">senere i artiklen<\/a>, men du kan ogs\u00e5 tjekke Block Editor Handbook for mere detaljerede oplysninger om <strong>block.json <\/strong><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadata<\/a> og <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributter<\/a>.<\/p>\n<h3 id=\"src-folder\">Mappen src<\/h3>\n<p>Det er i mappen <code>src<\/code>, at udviklingen foreg\u00e5r. I den mappe finder du f\u00f8lgende filer:<\/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>Filen <strong>index.js<\/strong> er dit udgangspunkt. Her skal du importere afh\u00e6ngigheder og registrere bloktypen p\u00e5 klienten:<\/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>Den f\u00f8rste erkl\u00e6ring importerer funktionen <code>registerBlockType<\/code> fra <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">pakken<\/a> <code>@wordpress\/blocks<\/code>. De f\u00f8lgende <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">importstatements<\/a> importerer stylesheetet sammen med funktionerne <code>Edit<\/code> og <code>save<\/code> og et metadataobjekt fra filen <em>block.json<\/em>.<\/p>\n<p>Funktionen <code>registerBlockType<\/code> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">registrerer komponenten p\u00e5 klienten<\/a>. Funktionen tager to parametre: et bloknavn og et blokkonfigurationsobjekt.<\/p>\n<p>Funktionen <code>Edit<\/code> giver blokgr\u00e6nsefladen som gengivet i blokeditoren, mens funktionen <code>save<\/code> giver den struktur, der vil blive serialiseret og gemt i databasen (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">l\u00e6s mere<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p><strong>edit.js<\/strong> er det sted, hvor du skal bygge blokadministrationsgr\u00e6nsefladen:<\/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>F\u00f8rst importeres <code>__<\/code> -funktionen fra <code>@wordpress\/i18n<\/code> -pakken (denne pakke indeholder en JavaScript-version af overs\u00e6ttelsesfunktionerne), den <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\"><code>useBlockProps<\/code><\/a> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">React hook<\/a>, og filen <code>editor.scss<\/code>.<\/p>\n<p>Derefter eksporterer den React-komponenten (l\u00e6s mere om <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">import-<\/a> og <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">eksportangivelser<\/a> ).<\/p>\n<h4>save.js<\/h4>\n<p>I filen <strong>save.js<\/strong> opbygger vi blokstrukturen, som skal gemmes i databasen:<\/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 og style.scss<\/h4>\n<p>Ud over scripts findes der to <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a>-filer i <strong>src<\/strong>-mapperne. Filen <strong>editor.scss<\/strong> indeholder de stilarter, der anvendes p\u00e5 blokken i editorens kontekst, mens filen <strong>style.scss<\/strong> indeholder blokens stilarter til visning <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">i frontend s\u00e5vel som i editoren<\/a>. Vi dykker dybere ned i disse filer i anden del af denne vejledning.<\/p>\n<h3 id=\"node_modules-build\">Node_modules og build-mapperne<\/h3>\n<p>Mappen <code>node_modules<\/code> indeholder node-moduler og deres afh\u00e6ngigheder. Vi vil ikke dykke dybere ned i nodepakker, da det ligger uden for denne artikels r\u00e6kkevidde, men du kan l\u00e6se mere i <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">denne artikel om, hvor npm installerer pakkerne<\/a>.<\/p>\n<p>Mappen <code>build<\/code> indeholder de JS- og CSS-filer, der er resultatet af byggeprocessen. Du kan dykke dybere ned i byggeprocessen i vejledningerne <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext-syntaks<\/a> og <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">JavaScript Build Setup<\/a>.<\/p>\n<h2>Projektet: Bygning af din f\u00f8rste Gutenberg-blok<\/h2>\n<p>Det er tid til at f\u00e5 fingrene i maskineriet. Dette afsnit vil l\u00e6re dig, hvordan du opretter et plugin, der leverer en CTA-blok ved navn Kinsta Academy Block.<\/p>\n<p>Blokken vil best\u00e5 af to kolonner, med et billede til venstre og et tekstafsnit til h\u00f8jre. En knap med et tilpasningsbart link vil blive placeret under teksten:<\/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=\"Blokketypen, som du l\u00e6rer at bygge i denne vejledning.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">Blokketypen, som du l\u00e6rer at bygge i denne vejledning.<\/figcaption><\/figure>\n<p>Dette er blot et simpelt eksempel, men det giver os mulighed for at d\u00e6kke det grundl\u00e6ggende i Gutenberg-blokudvikling. N\u00e5r du har f\u00e5et en klar forst\u00e5else af det grundl\u00e6ggende, kan du g\u00e5 videre og skabe flere og mere komplekse Gutenberg-blokke ved hj\u00e6lp af <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Block Editor Handbook<\/a> og andre af de store ressourcer, der er tilg\u00e6ngelige derude.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Koden til eksemplerne i denne vejledning er ogs\u00e5 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">tilg\u00e6ngelig p\u00e5 Gist<\/a> til din reference.<\/p>\n<\/aside>\n\n<p>Hvis vi antager, at du har den nyeste version af WordPress k\u00f8rende p\u00e5 dit lokale udviklingsmilj\u00f8, er det her, hvad du skal l\u00e6re fra nu af:<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">S\u00e5dan ops\u00e6ttes startblok-plugin&#8217;et<\/a><\/li>\n<li><a href=\"#block-json-at-work\">block.json p\u00e5 arbejde<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Brug af indbyggede komponenter: Den RichText-komponent<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">Tilf\u00f8jelse af kontrolelementer til Block Toolbar<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Tilpasning af blokindstillingerne sidebar<\/a><\/li>\n<li><a href=\"#external-link\">Tilf\u00f8jelse og tilpasning af et eksternt link<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">Tilf\u00f8jelse af flere blokstyper<\/a><\/li>\n<li><a href=\"#innerblocks-component\">Indlejring af blokke med InnerBlocks-komponenten<\/a><\/li>\n<li><a href=\"#additional-improvements\">Yderligere forbedringer<\/a><\/li>\n<\/ul>\n<p>Klar&#8230; parat&#8230; start!<\/p>\n<h3 id=\"set-up-the-plugin\">S\u00e5dan ops\u00e6ttes startblok pluginet<\/h3>\n<p>Start dit kommandolinjev\u00e6rkt\u00f8j, og naviger til mappen <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=\"Ny terminal i mappen i Mac OS.\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">Ny terminal i mappen i Mac OS.<\/figcaption><\/figure>\n<p>Nu skal du k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Denne kommando genererer PHP-, SCSS- og JS-filerne til registrering af en blok i interaktiv tilstand, s\u00e5 du nemt kan tilf\u00f8je de n\u00f8dvendige data til din blok. I vores eksempel bruger vi f\u00f8lgende oplysninger:<\/p>\n<ul>\n<li><strong>Skabelonvariant<\/strong>: statisk<\/li>\n<li><strong>Blok-slug<\/strong>: ka-example-block<\/li>\n<li><strong>Internt navnerum<\/strong>: ka-example-block<\/li>\n<li><strong>Visningstitel for blok<\/strong>: Kinsta Academy Block: Kinsta Academy Block<\/li>\n<li><strong>Kort beskrivelse af blokken<\/strong>: Kinsta Kinsta En eksempelblok for Kinsta Academy-studerende<\/li>\n<li><strong>Dashicon<\/strong>: superhero-alt<\/li>\n<li><strong>Kategori navn<\/strong>: widgets<\/li>\n<li><strong>\u00d8nsker du at tilpasse WordPress-pluginet?<\/strong>: ja<\/li>\n<li><strong>Hjemmesiden for pluginet<\/strong>: https:\/\/kinsta.com\/<\/li>\n<li><strong>Nuv\u00e6rende plugin-version<\/strong>: 0.1.0<\/li>\n<li><strong>Plugin-forfatter<\/strong>: dit navn<\/li>\n<li><strong>Licens<\/strong>: &#8211;<\/li>\n<li><strong>Link til licensteksten<\/strong>: &#8211;<\/li>\n<li><strong>Brugerdefineret dom\u00e6nesti til overs\u00e6ttelser<\/strong>: &#8211;<\/li>\n<\/ul>\n<p>Det tager et par minutter at installere pluginet og alle afh\u00e6ngigheder. N\u00e5r processen er afsluttet, f\u00e5r du f\u00f8lgende svar:<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134076 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"Eksempelblokken er blevet installeret og registreret til udvikling.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">Eksempelblokken er blevet installeret og registreret til udvikling.<\/figcaption><\/figure>\n<p>Nu skal du k\u00f8re f\u00f8lgende kommando fra mappen <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>Hvis du k\u00f8rer dit WordPress-milj\u00f8, skal du f\u00f8rst starte Docker Desktop og derefter k\u00f8re <code>wp-env start<\/code> fra mappen med dit plugin.<\/p>\n<p>Derefter kan du starte <em>http:\/\/localhost:8888\/wp-login<\/em> fra din webbrowser og bruge <strong>Brugernavn: admin<\/strong> og <strong>Adgangskode: password<\/strong> til at logge ind p\u00e5 dit 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=\"K\u00f8rsel af kommandoer fra Visual Studio Code Terminal.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">K\u00f8rsel af kommandoer fra Visual Studio Code Terminal.<\/figcaption><\/figure>\n<p>Endelig kan du fra din plugin-mappe (<strong>ka-example-block<\/strong> i vores eksempel) starte udviklingen med:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>\u00c5bn nu sk\u00e6rmen Plugins for at finde og aktivere <strong>Kinsta Academy Block<\/strong>-plugin:<\/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=\"Aktiv\u00e9r eksempelblokken\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Aktiv\u00e9r eksempelblokken<\/figcaption><\/figure>\n<p>Opret et nyt indl\u00e6g, \u00e5bn blokinds\u00e6tteren, og rul ned til kategorien <strong>Design<\/strong>. Klik for at tilf\u00f8je Kinsta Academy-blokken:<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133869 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"En startblok bygget med @wordpress\/create-block.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">En startblok bygget med @wordpress\/create-block.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json p\u00e5 arbejde<\/h3>\n<p>Som vi n\u00e6vnte tidligere, finder den server-side blokregistrering sted i hovedfilen <strong>.php<\/strong>. Vi vil dog ikke definere indstillinger i <strong>.php<\/strong>-filen. I stedet vil vi bruge <strong>block.json<\/strong>-filen.<\/p>\n<p>S\u00e5 \u00e5bn <strong>block.json<\/strong> igen, og se n\u00e6rmere p\u00e5 standardindstillingerne:<\/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 og stilarter<\/h4>\n<p><code>editorScript<\/code>, <code>editorStyle<\/code> og <code>style<\/code> giver de relative stier til frontend- og backend-scripts og -stilarter.<\/p>\n<p>Du beh\u00f8ver ikke manuelt at registrere de scripts og stilarter, der er defineret her, fordi de automatisk registreres og indk\u00f8ges af WordPress. For at bevise det skal du starte browserinspekt\u00f8ren og \u00e5bne fanen <strong>Netv\u00e6rk<\/strong>:<\/p>\n<figure id=\"attachment_133870\" aria-describedby=\"caption-attachment-133870\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133870 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Inspektion af ressourcer i Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Inspektion af ressourcer i Chrome DevTools.<\/figcaption><\/figure>\n<p>Som du kan se p\u00e5 billedet ovenfor, er vores <strong>index.js<\/strong>-script, der befinder sig i <strong>build<\/strong>-mappen, regelm\u00e6ssigt blevet sat i k\u00f8 <strong>uden at skulle tilf\u00f8je nogen PHP-kode<\/strong>.<\/p>\n<h4>UI-etiketter<\/h4>\n<p>Egenskaberne <code>title<\/code> og <code>description<\/code> giver de etiketter, der er n\u00f8dvendige for at identificere blokken i editoren:<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133871 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Bloknavn og -beskrivelse i bloksidebaren.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Bloknavn og -beskrivelse i bloksidebaren.<\/figcaption><\/figure>\n<h4>Keywords<\/h4>\n<p>Som vi n\u00e6vnte tidligere, kan du konfigurere dine blokindstillinger pr\u00e6cist ved hj\u00e6lp af <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">egenskaber<\/a> og <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributter<\/a>. Du kan f.eks. tilf\u00f8je en eller flere <code>keywords<\/code> for at hj\u00e6lpe brugerne med at s\u00f8ge efter blokke:<\/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>Hvis du nu indtaster &#8220;kinsta&#8221;, &#8220;academy&#8221; eller &#8220;superhero&#8221; i quick inserter, vil redakt\u00f8ren foresl\u00e5 dig Kinsta Academy-blokken:<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133969 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"S\u00f8gning efter en blok ved hj\u00e6lp af et n\u00f8gleord i den hurtige inds\u00e6tter.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">S\u00f8gning efter en blok ved hj\u00e6lp af et n\u00f8gleord i den hurtige inds\u00e6tter.<\/figcaption><\/figure>\n<h4>Lokalisering<\/h4>\n<p>Hvis du undrer dig over, hvordan lokaliseringen af strengene i JSON-filen sker, <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">er svaret<\/a> her:<\/p>\n<blockquote><p><em>I JavaScript kan du bruge metoden now <code>registerBlockTypeFromMetadata<\/code> fra <code>@wordpress\/blocks<\/code> -pakken til at registrere en bloktype ved hj\u00e6lp af de metadata, der er indl\u00e6st fra <strong>block.json<\/strong>-filen. Alle lokaliserede egenskaber bliver automatisk pakket ind i <code>_x<\/code> (fra <code>@wordpress\/i18n<\/code> pakken) funktionsopkald svarende til hvordan det fungerer i PHP med <code>register_block_type_from_metadata<\/code>. Det eneste krav er at indstille <code>textdomain<\/code> -egenskaben i <strong>block.json-filen<\/strong>.<\/em><\/p><\/blockquote>\n<p>Her bruger vi funktionen <code>registerBlockType<\/code> i stedet for <code>registerBlockTypeFromMetadata<\/code>, da sidstn\u00e6vnte er <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">blevet deprecated<\/a> siden <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a>, men mekanismen er den samme.<\/p>\n<h3 id=\"using-richtext-component\">Brug af indbyggede komponenter: RichText-komponenten<\/h3>\n<p>De elementer, der udg\u00f8r en Gutenberg-blok, er React-komponenter, og du kan f\u00e5 adgang til disse komponenter via den globale variabel <code>wp<\/code>. Pr\u00f8v f.eks. at skrive <code>wp.editor<\/code> i din browsers konsol. Dette vil give dig den fulde liste over de komponenter, der er inkluderet i modulet <code>wp.editor<\/code>.<\/p>\n<p>Rul gennem listen, og g\u00e6t, hvad komponenterne er beregnet til ud fra deres navne.<\/p>\n<p>P\u00e5 samme m\u00e5de kan du tjekke listen over komponenter, der indg\u00e5r i modulet <code>wp.components<\/code>:<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133970 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"WP components\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">WP components<\/figcaption><\/figure>\n<p><aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><strong> Modul\u00e6r programmering<\/strong> er en teknik til softwaredesign, der l\u00e6gger v\u00e6gt p\u00e5 at adskille et programs funktionalitet i uafh\u00e6ngige, udskiftelige <strong>moduler<\/strong>, s\u00e5ledes at hvert modul indeholder alt, hvad der er n\u00f8dvendigt for at udf\u00f8re kun \u00e9t aspekt af den \u00f8nskede funktionalitet (Kilde: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>).<\/p>\n<\/aside>\n.<\/p>\n<p>G\u00e5 nu tilbage til <strong>edit.js<\/strong>-filen og se n\u00e6rmere p\u00e5 scriptet:<\/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>Denne kode genererer en statisk blok med simpel, ikke-redigerbar tekst. Men vi kan nemt \u00e6ndre tingene:<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133971 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"Startblokken i kodeeditoren.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">Startblokken i kodeeditoren.<\/figcaption><\/figure>\n<p>For at g\u00f8re teksten redigerbar skal du erstatte det nuv\u00e6rende <code>&lt;p&gt;<\/code> tag med en komponent, der g\u00f8r <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">inputindholdet redigerbart<\/a>. Til det form\u00e5l tilbyder Gutenberg den indbyggede <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">RichText-komponent<\/a>.<\/p>\n<p>Tilf\u00f8jelse af en indbygget komponent til din blok er en proces i 5 trin:<\/p>\n<ol>\n<li><a href=\"#import-components\">Importer de n\u00f8dvendige komponenter fra en WordPress-pakke<\/a><\/li>\n<li><a href=\"#jsx-elements\">Inddrag de tilsvarende elementer i din JSX-kode<\/a><\/li>\n<li><a href=\"#define-attributes\">Definer de n\u00f8dvendige attributter i filen block.json<\/a><\/li>\n<li><a href=\"#define-event-handlers\">Definer handlers for h\u00e6ndelser<\/a><\/li>\n<li><a href=\"#save-data\">Gem data<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Trin 1: Importer de n\u00f8dvendige komponenter fra en WordPress-pakke<\/h4>\n<p>\u00c5bn nu filen <strong>edit.js<\/strong> og \u00e6ndr f\u00f8lgende <code>import<\/code> -angivelse:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>&#8230;til:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>P\u00e5 denne m\u00e5de importerer du funktionen <code>useBlockProps<\/code> og komponenten <code>RichText<\/code> fra pakken <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p>Den <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\"><code>useBlockProps<\/code><\/a> React hook markerer <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">blokkens wrapper-element<\/a>:<\/p>\n<blockquote><p><em>N\u00e5r du bruger API version 2, skal du bruge den nye <code>useBlockProps<\/code> hook i blokkens <code>edit<\/code> -funktion til at markere blokkens wrapper-element. Hook&#8217;en inds\u00e6tter de attributter og h\u00e6ndelsesh\u00e5ndterer, der er n\u00f8dvendige for at aktivere blokadf\u00e6rd. Eventuelle attributter, som du \u00f8nsker at sende til blokelementet, skal sendes gennem <code>useBlockProps<\/code>, og den returnerede v\u00e6rdi skal spredes til elementet.<\/em><\/p><\/blockquote>\n<p>For at sige det enkelt: <code>useBlockProps<\/code> tildeler automatisk attributter og klasser til wrapper-elementet ( <code>p<\/code> -elementet i vores eksempel):<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133973 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"Elementer og klasser genereret af useBlockProps.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Elementer og klasser genereret af useBlockProps.<\/figcaption><\/figure>\n<p>Hvis du fjerner <code>useBlockProps<\/code> fra wrapper-elementet, har du en simpel tekststreng uden adgang til blokfunktionalitet og stil:<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133974 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"Den samme blok uden useBlockProps.\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">Den samme blok uden useBlockProps.<\/figcaption><\/figure>\n<p>Som vi <a href=\"#additional-improvements\">forklarer senere<\/a>, kan du ogs\u00e5 sende et objekt med egenskaber til <code>useBlockProps<\/code> for at tilpasse output.<\/p>\n<h5>RichText<\/h5>\n<p>RichText-komponenten giver et input, der <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">kan redigeres med indhold<\/a>, s\u00e5 brugerne kan redigere og formatere indholdet.<\/p>\n<p>Du finder komponenten dokumenteret p\u00e5 GitHub p\u00e5 <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\">Trin 2: Medtag de tilsvarende elementer i din JSX-kode<\/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>Lad os kommentere koden linje for linje:<\/p>\n<ul>\n<li><code>tagName<\/code> \u2014 tag-navnet p\u00e5 det redigerbare HTML-element<\/li>\n<li><code>onChange<\/code> \u2014 funktion, der kaldes, n\u00e5r elementets indhold \u00e6ndres<\/li>\n<li><code>allowedFormats<\/code> \u2014 et array af tilladte formater. Som standard er alle formater tilladt<\/li>\n<li><code>value<\/code> \u2014 den HTML-streng, der skal g\u00f8res redigerbar<\/li>\n<li><code>placeholder<\/code> \u2014 placeholder-tekst, der skal vises, n\u00e5r elementet er tomt<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Trin 3: Definer de n\u00f8dvendige attributter i block.json-filen: Trin 3: Definer de n\u00f8dvendige attributter i block.json-filen<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Attributter<\/a> giver oplysninger om de data, der er gemt af en blok, s\u00e5som indhold, baggrundsfarve, URL&#8217;er osv.<\/p>\n<p>Du kan indstille et vilk\u00e5rligt antal attributter i et <code>attributes<\/code> -objekt i key\/value-par, hvor n\u00f8glen er attributnavnet og v\u00e6rdien attributdefinitionen.<\/p>\n<p>\u00c5bn nu filen <strong>block.json<\/strong>, og tilf\u00f8j f\u00f8lgende <code>attributes<\/code> prop:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t}\n},<\/code><\/pre>\n<p>Attributten <code>content<\/code> g\u00f8r det muligt at gemme den tekst, som brugeren har indtastet i det redigerbare felt:<\/p>\n<ul>\n<li><code>type<\/code> angiver den type data, der er gemt af attributten. Typen er p\u00e5kr\u00e6vet, medmindre du definerer en <code>enum<\/code> -egenskab.<\/li>\n<li><code>source<\/code> definerer, hvordan attributv\u00e6rdien udtr\u00e6kkes fra indl\u00e6gsindholdet. I vores eksempel er det HTML-indholdet. Bem\u00e6rk, at hvis du ikke angiver en kildeegenskab, gemmes data i blokafgr\u00e6nseren (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">l\u00e6s mere<\/a>).<\/li>\n<li><code>selector<\/code> er et HTML-tag eller en anden selector, f.eks. et klassens navn eller en id-attribut.<\/li>\n<\/ul>\n<p>Vi giver funktionen <code>Edit<\/code> et objekt med egenskaber. S\u00e5 g\u00e5 tilbage til <strong>edit.js<\/strong>-filen og lav f\u00f8lgende \u00e6ndring:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Trin 4: Definer event handlers<\/h4>\n<p><code>RichText<\/code> -elementet har en <code>onChange<\/code> -attribut, som giver en funktion, der skal kaldes, n\u00e5r elementets indhold \u00e6ndres.<\/p>\n<p>Lad os definere denne funktion og se hele <strong>edit.js<\/strong>-scriptet:<\/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>Gem nu filen, og g\u00e5 tilbage til dit WordPress-dashboard, opret et nyt indl\u00e6g eller en ny side og tilf\u00f8j din brugerdefinerede blok:<\/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=\"Output af RichText-komponenten i Block Editor.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">Output af RichText-komponenten i Block Editor.<\/figcaption><\/figure>\n<p>Tilf\u00f8j noget tekst, og skift til kodevisning. Her er, hvordan din kode skal se ud:<\/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>Som du kan se, har indholdet af din blok \u00e6ndret sig, hvis du skifter til kode-editoren. Det skyldes, at du skal \u00e6ndre filen <strong>save.js<\/strong> for at gemme brugerinput i databasen, n\u00e5r indl\u00e6gget gemmes.<\/p>\n<h4 id=\"save-data\">Trin 5: Gem data<\/h4>\n<p>\u00c5bn nu filen <strong>save.js<\/strong> og \u00e6ndr scriptet som f\u00f8lger:<\/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>Det er det, vi g\u00f8r her:<\/p>\n<ul>\n<li>Importer komponenten <code>RichText<\/code> fra pakken <code>block-editor<\/code>.<\/li>\n<li>Overf\u00f8r flere egenskaber via et objektargument til <code>save<\/code> -funktionen (i dette eksempel overf\u00f8rer vi kun <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\"><code>attributes<\/code> -egenskaben<\/a>)<\/li>\n<li>Returner indholdet af komponenten <code>RichText<\/code><\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Hver gang du \u00e6ndrer gemmefunktionen, skal du slette enhver blokinstans i editor-canvaset og inkludere den igen for at f\u00e5 den til at fungere korrekt. L\u00e6s mere om <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">blokvalidering<\/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=\"Blokindholdet er blevet gemt i databasen\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">Blokindholdet er blevet gemt i databasen<\/figcaption><\/figure>\n<p>Du kan l\u00e6se mere om komponenten <code>RichText<\/code> i <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Block Editor Handbook<\/a> og finde den <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">fulde liste over rekvisitter p\u00e5 Github<\/a>.<\/p>\n<p>Lad os nu tage det et skridt videre. I det n\u00e6ste afsnit l\u00e6rer du, hvordan du tilf\u00f8jer kontrolelementer til blokv\u00e6rkt\u00f8jslinjen.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">Tilf\u00f8jelse af kontrolelementer til blokv\u00e6rkt\u00f8jslinjen<\/h3>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">Blokv\u00e6rkt\u00f8jslinjen<\/a> indeholder et s\u00e6t kontroller, der giver brugerne mulighed for at manipulere dele af blokindholdet. For hver kontrol i v\u00e6rkt\u00f8jslinjen finder du en komponent:<\/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=\"Den centrale blokv\u00e6rkt\u00f8jslinje for afsnit.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">Den centrale blokv\u00e6rkt\u00f8jslinje for afsnit.<\/figcaption><\/figure>\n<p>Du kan f.eks. tilf\u00f8je en kontrol for tekstjustering til din blok. Det eneste, du skal g\u00f8re, er at importere to komponenter fra pakken <code>@wordpress\/block-editor<\/code>.<\/p>\n<p>Vi gennemg\u00e5r de samme trin som i det foreg\u00e5ende eksempel:<\/p>\n<ol>\n<li>Import af n\u00f8dvendige komponenter fra WordPress-pakker<\/li>\n<li>Medtag de tilsvarende elementer i din JSX-kode<\/li>\n<li>Definer de n\u00f8dvendige attributter i <strong>block.json<\/strong>-filen<\/li>\n<li>Definer event handlers<\/li>\n<li>Gem data<\/li>\n<\/ol>\n<h4>Trin 1: Importer BlockControls og AlignmentControl-komponenter fra @wordpress\/block-editor<\/h4>\n<p>For at tilf\u00f8je en AlignmentControl til blokv\u00e6rkt\u00f8jslinjen har du brug for to komponenter:<\/p>\n<ul>\n<li><code>BlockControls<\/code> g\u00f8r en dynamisk v\u00e6rkt\u00f8jslinje med kontrolelementer (udokumenteret).<\/li>\n<li><code>AlignmentControl<\/code> renderer en dropdown-menu, der viser justeringsmuligheder for den valgte blok (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">l\u00e6s mere<\/a>)<\/li>\n<\/ul>\n<p>\u00c5bn filen <strong>edit.js<\/strong> og rediger <code>import<\/code> -erkl\u00e6ringen som vist nedenfor:<\/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>Trin 2: Tilf\u00f8j BlockControls og AlignmentControl-elementer<\/h4>\n<p>G\u00e5 til funktionen <code>Edit<\/code> og inds\u00e6t <code>&lt;BlockControls \/&gt;<\/code> -elementet p\u00e5 samme niveau som <code>&lt;RichText \/&gt;<\/code>. Tilf\u00f8j derefter og <code>&lt;AlignmentControl \/&gt;<\/code> inden for <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>I koden ovenfor er <code>&lt;&gt;<\/code> og <code>&lt;\/&gt;<\/code> den korte syntaks til at deklarere <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">React-fragmenter<\/a>, som er den m\u00e5de, hvorp\u00e5 vi returnerer flere elementer i React.<\/p>\n<p>I dette eksempel har <code>AlignmentControl<\/code> to attributter:<\/p>\n<ul>\n<li><code>value<\/code> giver den aktuelle v\u00e6rdi for elementet<\/li>\n<li><code>onChange<\/code> giver en <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">h\u00e6ndelsesh\u00e5ndtering<\/a>, der skal k\u00f8res, n\u00e5r v\u00e6rdien \u00e6ndres<\/li>\n<\/ul>\n<p>Vi har ogs\u00e5 defineret yderligere attributter for <code>RichText<\/code> -elementet (se den <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">fulde liste over attributter med eksempler<\/a>)<\/p>\n<h4>Trin 3: Definer align-attributten i block.json<\/h4>\n<p>G\u00e5 nu til filen <strong>block.json<\/strong>, og tilf\u00f8j attributten <code>align<\/code>:<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>N\u00e5r du er f\u00e6rdig, skal du g\u00e5 tilbage til blok-editoren, opdatere siden og v\u00e6lge blokken. Du b\u00f8r se en fejlmeddelelse i din blok.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134008\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">Blokken viser en fejlmeddelelse<\/figcaption><\/figure>\n<p>\u00c5rsagen er, at vi ikke har defineret vores event handler endnu.<\/p>\n<h4>Trin 4: Definer eventhandlerne<\/h4>\n<p>Nu definerer vi <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>Hvis <code>newAlign<\/code> er <code>undefined<\/code>, s\u00e5 s\u00e6tter vi <code>newAlign<\/code> til <code>none<\/code>. Ellers bruger vi <code>newAlign<\/code>.<\/p>\n<p>Vores <strong>edit.js<\/strong>-script burde v\u00e6re f\u00e6rdigt (for nu):<\/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>Nu kan du g\u00e5 tilbage til editoren og justere blokindholdet. Din blok b\u00f8r nu vise en justeringsv\u00e6rkt\u00f8jslinje p\u00e5 flotteste vis.<\/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=\"Vores blok har nu en v\u00e6rkt\u00f8jslinje til justering\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Vores blok har nu en v\u00e6rkt\u00f8jslinje til justering<\/figcaption><\/figure>\n<p>Men hvis du gemmer indl\u00e6gget, vil du se, at indholdet af din blok ikke er justeret p\u00e5 forsiden, som det er i blokredigeringsprogrammet. Det skyldes, at vi skal \u00e6ndre funktionen <code>save<\/code> for at gemme blokindhold og attributter i databasen.<\/p>\n<h4>Trin 5: Gem data<\/h4>\n<p>\u00c5bn <strong>save.js<\/strong> og \u00e6ndr <code>save<\/code> -funktionen som f\u00f8lger:<\/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>Endelig kan du for at g\u00f8re koden mere l\u00e6sbar udtr\u00e6kke de enkelte egenskaber fra <code>attribute<\/code> -objektet ved hj\u00e6lp af <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">destrukturerings tildelingssyntaksen<\/a> for at g\u00f8re koden mere l\u00e6sbar:<\/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>Du kan g\u00f8re det samme i <strong>edit.js<\/strong>-filen.<\/p>\n<p>Gem nu filen, og skift til Code Editor. Blokkoden skal se nogenlunde s\u00e5dan her ud:<\/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=\"Kontrol af kontrolelementer p\u00e5 v\u00e6rkt\u00f8jslinjen for blokke\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">Kontrol af kontrolelementer p\u00e5 v\u00e6rkt\u00f8jslinjen for blokke<\/figcaption><\/figure>\n<p>Og det er det! Du har netop tilf\u00f8jet en justeringskontrol til din bloks v\u00e6rkt\u00f8jslinje \ud83e\udd13<\/p>\n<p>Du kan l\u00e6se mere om <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">kontrolelementer i blokv\u00e6rkt\u00f8jslinjen<\/a> i H\u00e5ndbog for blokredigering.<\/p>\n<h3 id=\"settings-sidebar\">Tilpasning af blokindstillingssidebar<\/h3>\n<p>Du kan ogs\u00e5 tilf\u00f8je kontrolelementer til <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">blokindstillingssidebar<\/a> (eller endda oprette en ny sidebar til dit program).<\/p>\n<p>API&#8217;en indeholder en <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\"><code>InspectorControls<\/code> -komponent<\/a> til dette.<\/p>\n<p>I h\u00e5ndbogen Block Editor Handbook forklares det, <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">hvordan du bruger Settings Sidebar<\/a>:<\/p>\n<blockquote><p><em>Settings Sidebar bruges til at vise indstillinger, der bruges mindre ofte, eller indstillinger, der kr\u00e6ver mere plads p\u00e5 sk\u00e6rmen. Settings Sidebar b\u00f8r kun bruges til <strong>indstillinger p\u00e5 blokniveau<\/strong><\/em>.<\/p>\n<p><em>Hvis du har indstillinger, der kun p\u00e5virker udvalgt indhold i en blok (f.eks. &#8220;fed&#8221; indstilling for udvalgt tekst i et afsnit) <\/em>, skal du ikke placere den i Indstillinger Sidebar.<em> Sidebaren Indstillinger vises ogs\u00e5, n\u00e5r du redigerer en blok i HTML-tilstand, s\u00e5 den b\u00f8r kun indeholde indstillinger p\u00e5 blokniveau.<\/em><\/p><\/blockquote>\n<p>Igen:<\/p>\n<ol>\n<li>Import af n\u00f8dvendige komponenter fra WordPress-pakker<\/li>\n<li>Medtag de tilsvarende elementer i din JSX-kode<\/li>\n<li>Definer de n\u00f8dvendige attributter i block.json-filen<\/li>\n<li>Definer h\u00e6ndelsesh\u00e5ndterer<\/li>\n<li>Gem data<\/li>\n<\/ol>\n<h4>Trin 1. Importer InspectorControls og PanelColorSettings-komponenter fra @wordpress\/block-editor<\/h4>\n<p>Du kan tilf\u00f8je flere kontroller for at give brugerne mulighed for at tilpasse specifikke aspekter af blokken. Du kan f.eks. give et farvekontrolpanel. For at g\u00f8re det skal du importere komponenterne <code>InspectorControls<\/code> og <code>PanelColorSettings<\/code> fra modulet <code>block-editor<\/code>:<\/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>Trin 2: Medtag de tilsvarende elementer i din JSX-kode<\/h4>\n<p>Nu kan du tilf\u00f8je de tilsvarende elementer til den JSX, der returneres af <code>Edit<\/code> -funktionen:<\/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>Bem\u00e6rk, at vi ogs\u00e5 har opdateret <code>style<\/code> -attributten for <code>RichText<\/code> -elementet:<\/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>Trin 3: Definer de n\u00f8dvendige attributter i block.json<\/h4>\n<p>Nu defineres attributterne <code>backgroundColor<\/code> og <code>textColor<\/code> i filen <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>Trin 4: Definer h\u00e6ndelsesh\u00e5ndteringsenhederne<\/h4>\n<p>Nu skal du definere to funktioner til at opdatere <code>backgroundColor<\/code> og <code>textColor<\/code> ved brugerinput:<\/p>\n<pre><code class=\"language-js\">const onChangeBackgroundColor = ( newBackgroundColor ) =&gt; {\n\tsetAttributes( { backgroundColor: newBackgroundColor } )\n}\n\nconst onChangeTextColor = ( newTextColor ) =&gt; {\n\tsetAttributes( { textColor: newTextColor } )\n}<\/code><\/pre>\n<h4>Trin 5: Gem data<\/h4>\n<p>Et sidste skridt: \u00c5bn filen <strong>save.js<\/strong> og \u00e6ndr scriptet som f\u00f8lger<\/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>Gem filen, og tjek blokken i editoren. Du vil m\u00e5ske finde en uvelkommen overraskelse: en fejlmeddelelse, der fort\u00e6ller dig, at blokken indeholder uventet eller ugyldigt indhold.<\/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=\"Fejlmeddelelse om uventet eller ugyldigt indhold\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Fejlmeddelelse om uventet eller ugyldigt indhold<\/figcaption><\/figure>\n<p>Dette sker, fordi filen <strong>save.js<\/strong> er \u00e6ndret, og den kode, der er gemt i databasen, ikke stemmer overens med den kode, der er brugt i editoren.<\/p>\n<p>For at l\u00f8se dette skal du opdatere siden, slette enhver forekomst af din blok og tilf\u00f8je den igen til dit indl\u00e6g:<\/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=\"Panelet med farveindstillinger i blokken Indstillinger sidebar\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">Panelet med farveindstillinger i blokken Indstillinger sidebar<\/figcaption><\/figure>\n<p>Foretag dine \u00e6ndringer, gem indl\u00e6gget, og se det i frontend. Nu b\u00f8r de \u00e6ndringer, du har foretaget i blokeditoren, afspejles p\u00e5 forsiden af webstedet.<\/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=\"Den brugerdefinerede blok fungerer nu korrekt p\u00e5 forsiden\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">Den brugerdefinerede blok fungerer nu korrekt p\u00e5 forsiden<\/figcaption><\/figure>\n<h3 id=\"external-link\">Tilf\u00f8jelse og tilpasning af et eksternt link<\/h3>\n<p>I dette afsnit skal du tilf\u00f8je nye komponenter til din bloktype:<\/p>\n<ul>\n<li>En <code>ExternalLink<\/code> -komponent, der giver brugerne mulighed for at tilf\u00f8je et tilpasseligt link til din brugerdefinerede blok<\/li>\n<li>Flere sidebar-kontroller, der giver brugerne mulighed for at tilpasse linkindstillingerne<\/li>\n<\/ul>\n<h4>Trin 1. Importer komponenter fra @wordpress\/components<\/h4>\n<p>Nu skal du importere flere komponenter fra <code>@wordpress\/components<\/code>. \u00c5bn din edit.js-fil, og tilf\u00f8j f\u00f8lgende <code>import<\/code> -anvisning:<\/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> tilf\u00f8jer en sammenklappelig container til Settings Sidebar.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> producerer en generisk container til sidebar-kontroller.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> giver en tekstindtastningskontrol.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> giver en toggle, der g\u00f8r det muligt for brugerne at aktivere\/deaktivere en bestemt indstilling<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> er en simpel komponent til at tilf\u00f8je et eksternt link.<\/li>\n<\/ul>\n<h4>Trin 2. Inds\u00e6t de tilsvarende elementer i din JSX-kode<\/h4>\n<p>Du skal f\u00f8rst tilf\u00f8je <code>ExternalLink<\/code> -elementet p\u00e5 samme niveau som <code>RichText<\/code> i en <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><code>ExternalLink<\/code> -elementet er ikke dokumenteret, s\u00e5 vi henviser til <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">selve elementet<\/a> for at f\u00e5 en liste over tilg\u00e6ngelige attributter. Her bruger vi attributterne <code>href<\/code>, <code>className<\/code> og <code>rel<\/code>.<\/p>\n<p>Som standard er v\u00e6rdien af attributten <code>rel<\/code> indstillet til <code>noopener noreferrer<\/code>. Vores kode tilf\u00f8jer <a href=\"https:\/\/kinsta.com\/blog\/add-nofollow-links-in-wordpress\/\">n\u00f8gleordet<code>nofollow<\/code><\/a> til <code>rel<\/code> -attributten i det resulterende <code>a<\/code> -tag, n\u00e5r vi sl\u00e5r omskiftereguleringen <strong>til<\/strong>.<\/p>\n<p>Nu kan du tilf\u00f8je linkindstillinger til bloksidebaren.<\/p>\n<p>F\u00f8rst skal du tilf\u00f8je et <code>PanelBody<\/code> -element inden for <code>InspectorControls<\/code> p\u00e5 samme niveau som <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>Her er hvad vi g\u00f8r med dette:<\/p>\n<ol>\n<li>Attributten <code>title<\/code> giver panelets titel.<\/li>\n<li><code>initialOpen<\/code> indstiller, om panelet er \u00e5bent i starten eller ej.<\/li>\n<\/ol>\n<p>Derefter tilf\u00f8jer vi to <code>PanelRow<\/code> -elementer inden for <code>PanelBody<\/code>, og et <code>TextControl<\/code> -element inden for hvert <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>Ovenst\u00e5ende kode skulle nu se ret ligetil ud. De to tekstkontroller giver brugerne mulighed for at indstille link label og URL.<\/p>\n<p>Vi tilf\u00f8jer ogs\u00e5 en yderligere <code>PanelRow<\/code> med en <code>ToggleControl<\/code> for at sl\u00e5 en bestemt indstilling til\/fra, f.eks. om en attribut skal medtages eller ej:<\/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>Trin 3: Definer de n\u00f8dvendige attributter i block.json<\/h4>\n<p>Nu defineres attributterne <code>kaLink<\/code>, <code>linkLabel<\/code> og <code>hasLinkNofollow<\/code> i filen <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"kaLink\": {\n\t\"type\": \"string\",\n\t\"default\": \"\"\n},\n\"linkLabel\": {\n\t\"type\": \"string\",\n\t\"default\": \"Check it out!\"\n},\n\"hasLinkNofollow\": {\n\t\"type\": \"boolean\",\n\t\"default\": false\n}<\/code><\/pre>\n<p>Der er ikke mere at tilf\u00f8je her! Lad os g\u00e5 videre til at definere <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">h\u00e6ndelsesbehandlingsfunktionerne<\/a>.<\/p>\n<h4>Trin 4: Definer h\u00e6ndelsesh\u00e5ndteringsfunktionerne<\/h4>\n<p>G\u00e5 tilbage til <strong>edit.js<\/strong>-filen, tilf\u00f8j de nye attributter til attributes-objektet, og tilf\u00f8j f\u00f8lgende funktioner:<\/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>Disse funktioner opdaterer de tilsvarende attributv\u00e6rdier ved brugerinput.<\/p>\n<h4>Trin 5: Gem data<\/h4>\n<p>Til sidst skal vi opdatere funktionen <code>save<\/code> i <strong>save.js<\/strong>:<\/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>Bem\u00e6rk, at vi her har brugt et almindeligt <code>a<\/code> -element i stedet for <code>ExternalLink<\/code>.<\/p>\n<p>Du kan se resultatet i billedet nedenfor.<\/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=\"Panelet med linkindstillinger i blokindstillingen Sidebar\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">Panelet med linkindstillinger i blokindstillingen Sidebar<\/figcaption><\/figure>\n<h3 id=\"multiple-block-styles\">Tilf\u00f8jelse af flere blokstilarter<\/h3>\n<p>I et tidligere afsnit l\u00e6rte du, hvordan du tilf\u00f8jer en blokv\u00e6rkt\u00f8jslinje, der giver brugerne mulighed for at justere brugerinput. Vi kan tilf\u00f8je flere stilkontrolelementer til blokv\u00e6rkt\u00f8jslinjen, men vi kan ogs\u00e5 give et s\u00e6t foruddefinerede blokstilarter, som brugeren kan v\u00e6lge imellem med et enkelt klik.<\/p>\n<p>Til dette form\u00e5l vil vi bruge en nyttig funktion i Block API&#8217;et: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Block Styles<\/a>.<\/p>\n<p>Det eneste, du skal g\u00f8re, er at definere egenskaben <strong>block.json<\/strong> <code>styles<\/code> og erkl\u00e6re de tilsvarende stilarter i dine stilark.<\/p>\n<p>Du kan f.eks. tilf\u00f8je f\u00f8lgende array af stilarter:<\/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>Dermed har du blot tilf\u00f8jet en standardstil og en ekstra stil kaldet <code>border<\/code>. G\u00e5 nu tilbage til blokeditoren:<\/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=\"To pr\u00e6fabrikerede blokformater.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">To pr\u00e6fabrikerede blokformater.<\/figcaption><\/figure>\n<p>Stilene vil v\u00e6re tilg\u00e6ngelige for brugeren ved at klikke p\u00e5 <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-5-8\/#normalized-block-toolbars\">blokomskifteren<\/a> og derefter kigge efter <strong>panelet Stilarter<\/strong> i <strong>blokindstillingerne Sidebar<\/strong>.<\/p>\n<p>V\u00e6lg en stil, og tjek de klasser, der anvendes p\u00e5 <code>p<\/code> -elementet. H\u00f8jreklik p\u00e5 blokken og <strong>Inspic\u00e9r<\/strong>. Der er blevet tilf\u00f8jet en ny klasse med et navn, der er struktureret som f\u00f8lger:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Hvis du har markeret stilen &#8220;Border&#8221;, tilf\u00f8jes der en klasse <code>is-style-border<\/code> til elementet <code>p<\/code>. Hvis du har markeret stilen &#8220;Default&#8221;, tilf\u00f8jes der i stedet en <code>is-style-default<\/code> -klasse.<\/p>\n<p>Nu skal du kun angive CSS-egenskaberne. \u00c5bn filen <strong>editor.scss<\/strong> og erstat de nuv\u00e6rende stilarter med f\u00f8lgende:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Nu kan du g\u00f8re det samme med <strong>style.scss<\/strong>. Som vi n\u00e6vnte ovenfor, anvendes stilarter, der er defineret i <strong>style.scss<\/strong>, b\u00e5de i frontend og i editoren:<\/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>Og det var det! Opdater siden, og hav det sjovt med dine nye blokformater:<\/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=\"Blokstile sammenlignet\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Blokstile sammenlignet<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Indlejring af Gutenberg-blokke med InnerBlocks-komponenten<\/h3>\n<p>Selv om vores brugerdefinerede blok er fuldt funktionel, er den stadig ikke s\u00e6rlig tiltalende. For at g\u00f8re den mere engagerende for publikum kunne vi tilf\u00f8je et billede.<\/p>\n<p>Dette kan tilf\u00f8je et lag af kompleksitet til vores blok, men heldigvis er det ikke besv\u00e6rligt, fordi Gutenberg indeholder en specifik komponent, som du kan bruge til at skabe en struktur af <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">indlejrede blokke<\/a>.<\/p>\n<p>Komponenten <code>InnerBlocks<\/code> er <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">defineret som f\u00f8lger<\/a>:<\/p>\n<blockquote><p><em><code>InnerBlocks<\/code> eksporterer et par komponenter, som kan bruges i blokimplementeringer for at aktivere indlejret blokindhold.<\/em><\/p><\/blockquote>\n<p>F\u00f8rst skal du oprette en ny <strong>.js<\/strong>-fil i <strong>src<\/strong>-mappen. I vores eksempel kalder vi denne fil <strong>container.js<\/strong>.<\/p>\n<p>Nu skal du importere den nye ressource i filen <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>G\u00e5 tilbage til <strong>container.js<\/strong> og importer de n\u00f8dvendige komponenter:<\/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>Det n\u00e6ste skridt er at definere en skabelon, der giver den struktur, som blokkene skal placeres i. I det f\u00f8lgende eksempel definerer vi en skabelon best\u00e5ende af to kolonner, der indeholder en kerneblok Image-blok og vores brugerdefinerede 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>Skabelonen er struktureret som et <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">array af blockTypes<\/a> (bloknavn og valgfrie attributter).<\/p>\n<p>I koden ovenfor brugte vi flere attributter til at konfigurere kolonne- og kolonneblokkene. Navnlig l\u00e5ser attributten <code>templateLock: 'all'<\/code> kolonneblokkene, s\u00e5 brugeren ikke kan tilf\u00f8je, omarrangere eller slette eksisterende blokke. <code>templateLock<\/code> kan antage en af f\u00f8lgende v\u00e6rdier:<\/p>\n<ul>\n<li><code>all<\/code> \u2014\u00a0<code>InnerBlocks<\/code> er l\u00e5st, og der kan ikke tilf\u00f8jes, omarrangeres eller fjernes blokke.<\/li>\n<li><code>insert<\/code> \u2014 Blokke kan kun omarrangeres eller fjernes.<\/li>\n<li><code>false<\/code> \u2014 Skabelonen er ikke l\u00e5st.<\/li>\n<\/ul>\n<p>Skabelonen tildeles derefter til <code>InnerBlocks<\/code> -elementet:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>For at undg\u00e5 kompatibilitetsproblemer har vi ogs\u00e5 tilf\u00f8jet en <code>templateLock<\/code> -attribut til <code>InnerBlocks<\/code> -elementet (se ogs\u00e5 problem #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> og pull #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Her er vores endelige <strong>container.js<\/strong>-fil:<\/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=\"Den endelige blok i blokeditoren\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">Den endelige blok i blokeditoren<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Yderligere forbedringer<\/h3>\n<p>Vores blok er fuldt funktionel, men vi kunne forbedre den en smule med nogle sm\u00e5 \u00e6ndringer.<\/p>\n<p>Vi tildelte attributten <code>backgroundColor<\/code> til det afsnit, der blev genereret af <code>RichText<\/code> -komponenten. Vi kan dog foretr\u00e6kke at tildele baggrundsfarven til containeren <code>div<\/code>:<\/p>\n<p>S\u00e5 \u00e6ndre <strong>edit.js<\/strong>-filen og <strong>save.js<\/strong> <code>div<\/code>s som f\u00f8lger:<\/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>Dette vil give brugeren mulighed for at \u00e6ndre baggrunden for hele blokken.<\/p>\n<p>En mere relevant \u00e6ndring vedr\u00f8rer derimod metoden <code>useBlockProps<\/code>. I den oprindelige kode definerede vi konstanten <code>blockProps<\/code> som f\u00f8lger<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Men vi kan bruge <code>useBlockProps<\/code> mere effektivt ved at <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">videregive et s\u00e6t egenskaber<\/a>. Vi kan f.eks. importere <code>classnames<\/code> fra modulet <code>classnames<\/code> og indstille wrapperklassens navn i overensstemmelse hermed.<\/p>\n<p>I det f\u00f8lgende eksempel tildeler vi et klassens navn baseret p\u00e5 v\u00e6rdien af attributten <code>align<\/code> (<strong>edit.js<\/strong>).s<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function Edit( { attributes, setAttributes } ) {\n\t...\n\t\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Vi foretager den samme \u00e6ndring i filen <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>Og det var det! Du kan nu <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">k\u00f8re buildet til produktion<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Opsummering<\/h2>\n<p>Og her er vi s\u00e5 ved slutningen af denne utrolige rejse! Vi startede med konfigurationen af udviklingsmilj\u00f8et og endte med at skabe en komplet bloktype.<\/p>\n<p>Som vi n\u00e6vnte i indledningen, er et solidt kendskab til Node.js, Webpack, Babel og React afg\u00f8rende for at skabe avancerede Gutenberg-blokke og positionere dig selv p\u00e5 markedet som en professionel Gutenberg-udvikler.<\/p>\n<p>Men du beh\u00f8ver dog ikke at have etableret React-erfaring for at begynde at have det sjovt med blokudvikling. Blokudvikling kan give dig motivation og m\u00e5l til at opn\u00e5 stadig bredere f\u00e6rdigheder inden for teknologierne bag Gutenberg-blokke.<\/p>\n<p>Denne guide er derfor langt fra komplet. Den er blot en introduktion til en lang r\u00e6kke emner, der kan hj\u00e6lpe dig med at komme i gang med at bygge dine allerf\u00f8rste Gutenberg-blokke.<\/p>\n<p>Derfor anbefaler vi, at du uddyber din viden ved at l\u00e6se omhyggeligt online dokumentation og vejledninger. Blandt de mange ressourcer, der er tilg\u00e6ngelige derude, anbefaler vi f\u00f8lgende:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Officiel vejledning i at oprette en blok<\/a> for begyndere<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Officiel Block Tutorial<\/a> for mellemliggende udviklere<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Dynamiske blokke<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/dynamic-blocks\/\">S\u00e5dan opretter du dynamiske blokke til Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Meta bokse<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Oprettelse af en sidebar til din Plugin<\/a><\/li>\n<\/ul>\n<p>Hvis du lige er begyndt med WordPress-udvikling, vil du m\u00e5ske gerne forst\u00e5 de grundl\u00e6ggende koncepter for frontend-udvikling. Her er en hurtig liste over ressourcer, der kan hj\u00e6lpe dig med at komme i gang:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/dk\/ebooks\/wordpress\/wordpress-lokal-udvikling\/\">S\u00e5dan installeres WordPress Lokalt<\/a> (gratis e-bog)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/dk\/ebooks\/wordpress\/administreret-wordpress-hosting\/\">Den reelle v\u00e6rdi af Managed WordPress Hosting<\/a> (gratis e-bog)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/what-is-javascript\/\">Hvad er JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/html-vs-html5\/\">HTML vs HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/wordpress-css\/\">S\u00e5dan Rediger CSS i WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/dk\/blog\/hvad-er-php\/\">Hvad er PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/wordpress-hooks\/\">Den WordPress Hooks Bootcamp: S\u00e5dan bruger du handlinger, filtre og brugerdefinerede hooks<\/a><\/li>\n<\/ul>\n<p>Og husk, at den komplette kode for eksemplerne i denne vejledning er <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">tilg\u00e6ngelig p\u00e5 Gist<\/a>.<\/p>\n<p>Nu er det din tur: Har du udviklet nogle Gutenberg-blokke? Hvad er de st\u00f8rste vanskeligheder, du har oplevet indtil videre? Lad os h\u00f8re om dine erfaringer i kommentarerne!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mange mennesker klager over de forhindringer, der er forbundet med at komme i gang med at bygge Gutenberg-blokke og -apps. Indl\u00e6ringskurven er stejl, prim\u00e6rt p\u00e5 grund &#8230;<\/p>\n","protected":false},"author":36,"featured_media":45509,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[321,291,41],"topic":[754],"class_list":["post-45508","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg","topic-wordpress-udvikling"],"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>Bygning af brugerdefinerede Gutenberg-blokke: Den endelige vejledning<\/title>\n<meta name=\"description\" content=\"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.\" \/>\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\/dk\/blog\/gutenberg-blokke\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke\" \/>\n<meta property=\"og:description\" content=\"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-10-04T13:22:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:27:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/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=\"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"49 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke\",\"datePublished\":\"2022-10-04T13:22:02+00:00\",\"dateModified\":\"2023-08-24T10:27:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/\"},\"wordCount\":8195,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/\",\"name\":\"Bygning af brugerdefinerede Gutenberg-blokke: Den endelige vejledning\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"datePublished\":\"2022-10-04T13:22:02+00:00\",\"dateModified\":\"2023-08-24T10:27:05+00:00\",\"description\":\"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress udvikling\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/wordpress-udvikling\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"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\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bygning af brugerdefinerede Gutenberg-blokke: Den endelige vejledning","description":"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.","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\/dk\/blog\/gutenberg-blokke\/","og_locale":"da_DK","og_type":"article","og_title":"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke","og_description":"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.","og_url":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2022-10-04T13:22:02+00:00","article_modified_time":"2023-08-24T10:27:05+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Carlo Daniele","Estimeret l\u00e6setid":"49 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke","datePublished":"2022-10-04T13:22:02+00:00","dateModified":"2023-08-24T10:27:05+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/"},"wordCount":8195,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png","keywords":["Block Editor","development","Gutenberg"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/","url":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/","name":"Bygning af brugerdefinerede Gutenberg-blokke: Den endelige vejledning","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png","datePublished":"2022-10-04T13:22:02+00:00","dateModified":"2023-08-24T10:27:05+00:00","description":"At bygge Gutenberg-blokke kan virke skr\u00e6mmende. Men det er det ikke! Denne dybdeg\u00e5ende guide viser dig, hvordan du opretter din f\u00f8rste WP-blok.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/10\/Gutenberg-blocks_Blog_cover.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/gutenberg-blokke\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"WordPress udvikling","item":"https:\/\/kinsta.com\/dk\/emner\/wordpress-udvikling\/"},{"@type":"ListItem","position":3,"name":"Opbygning af brugerdefinerede Gutenberg-blokke: Den definitive vejledning i udvikling af blokke"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","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\/dk\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=45508"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45508\/revisions"}],"predecessor-version":[{"id":52007,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45508\/revisions\/52007"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/translations\/se"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45508\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/45509"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=45508"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=45508"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=45508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}