{"id":46337,"date":"2022-11-29T14:26:21","date_gmt":"2022-11-29T14:26:21","guid":{"rendered":"https:\/\/kinsta.com\/se\/?p=46337&#038;preview=true&#038;preview_id=46337"},"modified":"2023-06-08T08:32:18","modified_gmt":"2023-06-08T08:32:18","slug":"gutenberg-block","status":"publish","type":"post","link":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/","title":{"rendered":"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block"},"content":{"rendered":"<p>M\u00e5nga klagar p\u00e5 att det \u00e4r sv\u00e5rt att komma ig\u00e5ng med att bygga Gutenbergblock och appar. Inl\u00e4rningskurvan \u00e4r brant, fr\u00e4mst p\u00e5 grund av sv\u00e5righeten att installera och konfigurera utvecklingsmilj\u00f6n. Gedigna kunskaper i JavaScript, Node.js, React och Redux \u00e4r dessutom n\u00f6dv\u00e4ndiga ingredienser f\u00f6r detta ganska komplexa recept.<\/p>\n<p>Den officiella <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Handboken f\u00f6r WordPress Blockredigerare<\/a> ger utvecklare en enorm m\u00e4ngd information, men det kan h\u00e4nda att du g\u00e5r vilse i detta hav av detaljer.<\/p>\n<p>Och det \u00e4r v\u00e4rt att n\u00e4mna vad Mat\u00edas Ventura, ansvarig arkitekt f\u00f6r Gutenberg-projektet, rapporterade i <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">sin intervju med WP Tavern<\/a>:<\/p>\n<blockquote><p><em>\u00c4ven om det finns folk som kan l\u00e4ra sig detta snabbt s\u00e5 \u00e4r det fortfarande ett stort hinder f\u00f6r m\u00e5nga. Jag tror att det finns flera lager av detta; dokumentationen skulle kunna vara en niv\u00e5 b\u00e4ttre b\u00e5de n\u00e4r det g\u00e4ller organisation och presentation. Jag hoppas att vi kan g\u00f6ra mycket mer d\u00e4r.<\/em><\/p><\/blockquote>\n<p>Med detta i \u00e5tanke s\u00e5 har vi beslutat att tillhandah\u00e5lla en steg f\u00f6r steg-handledning som syftar till att hj\u00e4lpa v\u00e5ra l\u00e4sare att komma ig\u00e5ng med utvecklingen av Gutenberg-block.<\/p>\n<p>L\u00e5ter det intressant? L\u00e5t oss k\u00f6ra ig\u00e5ng!<\/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>F\u00f6ruts\u00e4ttningar f\u00f6r utveckling av Gutenbergblock<\/h2>\n<p>De enda f\u00e4rdigheter som kr\u00e4vs f\u00f6r den h\u00e4r handledningen \u00e4r goda kunskaper om utveckling av WordPress-plugins och \u00e5tminstone en <a href=\"https:\/\/kinsta.com\/blog\/html-best-practices\/\">grundl\u00e4ggande f\u00f6rst\u00e5else f\u00f6r HTML<\/a>, CSS, JavaScript och React.<\/p>\n<p>Blir det h\u00e4r ett ambiti\u00f6st projekt? Det kan du r\u00e4kna med att det blir!<\/p>\n<p>Det var inte l\u00e4tt att hitta den r\u00e4tta kompromissen mellan fullst\u00e4ndighet och enkelhet eller att best\u00e4mma vilka \u00e4mnen som skulle inkluderas och vilka som skulle utel\u00e4mnas.<\/p>\n<p>F\u00f6rhoppningsvis s\u00e5 blir vi f\u00f6rl\u00e5tna av medelkunniga- och avancerade l\u00e4sare f\u00f6r att vi inte f\u00f6rdjupar oss i vissa begrepp 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> och s\u00e5 vidare. Dessa \u00e4mnen kr\u00e4ver ytterligare utrymme och uppm\u00e4rksamhet och \u00e4r f\u00f6rmodligen f\u00f6r avancerade f\u00f6r att b\u00f6rja utveckla block (om du inte \u00e4r React-utvecklare).<\/p>\n<p>Av samma anledning s\u00e5 kommer vi inte heller att g\u00e5 igenom n\u00e5gra av de mer avancerade \u00e4mnena som r\u00f6r Gutenbergs blockutveckling, exempelvis\u00a0<a href=\"https:\/\/kinsta.com\/blog\/dynamic-blocks\/\">dynamiska block<\/a> och <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">metarutor<\/a>.<\/p>\n<p>Med den kunskap som du f\u00e5r i slutet av den h\u00e4r artikeln s\u00e5 kan du b\u00f6rja att ha roligt och vara produktiv direkt.<\/p>\n<p>N\u00e4r du v\u00e4l kommit ig\u00e5ng med blockbyggandet s\u00e5 kommer du att vara redo att f\u00f6rb\u00e4ttra dina kunskaper ytterligare och bygga \u00e4nnu mer avancerade Gutenbergblock p\u00e5 egen hand.<\/p>\n\n<h2>Vad \u00e4r ett Gutenbergblock?<\/h2>\n<p>Sedan den f\u00f6rst sl\u00e4pptes i december \u00e5r 2018 s\u00e5 har <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-gutenberg-redigeraren\/\">blockredigeraren<\/a> f\u00f6rb\u00e4ttrats avsev\u00e4rt i alla aspekter: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">kraftfullare API: er<\/a>, ett mer avancerat anv\u00e4ndargr\u00e4nssnitt, f\u00f6rb\u00e4ttrad anv\u00e4ndbarhet, massor av nya block, de <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">f\u00f6rsta implementeringarna av Full Site Editing<\/a> och mycket mer.<\/p>\n<p>Kort sagt, \u00e4ven om Gutenberg fortfarande \u00e4r under stark utveckling s\u00e5 har den kommit l\u00e5ngt &#8211; och idag \u00e4r blockredigeraren en fullfj\u00e4drad kandidat som en p\u00e5litlig och funktionell sid- och webbplatsbyggare.<\/p>\n<p>Ur en utvecklares synvinkel s\u00e5 \u00e4r Gutenberg en React-baserad <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">Single Page Application<\/a> (SPA) som g\u00f6r det m\u00f6jligt f\u00f6r WordPress-anv\u00e4ndare att skapa, redigera och radera inneh\u00e5ll i WordPress. Detta \u00e4r dock inte en f\u00f6rb\u00e4ttrad version av den <a href=\"https:\/\/kinsta.com\/blog\/wordpress-tinymce-editor\/\">traditionella inneh\u00e5llsredigeraren<\/a>.<\/p>\n<p>Vi vill g\u00f6ra detta klart och tydligt:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg \u00e4r <em>inte<\/em><\/strong> <strong>en\u00a0vanlig WYSIWYG-redigerare. Den omdefinierar snarare hela redigeringsupplevelsen i WordPress.<\/strong><\/p>\n<\/aside>\n\n<p>I Gutenberg s\u00e5 delas inneh\u00e5llet in i block, som \u00e4r &#8221;tegelstenar&#8221; som anv\u00e4ndarna kan anv\u00e4nda f\u00f6r att skapa inl\u00e4gg och sidor eller hela webbplatser.<\/p>\n<p>Men vad \u00e4r egentligen ett block?<\/p>\n<p>Vi gillar <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">WordPress definition<\/a>:<\/p>\n<blockquote><p><em>&#8221;Block&#8221; \u00e4r den abstrakta term som anv\u00e4nds f\u00f6r att beskriva enheter av markeringar som tillsammans bildar inneh\u00e5llet eller layouten p\u00e5 en webbsida. Id\u00e9n kombinerar koncept av det som vi uppn\u00e5r i WordPress idag med kortkoder, anpassad HTML och inb\u00e4ddning till ett enda konsekvent API och en enhetlig anv\u00e4ndarupplevelse.<\/em><\/p><\/blockquote>\n<p>Titlar, stycken, kolumner, bilder, gallerier och alla element som utg\u00f6r redigeringsgr\u00e4nssnittet, fr\u00e5n sidof\u00e4ltspaneler till blockverktygsf\u00e4ltet, \u00e4r React-komponenter.<\/p>\n<p>S\u00e5 vad \u00e4r React-komponenter? W3Schools ger <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">f\u00f6ljande definition<\/a>:<\/p>\n<blockquote><p><em>Komponenter \u00e4r oberoende och \u00e5teranv\u00e4ndbara kodbitar. De tj\u00e4nar samma syfte som JavaScript-funktioner, men arbetar isolerat och returnerar 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=\"Arbeta med Gutenberg-block i WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Arbeta med Gutenberg-block i WordPress 5.8.<\/figcaption><\/figure>\n<p>\u00c4ven om redigeringsupplevelsen som levereras av Gutenberg \u00e4r ny j\u00e4mf\u00f6rt med den klassiska WordPress-redigeraren, s\u00e5 \u00e4ndras inte WordPress s\u00e4tt att lagra dina inneh\u00e5llsdelar i databasen \u00f6verhuvudtaget. Detta beror p\u00e5 att Gutenberg \u00e4r en applikation som fungerar i WordPress men som inte \u00e4ndrar CMS: ets s\u00e4tt att fungera i grunden.<\/p>\n<p>Inl\u00e4gg (och detta inkluderar inl\u00e4gg, sidor och anpassade inl\u00e4ggstyper) som skapas med Gutenberg lagras fortfarande i tabellen <code>wp_posts<\/code>, precis som med den klassiska redigeraren.<\/p>\n<p>Men i ett inl\u00e4gg som har skapats med Gutenberg s\u00e5 hittar du ytterligare bitar av information i tabellen. Den representerar en grundl\u00e4ggande skillnad mellan inl\u00e4gg som har skapats via den klassiska redigeraren kontra Gutenberg.<\/p>\n<p>Dessa informationsbitar ser ut som HTML-kommentarer och har en specifik funktion: att avgr\u00e4nsa block:<\/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=\"Ett blogginl\u00e4gg i kodredigeringsvyn.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Ett blogginl\u00e4gg i kodredigeringsvyn.<\/figcaption><\/figure>\n<p><strong>Blockavgr\u00e4nsare<\/strong> talar om f\u00f6r WordPress vilket block som ska \u00e5terges p\u00e5 sk\u00e4rmen. De ger \u00e4ven v\u00e4rden f\u00f6r blockegenskaper i ett JSON-objekt. Denna rekvisita dikterar hur blocket ska \u00e5terges p\u00e5 sk\u00e4rmen:<\/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=\"Ett blogginl\u00e4gg som lagras i tabellen wp_posts.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Ett blogginl\u00e4gg som lagras i tabellen <code>wp_posts<\/code>.<\/figcaption><\/figure>\n<h2>Inst\u00e4llning av din WordPress-utvecklingsmilj\u00f6<\/h2>\n<p>F\u00f6r att inr\u00e4tta en modern JavaScript-utvecklingsmilj\u00f6 s\u00e5 kr\u00e4vs det gedigna kunskaper om avancerad teknik som <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> och <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>\u00c4r du avskr\u00e4ckt? Var inte det! WordPress-communityt har redan kommit till unds\u00e4ttning genom att tillhandah\u00e5lla kraftfulla verktyg som l\u00e5ter dig undvika en r\u00f6rig manuell konfigurationsprocess.<\/p>\n<p>F\u00f6r att h\u00e5lla saker och ting enkla s\u00e5 kommer vi inte att g\u00e5 igenom\u00a0<a href=\"https:\/\/kinsta.com\/blog\/transpiling-php\/\">transpiling<\/a> i den h\u00e4r artikeln (vilket vi \u00e4nd\u00e5 rekommenderar att du bekantar dig med n\u00e4r du har l\u00e4rt dig grunderna i blockutveckling). Vi kommer ist\u00e4llet att presentera tv\u00e5 alternativa verktyg som du kan anv\u00e4nda f\u00f6r att snabbt och enkelt s\u00e4tta upp en modern JavaScript-utvecklingsmilj\u00f6 p\u00e5 n\u00e5gra minuter. Det \u00e4r upp till dig att v\u00e4lja det som du finner mest praktiskt f\u00f6r ditt projekt.<\/p>\n<p>Att s\u00e4tta upp en JavaScript-utvecklingsmilj\u00f6 f\u00f6r att bygga Gutenbergblock \u00e4r en process i tre steg:<\/p>\n<ol>\n<li><a href=\"#node-npm\">Installera Node.js och npm<\/a><\/li>\n<li><a href=\"#dev-environment\">St\u00e4ll in utvecklingsmilj\u00f6n<\/a><\/li>\n<li><a href=\"#block-plugin\">St\u00e4ll in blockpluginet<\/a><\/li>\n<\/ol>\n<p>Nu s\u00e4tter vi ig\u00e5ng.<\/p>\n<h3 id=\"node-npm\">1. Installera Node.js och npm<\/h3>\n<p>Innan du installerar din utvecklingsmilj\u00f6 och registrerar ditt f\u00f6rsta block s\u00e5 m\u00e5ste du installera <a href=\"https:\/\/kinsta.com\/it\/knowledgebase\/node-js\/\">Node.js<\/a> och Node-pakethanteraren (npm).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> \u00e4r en JavaScript-k\u00f6rningstid som bygger p\u00e5 Chromes V8 JavaScript-motor. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>. Den \u00e4r allm\u00e4nt k\u00e4nt som Node pakethanteraren och anses vara &#8221;v\u00e4rldens st\u00f6rsta programvaruregister&#8221;.<\/p>\n<\/aside>\n\n<p>Du kan <a href=\"https:\/\/kinsta.com\/se\/blog\/hur-du-installerar-node-js\/\">installera Node.js och npm<\/a> p\u00e5 <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">flera olika s\u00e4tt<\/a>. Men f\u00f6rst s\u00e5 b\u00f6r du kanske kontrollera om programvaran redan \u00e4r installerad p\u00e5 din maskin.<\/p>\n<p>F\u00f6r att g\u00f6ra detta s\u00e5 startar du terminalen och k\u00f6r f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Om resultatet \u00e4r <code>command not found<\/code>\u00a0s\u00e5 \u00e4r Node.js inte installerat p\u00e5 din dator och du kan forts\u00e4tta med installationen.<\/p>\n<p>I den h\u00e4r artikeln s\u00e5 har vi valt det enklaste installationsalternativet, vilket \u00e4r <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Allt som du beh\u00f6ver g\u00f6ra \u00e4r att ladda ner den version som motsvarar ditt operativsystem och starta 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=\"Sidan f\u00f6r nedladdningar av Node.js.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">Sidan f\u00f6r nedladdningar av Node.js.<\/figcaption><\/figure>\n<p>N\u00e4r du har installerat Node.js s\u00e5 k\u00f6r du kommandot <code>node -v<\/code> i din terminal igen. Du kan \u00e4ven k\u00f6ra kommandot <code>npm -v<\/code> f\u00f6r att bekr\u00e4fta att du har npm-paketet tillg\u00e4ngligt.<\/p>\n<p>Du \u00e4r nu utrustad med f\u00f6ljande verktyg:<\/p>\n<ul>\n<li>Paketk\u00f6raren <code>npx<\/code> Node.js (<a href=\"https:\/\/nodejs.dev\/learn\/the-npx-nodejs-package-runner\">se dokumentationen<\/a>). Detta g\u00f6r att du kan k\u00f6ra ett <code>npm<\/code> -kommando utan att installera det f\u00f6rst.<\/li>\n<li>Node.js-pakethanteraren <code>npm<\/code> Node.js (<a href=\"https:\/\/docs.npmjs.com\/\">se dokumentation<\/a>). Detta anv\u00e4nds f\u00f6r att installera beroenden och k\u00f6ra skript.<\/li>\n<\/ul>\n<p>N\u00e4sta steg \u00e4r att installera utvecklingsmilj\u00f6n.<\/p>\n<h3 id=\"dev-environment\">2. Installera din utvecklingsmilj\u00f6<\/h3>\n<p>N\u00e4r du har de senaste versionerna av Node.js och npm p\u00e5 din lokala maskin s\u00e5 beh\u00f6ver du en utvecklingsmilj\u00f6 f\u00f6r WordPress.<\/p>\n<p>Du kan antingen anv\u00e4nda en lokal utvecklingsmilj\u00f6 som DevKinsta eller anv\u00e4nda det officiella WordPress-verktyget. L\u00e5t oss ta en titt p\u00e5 b\u00e5da alternativen.<\/p>\n<h4 id=\"devkinsta\">Alternativ 1: Lokal utvecklingsmilj\u00f6 (DevKinsta)<\/h4>\n<p>Med endast n\u00e5gra f\u00e5 klick s\u00e5 kan du <a href=\"https:\/\/kinsta.com\/se\/ebooks\/wordpress\/wordpress-lokal-utveckling\/\">installera WordPress lokalt<\/a> med <a href=\"https:\/\/kinsta.com\/se\/devkinsta\/\">DevKinsta<\/a>, v\u00e5rt moderna lokala WordPress-utvecklingsverktyg. Du kan \u00e4ven v\u00e4lja ett annat lokalt utvecklingsverktyg, till exempel <a href=\"https:\/\/kinsta.com\/se\/blog\/installerar-wordpress-lokalt\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> eller <a href=\"https:\/\/kinsta.com\/se\/blog\/installerar-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=\"Skapa en ny WordPress-webbplats i DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Skapa en ny WordPress-webbplats i DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Alternativ 2: wp-env<\/h4>\n<p>Du kan \u00e4ven v\u00e4lja det officiella <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">verktyget<code>wp-env<\/code><\/a> , som ger en lokal WordPress-utvecklingsmilj\u00f6 som du kan starta direkt fr\u00e5n kommandoraden. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">definierar detta p\u00e5 f\u00f6ljande s\u00e4tt<\/a>:<\/p>\n<blockquote><p><em>Att skapa lokala WordPress-milj\u00f6er \u00e4r nu lika enkelt som att k\u00f6ra ett enda kommando. <code>wp-env<\/code> \u00e4r ett verktyg med nollkonfiguration f\u00f6r sm\u00e4rtfria lokala WordPress-milj\u00f6er. Det g\u00f6r att anv\u00e4ndare kan starta WordPress snabbt och smidigt utan att sl\u00f6sa tid. M\u00e5let \u00e4r faktiskt att g\u00f6ra dessa milj\u00f6er l\u00e4ttillg\u00e4ngliga f\u00f6r alla &#8211; oavsett om du \u00e4r utvecklare, designer, chef eller n\u00e5got annat.<\/em><\/p><\/blockquote>\n<p>Om du best\u00e4mmer dig f\u00f6r att ge det ett f\u00f6rs\u00f6k s\u00e5 kr\u00e4ver installationen av <code>wp-env<\/code>\u00a0en minimal anstr\u00e4ngning. F\u00f6lj bara dessa steg:<\/p>\n<h5>Steg 1: Bekr\u00e4fta installationen av Docker och Node.js<\/h5>\n<p>F\u00f6r att uppfylla de tekniska kraven s\u00e5 m\u00e5ste du f\u00f6rst ha b\u00e5de <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> och Node.js installerade p\u00e5 din dator. Detta beror p\u00e5 att <code>wp-env<\/code> skapar en Docker-instans som k\u00f6r en WordPress-webbplats. Alla \u00e4ndringar som g\u00f6rs i koden \u00e5terspeglas omedelbart i WordPress-instansen.<\/p>\n<h5>Steg 2: Installera <code>@wordpress\/env<\/code> fr\u00e5n kommandoraden<\/h5>\n<p>N\u00e4r Docker och Node.js k\u00f6rs p\u00e5 din dator s\u00e5 kan du g\u00e5 vidare och installera WordPress-<a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">utvecklingsmilj\u00f6n<\/a>.<\/p>\n<p>Du kan antingen installera <code>wp-env<\/code>\u00a0globalt eller lokalt. F\u00f6r att g\u00f6ra det globalt s\u00e5 m\u00e5ste du k\u00f6ra f\u00f6ljande kommando fr\u00e5n plugins-katalogen (mer om detta i rutan &#8221;Viktigt&#8221; nedan):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>L\u00e5t oss dela upp detta:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">installerar paketet<\/a>.<\/li>\n<li><code>-g<\/code> som l\u00e4ggs till kommandot <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">installerar det angivna paketet globalt<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> \u00e4r det <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">paket som du ska installera<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Som standard s\u00e5\u00a0<a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">installeras nodepaket<\/a> p\u00e5 Mac och Linux i <strong>\/usr\/local\/lib\/node_modules<\/strong>.<\/p>\n<p>Om den aktuella anv\u00e4ndaren inte har skrivr\u00e4ttigheter i den katalogen s\u00e5 kommer ett EACCES-fel att utf\u00e4rdas. L\u00e4s mer om hur du <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">l\u00f6ser EACCES-beh\u00f6righetsfel n\u00e4r du installerar paket globalt<\/a>.<\/p>\n<\/aside>\n\n<p>F\u00f6r att bekr\u00e4fta att <code>wp-env<\/code> har installerats framg\u00e5ngsrikt, k\u00f6r f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Du b\u00f6r se den aktuella versionen av <code>wp-env<\/code>, vilket inneb\u00e4r att du nu kan starta milj\u00f6n med f\u00f6ljande kommando <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">fr\u00e5n din pluginmodulmapp<\/a>:<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Du kan komma \u00e5t WordPress instrumentpanel med f\u00f6ljande adress:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>Standardinloggningsuppgifterna \u00e4r f\u00f6ljande:<\/p>\n<ul>\n<li>Anv\u00e4ndarnamn: <code>admin<\/code><\/li>\n<li>L\u00f6senord: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">St\u00e4ll in ditt blockplugin<\/h3>\n<p>Nu beh\u00f6ver du ett startblockplugin att bygga vidare p\u00e5. Men i st\u00e4llet f\u00f6r att manuellt skapa ett utvecklingsblockplugin med alla n\u00f6dv\u00e4ndiga filer och mappar s\u00e5 kan du helt enkelt k\u00f6ra ett utvecklingsverktyg som tillhandah\u00e5ller alla filer och konfigurationer som du beh\u00f6ver f\u00f6r att komma ig\u00e5ng med blockutvecklingen.<\/p>\n<p>Du har \u00e5terigen ett par alternativ att v\u00e4lja mellan. L\u00e5t oss ta en titt p\u00e5 vart och ett av dessa.<\/p>\n<h4 id=\"create-block\">Alternativ 1: Konfigurera en blockplugin 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> \u00e4r det officiella nollkonfigurationsverktyget f\u00f6r att skapa Gutenbergblock:<\/p>\n<blockquote><p><em>Create Block \u00e4r ett officiellt s\u00e4tt f\u00f6r skapandet av block och f\u00f6r att registrera ett block f\u00f6r ett WordPress-plugin. Det erbjuder en modern byggupps\u00e4ttning utan konfiguration. Verktyget genererar PHP-, JS- och CSS-kod och allt annat som du beh\u00f6ver f\u00f6r att starta projektet.<\/em><\/p>\n<p>Det \u00e4r till stor del inspirerat av <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Stort tack till <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a><span style=\"font-size: 1rem\">, hela Facebook-teamet och React-communityt.<\/span><\/p><\/blockquote>\n<p>N\u00e4r din lokala milj\u00f6 \u00e4r ig\u00e5ng s\u00e5 kan du s\u00e4tta upp ett startblock genom att helt enkelt k\u00f6ra <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">kommandot<\/a> <code>npx @wordpress\/create-block.<\/code>Detta kommer att tillhandah\u00e5lla alla filer och mappar som du beh\u00f6ver f\u00f6r att <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">skapa plugin-st\u00e4llningar<\/a> och registrera ett nytt block.<\/p>\n<p>L\u00e5t oss k\u00f6ra ett test f\u00f6r att se hur det fungerar.<\/p>\n<p>Fr\u00e5n ditt kommandoradsverktyg s\u00e5 navigerar du till katalogen <strong>\/wp-content\/plugins\/<\/strong> och k\u00f6r f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>N\u00e4r du blir ombedd att bekr\u00e4fta s\u00e5 skriver du <code>y<\/code> f\u00f6r att forts\u00e4tta:<\/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=\"Skapa ett block med @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Skapa ett block med @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Processen tar n\u00e5gra \u00f6gonblick. N\u00e4r den \u00e4r klar s\u00e5 b\u00f6r du f\u00e5 f\u00f6ljande 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=\"Blockpluginet har skapats.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">Blockpluginet har skapats.<\/figcaption><\/figure>\n<p>Och det var allt!<\/p>\n<p>Starta nu din WordPress-utvecklingsmilj\u00f6 och g\u00e5 till sk\u00e4rmen <strong>Plugins<\/strong> i WordPress-instrumentpanelen. Ett nytt plugin som heter &#8221;My First Block&#8221; borde ha lagts till i din pluginlista:<\/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=\"Blockpluginet har installerats framg\u00e5ngsrikt.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">Blockpluginet har installerats framg\u00e5ngsrikt.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Om du anv\u00e4nder verktyget <code>wp-env<\/code> och k\u00f6r <code>wp-env start<\/code> fr\u00e5n katalogen som inneh\u00e5ller pluginet, s\u00e5 kommer det automatiskt att montera och aktivera pluginet. Om du k\u00f6r <code>wp-env start<\/code> fr\u00e5n n\u00e5gon annan katalog s\u00e5 kommer en generisk WordPress-milj\u00f6 att skapas (se \u00e4ven <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress Development Site<\/a>).<\/p>\n<\/aside>\n\n<p>Aktivera pluginet om det beh\u00f6vs, skapa ett nytt blogginl\u00e4gg, scrolla ner i blockpluginet till avsnittet <strong>Widgets<\/strong> och v\u00e4lj ditt nya block:<\/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=\"Ett exempelblock som \u00e4r skapat med @wordpress\/create-block.\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Ett exempelblock som \u00e4r skapat med @wordpress\/create-block.<\/figcaption><\/figure>\n<p>G\u00e5 nu tillbaka till terminalen och \u00e4ndra den aktuella katalogen till <strong>my-first-block<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>K\u00f6r sedan f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Detta g\u00f6r att du kan k\u00f6ra pluginet i utvecklingsl\u00e4ge. F\u00f6r att skapa produktionskoden s\u00e5 ska du anv\u00e4nda f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Alternativ 2: Konfigurera ett blockplugin med create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> \u00e4r ett utvecklingsverktyg fr\u00e5n tredje part f\u00f6r att bygga Gutenbergblock:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> \u00e4r ett utvecklingsverktygs-kit med nollkonfiguration (#0CJS) f\u00f6r att utveckla WordPress Gutenbergblock p\u00e5 n\u00e5gra minuter utan att konfigurera React, webpack, ES6\/7\/8\/Next, ESLint, Babel osv.<\/em><\/p><\/blockquote>\n<p>Precis som det officiella verktyget <code>create-block<\/code>\u00a0s\u00e5 \u00e4r <code>create-guten-block<\/code> baserat p\u00e5 <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> och kan hj\u00e4lpa dig att skapa ditt f\u00f6rsta blockplugin utan problem.<\/p>\n<p>Verktygsl\u00e5dan inkluderar allt som du beh\u00f6ver f\u00f6r att skapa ett modernt WordPress-plugin, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">inklusive f\u00f6ljande<\/a>:<\/p>\n<blockquote>\n<ul>\n<li>React, JSX och ES6 syntaxst\u00f6d.<\/li>\n<li>Webpack dev\/produktionsbyggnadsprocess under huven.<\/li>\n<li>Spr\u00e5kliga extrafunktioner ut\u00f6ver ES6 som objektspridningsoperatorn.<\/li>\n<li>CSS med automatisk prefixering s\u00e5 att du inte beh\u00f6ver -webkit eller andra prefix.<\/li>\n<li>Ett byggskript f\u00f6r att paketera JS, CSS och bilder f\u00f6r produktion med k\u00e4llkortsmappning.<\/li>\n<li>Problemfria uppdateringar f\u00f6r ovanst\u00e5ende verktyg med ett enda beroende cgb-script.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Observera f\u00f6ljande varning:<\/p>\n<blockquote><p><em>Motprestationen \u00e4r att dessa verktyg \u00e4r f\u00f6rkonfigurerade f\u00f6r att fungera p\u00e5 ett visst s\u00e4tt. Om ditt projekt beh\u00f6ver mer anpassning s\u00e5 kan du <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">&#8221;kasta dig ut&#8221;<\/a> och anpassa det, men d\u00e5 m\u00e5ste du uppr\u00e4tth\u00e5lla denna konfiguration.<\/em><\/p><\/blockquote>\n<p>N\u00e4r du har en lokal WordPress-webbplats till hands s\u00e5 startar du ditt kommandoradsverktyg, navigerar till mappen <strong>\/wp-content\/plugins<\/strong> i din installation och k\u00f6r f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Du m\u00e5ste v\u00e4nta en minut eller tv\u00e5 medan projektstrukturen skapas och beroenden h\u00e4mtas:<\/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=\"Skapa ett Gutenberg-block med create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Skapa ett Gutenberg-block med create-guten-block.<\/figcaption><\/figure>\n<p>N\u00e4r processen \u00e4r klar s\u00e5 b\u00f6r du se f\u00f6ljande sk\u00e4rm:<\/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-blocket har skapats med create-guten-block.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Gutenberg-blocket har skapats med create-guten-block.<\/figcaption><\/figure>\n<p>N\u00e4sta bild visar projektstrukturen n\u00e4r terminalen k\u00f6rs i <a href=\"https:\/\/kinsta.com\/se\/blog\/basta-textredigerarna\/#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=\"Blockplugin i Visual Studio Code.\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">Blockplugin i Visual Studio Code.<\/figcaption><\/figure>\n<p>G\u00e5 nu tillbaka till din WordPress-instrumentpanel. Ett nytt objekt b\u00f6r listas i sk\u00e4rmen Plugins &#8211; det \u00e4r pluginet\u00a0<strong>my-first-block<\/strong>:<\/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\u00e4rmen Plugins med ett nytt plugin som har skapats med create-guten-block.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">Sk\u00e4rmen Plugins med ett nytt plugin som har skapats med create-guten-block.<\/figcaption><\/figure>\n<p>Aktivera pluginet och g\u00e5 tillbaka till terminalen. \u00c4ndra den aktuella katalogen till <strong>my-first-block<\/strong> och k\u00f6r sedan <code>npm start<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Du b\u00f6r f\u00e5 f\u00f6ljande 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 har startat\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm har startat<\/figcaption><\/figure>\n<p>\u00c5terigen s\u00e5 g\u00f6r detta att du kan k\u00f6ra pluginet i utvecklingsl\u00e4ge. F\u00f6r att skapa produktionskoden s\u00e5 b\u00f6r du anv\u00e4nda:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Aktivera pluginet och skapa ett nytt inl\u00e4gg eller en ny sida, bl\u00e4ddra sedan bland dina block och v\u00e4lj ditt helt nya Gutenberg-block:<\/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=\"Ett nytt block som har skapats med create-guten-block.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Ett nytt block som har skapats med create-guten-block.<\/p>\n<p><\/figcaption><\/figure>\n<p>Om du vill ha en mer ing\u00e5ende \u00f6versikt eller om du har gjort fel s\u00e5 kan du l\u00e4sa <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">dokumentationen fr\u00e5n Ahmad Awais<\/a>.<\/p>\n<h2>En genomg\u00e5ng av startblockets byggnadsst\u00e4llning<\/h2>\n<p>Oavsett vilket av de tv\u00e5 utvecklingsverktygen &#8211; <code>create-block<\/code> eller <code>create-guten-block<\/code> &#8211; som du v\u00e4ljer s\u00e5 har du nu en blockst\u00e4llning som du kan anv\u00e4nda som utg\u00e5ngspunkt f\u00f6r att bygga ett blockplugin.<br \/>\nMen vad \u00e4r egentligen en <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">blockst\u00e4llning<\/a>?<\/p>\n<blockquote><p><em>Blockst\u00e4llningar \u00e4r en kortfattad term som beskriver den st\u00f6djande katalogstruktur som du beh\u00f6ver f\u00f6r att WordPress ska k\u00e4nna igen ett block. Den katalogen inneh\u00e5ller vanligtvis filer som <strong>index.php<\/strong>, <strong>index.js<\/strong>, <strong>style.css<\/strong> och andra &#8211; som i sin tur inneh\u00e5ller anrop som <code>register_block_type<\/code>.<\/em><\/p><\/blockquote>\n<p>Vi valde det officiella utvecklingsverktyget <strong>Create Block<\/strong>, eftersom <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">det anv\u00e4nds i Handboken f\u00f6r Blockredigeraren<\/a>. Men \u00e4ven om du v\u00e4ljer att anv\u00e4nda ett tredjepartsverktyg som <code>create-guten-block<\/code>, s\u00e5 kommer din upplevelse inte att vara alltf\u00f6r annorlunda.<br \/>\nMed detta sagt, l\u00e5t oss dyka djupare in i <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">verktyget<code>create-block<\/code><\/a>.<\/p>\n<h3>En n\u00e4rmare titt p\u00e5 utvecklingsverktyget Create Block<\/h3>\n<p>Som vi n\u00e4mnde ovan s\u00e5 \u00e4r <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> det officiella kommandoradsverktyget f\u00f6r att skapa Gutenbergblock. Genom att k\u00f6ra <code>@wordpress\/create-block<\/code> i din terminal s\u00e5 genereras de PHP-, JS- och SCSS-filer och den kod som beh\u00f6vs f\u00f6r att registrera en ny blocktyp:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (valfritt) &#8211; anv\u00e4nds f\u00f6r att tilldela blockets slug och installera pluginet.<\/li>\n<li><code>[options]<\/code> (valfritt) &#8211; tillg\u00e4ngliga alternativ<\/li>\n<\/ul>\n<p>Som standard s\u00e5 tilldelas en <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a>-mall. Det inneb\u00e4r att du f\u00e5r <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">n\u00e4sta version av JavaScript<\/a> med till\u00e4gget <a href=\"https:\/\/en.wikipedia.org\/wiki\/JSX_(JavaScript)\">JSX-syntaxen<\/a>.<\/p>\n<p>Om du utel\u00e4mnar blocknamnet s\u00e5 k\u00f6rs kommandot i interaktivt l\u00e4ge, s\u00e5 att du kan anpassa flera alternativ innan filerna genereras:<\/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\u00f6r Create Block i interaktivt l\u00e4ge\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">K\u00f6r Create Block i interaktivt l\u00e4ge<\/figcaption><\/figure>\n<p class=\"p1\">Bilden nedan visar filstrukturen f\u00f6r ett blockinsticksprogram som skapats med det officiella verktyget Create Block:<\/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 och mappar i ett blockinsticksprogram som skapats med @wordpress\/create-block.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Filer och mappar i ett blockinsticksprogram som skapats med @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Med detta sagt, l\u00e5t oss g\u00e5 igenom de viktigaste filerna och mapparna i v\u00e5rt nya blockplugin.<\/p>\n<h3 id=\"plugin-file\">Pluginfilen<\/h3>\n<p>Med den huvudsakliga pluginfilen s\u00e5\u00a0<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registrerar du blocket p\u00e5 servern:<\/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' );\n<\/code><\/pre>\n<p>Funktionen <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registrerar en blocktyp p\u00e5 servern<\/a> med hj\u00e4lp av metadata som lagras i filen <strong>block.json<\/strong>.<\/p>\n<p>Funktionen tar emot tv\u00e5 parametrar:<\/p>\n<ul>\n<li>Blocktypens namn inklusive namnomr\u00e5de, eller en s\u00f6kv\u00e4g till mappen d\u00e4r filen <strong>block.json<\/strong> finns, eller ett komplett <code>WP_Block_Type<\/code> -objekt.<\/li>\n<li>En matris med blocktypargument.<\/li>\n<\/ul>\n<p>I koden ovan s\u00e5 returnerar den <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">magiska konstanten<\/a> <code>__DIR__<\/code> den aktuella mappen. Detta inneb\u00e4r att filen <strong>block.json<\/strong> finns 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> definieras JavaScript-egenskaper och skript f\u00f6r ditt projekt. Det \u00e4r h\u00e4r som du kan installera dina projektberoenden.<\/p>\n<p>F\u00f6r att b\u00e4ttre f\u00f6rst\u00e5 vad den h\u00e4r filen \u00e4r avsedd f\u00f6r s\u00e5 \u00f6ppnar du den med din <a href=\"https:\/\/kinsta.com\/se\/blog\/gratis-html-redigerare\/\">favoritkodredigerare<\/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\">Egenskapen<\/a> <code>scripts<\/code> \u00e4r en <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">ordbok som inkluderar kommandon<\/a> som k\u00f6rs vid olika tidpunkter under <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">ett pakets livscykel<\/a> med hj\u00e4lp av <code>npm run [cmd]<\/code>.<\/p>\n<p>I den h\u00e4r artikeln s\u00e5 kommer vi att anv\u00e4nda <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">f\u00f6ljande kommandon<\/a>:<\/p>\n<ul>\n<li><code>npm run build<\/code> \u2014 Skapa en (komprimerad) produktionsuppbyggnad.<\/li>\n<li><code>npm run start<\/code> eller <code>npm start<\/code> \u2014 skapar en (okomprimerad) utvecklingsbyggnad.<\/li>\n<\/ul>\n<p><code>dependencies<\/code> och <code>devDependencies<\/code> \u00e4r tv\u00e5 objekt som mappar <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">ett paketnamn till en version<\/a>. <code>dependencies<\/code> kr\u00e4vs i produktionen, medan <code>devDependences<\/code> endast beh\u00f6vs f\u00f6r lokal utveckling (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">l\u00e4s mer<\/a>).<\/p>\n<p>Det enda standardutvecklingsberoendet \u00e4r paketet <code>@wordpress\/scripts<\/code>, som <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">definieras som<\/a> &#8221;en samling \u00e5teranv\u00e4ndbara skript som \u00e4r skr\u00e4ddarsydda f\u00f6r WordPress-utveckling&#8221;.<\/p>\n<h3 id=\"block-json\">Filen block.json<\/h3>\n<p>Fr\u00e5n och med WordPress 5.8 s\u00e5 \u00e4r <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadatafilen<\/a> <strong>block.json<\/strong> det <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-5-8\/#block-api-enhancements\">kanoniska s\u00e4ttet att registrera blocktyper<\/a>.<\/p>\n<p>Att ha en <strong>block.json<\/strong>-fil ger flera f\u00f6rdelar, bland annat <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">f\u00f6rb\u00e4ttrad prestanda<\/a> och b\u00e4ttre synlighet i <a href=\"https:\/\/wordpress.org\/plugins\/\">WordPress Pluginkatalog<\/a>:<\/p>\n<blockquote><p><em>Ur ett prestandaperspektiv, n\u00e4r teman har st\u00f6d f\u00f6r lata laddningar av tillg\u00e5ngar, s\u00e5 kommer block som registreras med <strong>block.json<\/strong> att f\u00e5 sin tillg\u00e5ngsk\u00f6 optimerad fr\u00e5n b\u00f6rjan. De CSS- och JavaScript-tillg\u00e5ngar som anges i egenskaperna <code>style<\/code> eller <code>script<\/code> kommer endast att k\u00f6as n\u00e4r blocket finns p\u00e5 sidan, vilket leder till minskade sidstorlekar.<\/em><\/p><\/blockquote>\n<p>Om du k\u00f6r kommandot <code>@wordpress\/create-block<\/code>\u00a0s\u00e5 genereras f\u00f6ljande <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>H\u00e4r \u00e4r den fullst\u00e4ndiga listan \u00f6ver <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">standardegenskaper<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> &#8211; Den version av API: et som anv\u00e4nds av blocket (nuvarande version \u00e4r 2).<\/li>\n<li><code>name<\/code> &#8211; En unik identifierare f\u00f6r ett block, inklusive ett namnomr\u00e5de.<\/li>\n<li><code>version<\/code> &#8211; Den aktuella versionen av ett block.<\/li>\n<li><code>title<\/code> &#8211; En visningstitel f\u00f6r ett block.<\/li>\n<li><code>category<\/code> &#8211; En blockkategori.<\/li>\n<li><code>icon<\/code> &#8211; En <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a>-slug eller en egen SVG-ikon.<\/li>\n<li><code>description<\/code> &#8211; En kort beskrivning som \u00e4r synlig i blockinspekt\u00f6ren.<\/li>\n<li><code>supports<\/code> &#8211; En upps\u00e4ttning alternativ f\u00f6r att styra funktioner som anv\u00e4nds i redigeraren.<\/li>\n<li><code>textdomain<\/code> &#8211; pluginets textdom\u00e4n<\/li>\n<li><code>editorScript<\/code> &#8211; definition av redigerar-skriptet<\/li>\n<li><code>editorStyle<\/code> &#8211; Definition av redigeringsstil.<\/li>\n<li><code>style<\/code> &#8211; ger alternativa stilar f\u00f6r ett block.<\/li>\n<\/ul>\n<p>F\u00f6rutom de egenskaper som anges ovan s\u00e5 kan du (och kommer f\u00f6rmodligen att) definiera ett <code>attributes<\/code> -objekt som inneh\u00e5ller information om data som lagras i blocket. I din <strong>block.json<\/strong>\u00a0s\u00e5 kan du st\u00e4lla in valfritt antal attribut i <em>nyckel\/v\u00e4rde-par<\/em>, d\u00e4r nyckeln \u00e4r attributnamnet och v\u00e4rdet \u00e4r attributdefinitionen.<\/p>\n<p>Ta en titt p\u00e5 f\u00f6ljande exempel 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 kommer att g\u00e5 djupare in p\u00e5 <strong>block.json<\/strong>-filen <a href=\"#block-json-at-work\">senare i artikeln<\/a>, men du kan \u00e4ven l\u00e4sa Handboken f\u00f6r Blockredigeraren f\u00f6r mer detaljerad information om <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadata<\/a> och <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attribut<\/a> i <strong>block.json<\/strong>.<\/p>\n<h3 id=\"src-folder\">Mappen src<\/h3>\n<p>Det \u00e4r i mappen <code>src<\/code> som utvecklingen sker. I den mappen s\u00e5 hittar du f\u00f6ljande filer:<\/p>\n<ul>\n<li><strong>index.js<\/strong><\/li>\n<li><strong>redigera.js<\/strong><\/li>\n<li><strong>spara.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> \u00e4r din utg\u00e5ngspunkt. H\u00e4r importerar du beroenden och registrerar blocktypen 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>Det f\u00f6rsta p\u00e5st\u00e5endet importerar funktionen <code>registerBlockType<\/code> fr\u00e5n <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">paketet<\/a> <code>@wordpress\/blocks<\/code>. De f\u00f6ljande <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">importf\u00f6rklaringarna<\/a> importerar formatmallen tillsammans med funktionerna <code>Edit<\/code> och <code>save<\/code> samt ett metadataobjekt fr\u00e5n 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\/\">registrerar komponenten p\u00e5 klienten<\/a>. Funktionen tar emot tv\u00e5 parametrar: ett blocknamn och ett objekt f\u00f6r blockkonfiguration.<\/p>\n<p>Funktionen <code>Edit<\/code> tillhandah\u00e5ller blockgr\u00e4nssnittet som det \u00e5terges i blockredigeraren, medan funktionen <code>save<\/code> tillhandah\u00e5ller den struktur som kommer att serialiseras och sparas i databasen (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">l\u00e4s mer<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p>I <strong>edit.js<\/strong> byggs blockadministrationsgr\u00e4nssnittet:<\/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\u00f6rst s\u00e5 importeras funktionen <code>__<\/code> fr\u00e5n paketet <code>@wordpress\/i18n<\/code> (detta paket inkluderar en JavaScript-version av \u00f6vers\u00e4ttningsfunktionerna), funktionen <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> och filen <code>editor.scss<\/code>.<\/p>\n<p>D\u00e4refter s\u00e5 exporteras React-komponenten (l\u00e4s mer om <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">import<\/a>&#8211; och <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">exportf\u00f6rklaringar<\/a>).<\/p>\n<h4>save.js<\/h4>\n<p>I filen <strong>save.js<\/strong>\u00a0s\u00e5 bygger vi upp blockstrukturen som ska sparas 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 och style.scss<\/h4>\n<p>F\u00f6rutom skripten s\u00e5 finns det tv\u00e5 <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a>-filer i <strong>src<\/strong>-mapparna. Filen <strong>editor.scss<\/strong> inneh\u00e5ller de stilar som till\u00e4mpas p\u00e5 blocket i redigerarkontexten, medan filen <strong>style.scss<\/strong> inkluderar blockets stilar f\u00f6r visning <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">i frontend s\u00e5v\u00e4l som i redigeraren<\/a>. Vi kommer att dyka djupare in i dessa filer i den andra delen av den h\u00e4r guiden.<\/p>\n<h3 id=\"node_modules-build\">Mapparna node_modules och build<\/h3>\n<p>Mappen <code>node_modules<\/code> inneh\u00e5ller node-moduler och deras beroenden. Vi kommer inte att dyka djupare ner i node-paket eftersom det ligger utanf\u00f6r ramen f\u00f6r den h\u00e4r artikeln, men du kan l\u00e4sa mer i den <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">h\u00e4r artikeln om var npm installerar paketen<\/a>.<\/p>\n<p>Mappen <code>build<\/code> inneh\u00e5ller JS- och CSS-filer som \u00e4r resultatet av byggprocessen. Du kan f\u00f6rdjupa dig i byggprocessen i guiderna <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext syntax<\/a> och <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">JavaScript Build Setup<\/a>.<\/p>\n<h2>Projektet: Bygg ditt f\u00f6rsta Gutenberg-block<\/h2>\n<p>Det \u00e4r dags att skita ner h\u00e4nderna litegrann. Det h\u00e4r avsnittet kommer att l\u00e4ra dig hur du skapar ett plugin som tillhandah\u00e5ller ett CTA-block med namnet Kinsta Academy Block.<\/p>\n<p>Blocket kommer att best\u00e5 av tv\u00e5 kolumner, med en bild till v\u00e4nster och ett textavsnitt till h\u00f6ger. En knapp med en anpassningsbar l\u00e4nk kommer att placeras under texten:<\/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=\"Blocktypen som du kommer att l\u00e4ra dig att bygga i den h\u00e4r guiden.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">Blocktypen som du kommer att l\u00e4ra dig att bygga i den h\u00e4r guiden.<\/figcaption><\/figure>\n<p>Det h\u00e4r \u00e4r bara ett enkelt exempel, men det g\u00f6r att vi kan t\u00e4cka grunderna f\u00f6r utveckling av Gutenbergblock. N\u00e4r du har f\u00e5tt en tydlig f\u00f6rst\u00e5else f\u00f6r grunderna s\u00e5 kan du g\u00e5 vidare och skapa mer och mer komplexa Gutenbergblock med hj\u00e4lp av <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Handboken f\u00f6r Blockredigeraren<\/a> och alla andra av de stora resurser som finns tillg\u00e4ngliga d\u00e4r ute.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Koden f\u00f6r exemplen i den h\u00e4r handledningen <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">finns \u00e4ven tillg\u00e4ngliga p\u00e5 Gist<\/a>\u00a0f\u00f6r din referens.<\/p>\n<\/aside>\n\n<p>Om du antar att du har ig\u00e5ng den senaste versionen av WordPress i din lokala utvecklingsmilj\u00f6, s\u00e5 \u00e4r det h\u00e4r vad du kommer att l\u00e4ra dig fr\u00e5n och med nu:<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">S\u00e5 h\u00e4r st\u00e4ller du in startblockstill\u00e4gget<\/a><\/li>\n<li><a href=\"#block-json-at-work\">block.json p\u00e5 jobbet<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Anv\u00e4ndning av inbyggda komponenter: RichText-komponenten<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">L\u00e4gga till kontroller i verktygsf\u00e4ltet Block Verktygsf\u00e4lt<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Anpassning av blockinst\u00e4llningarna i sidof\u00e4ltet<\/a><\/li>\n<li><a href=\"#external-link\">L\u00e4gga till och anpassa en extern l\u00e4nk<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">L\u00e4gga till flera blockstilar<\/a><\/li>\n<li><a href=\"#innerblocks-component\">N\u00e4stning av block med InnerBlocks-komponenten<\/a><\/li>\n<li><a href=\"#additional-improvements\">Ytterligare f\u00f6rb\u00e4ttringar<\/a><\/li>\n<\/ul>\n<p>Redo&#8230; klart&#8230; inst\u00e4llt&#8230; ig\u00e5ng!<\/p>\n<h3 id=\"set-up-the-plugin\">S\u00e5 h\u00e4r st\u00e4ller du in startblockpluginet<\/h3>\n<p>Starta ditt kommandoradsverktyg och navigera till 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 style=\"padding-left: 40px;text-align: left\">K\u00f6r nu f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Det h\u00e4r kommandot genererar PHP-, SCSS- och JS-filer f\u00f6r att registrera ett block i interaktivt l\u00e4ge, s\u00e5 att du enkelt kan l\u00e4gga till de n\u00f6dv\u00e4ndiga uppgifterna f\u00f6r ditt block. I v\u00e5rt exempel s\u00e5 anv\u00e4nder vi f\u00f6ljande uppgifter:<\/p>\n<ul>\n<li><strong>Mallvariant<\/strong>: statisk<\/li>\n<li><strong>Blockets namn<\/strong>: ka-example-block<\/li>\n<li><strong>Internt namnomr\u00e5de<\/strong>: ka-example-block<\/li>\n<li><strong>Blockets visningstitel<\/strong>: Kinsta Academy Block<\/li>\n<li><strong>Kort blockbeskrivning<\/strong>: Ett exempelblock f\u00f6r Kinsta Academy-studenter<\/li>\n<li><strong>Dashicon<\/strong>: superhero-alt<\/li>\n<li><strong>Kategorinamn<\/strong>: widgets<\/li>\n<li><strong>Vill du anpassa WordPress-pluginet?<\/strong>: ja<\/li>\n<li><strong>Pluginets hemsida<\/strong>: https:\/\/kinsta.com\/<\/li>\n<li><strong>Nuvarande version av pluginet<\/strong>: 0.1.0<\/li>\n<li><strong>F\u00f6rfattare till pluginet<\/strong>: ditt namn<\/li>\n<li><strong>Licens<\/strong>: &#8211;<\/li>\n<li><strong>L\u00e4nk till licenstexten<\/strong>: &#8211;<\/li>\n<li><strong>Anpassad dom\u00e4nv\u00e4g f\u00f6r \u00f6vers\u00e4ttningar<\/strong>: &#8211;<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<p>Det tar n\u00e5gra minuter att installera pluginet och alla beroenden. N\u00e4r processen \u00e4r klar s\u00e5 f\u00e5r du f\u00f6ljande 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=\"Exempelblocket har installerats och registrerats f\u00f6r utveckling.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">Exempelblocket har installerats och registrerats f\u00f6r utveckling.<\/figcaption><\/figure>\n<p>K\u00f6r nu f\u00f6ljande kommando fr\u00e5n 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>Om du k\u00f6r din WordPress-milj\u00f6 s\u00e5 ska du f\u00f6rst starta Docker Desktop och sedan k\u00f6ra <code>wp-env start<\/code> fr\u00e5n din plugin-mapp.<br \/>\nD\u00e4refter s\u00e5 kan du starta <em>http:\/\/localhost:8888\/wp-login<\/em> fr\u00e5n din webbl\u00e4sare och anv\u00e4nda <strong>Anv\u00e4ndarnamn: admin<\/strong> och <strong>L\u00f6senord: password<\/strong> f\u00f6r att logga in p\u00e5 din WordPress-instrumentpanel.<\/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\u00f6rning av kommandon fr\u00e5n Visual Studio Code Terminal.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">K\u00f6rning av kommandon fr\u00e5n Visual Studio Code Terminal.<\/figcaption><\/figure>\n<p>Slutligen s\u00e5 kan du starta utvecklingen fr\u00e5n din plugin-mapp (<strong>ka-example-block<\/strong> i v\u00e5rt exempel) med:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>\u00d6ppna nu sk\u00e4rmen Plugins f\u00f6r att hitta och aktivera <strong>Kinsta Academy Block-pluginet<\/strong>:<\/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=\"Aktivera exempelblocket\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Aktivera exempelblocket<\/figcaption><\/figure>\n<p class=\"p1\">Skapa ett nytt inl\u00e4gg, \u00f6ppna blockinsatsen och bl\u00e4ddra ner till kategorin <b>Design<\/b>. Klicka f\u00f6r att l\u00e4gga till Kinsta Academy-blocket:<\/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=\"Ett startblock som \u00e4r byggt med @wordpress\/create-block.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Ett startblock som \u00e4r byggt med @wordpress\/create-block.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json p\u00e5 jobbet<\/h3>\n<p>Som vi n\u00e4mnde tidigare s\u00e5 sker blockregistreringen p\u00e5 serversidan i huvudfilen <strong>.php<\/strong>. Vi kommer dock inte att definiera inst\u00e4llningar i <strong>.php<\/strong>-filen. Vi kommer ist\u00e4llet att anv\u00e4nda filen <strong>block.json<\/strong>.<br \/>\nS\u00e5 \u00f6ppna <strong>block.json<\/strong> igen och titta n\u00e4rmare p\u00e5 standardinst\u00e4llningarna:<\/p>\n<pre><code class=\"language-json\">{\n\"$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>\u00a0<\/p>\n<h4>Skript och stilar<\/h4>\n<p><code>editorScript<\/code>-egenskaperna Skript och stilar, <code>editorStyle<\/code> och <code>style<\/code> anger de relativa s\u00f6kv\u00e4garna till skript och stilar f\u00f6r frontend och backend.<br \/>\nDu beh\u00f6ver inte registrera de skript och stilar som definieras h\u00e4r manuellt eftersom de registreras och k\u00f6as automatiskt av WordPress. F\u00f6r att bevisa detta s\u00e5 startar du webbl\u00e4sarinspektorn och \u00f6ppnar fliken <strong>N\u00e4tverk<\/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 av resurser i Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Inspektion av resurser i Chrome DevTools.<\/figcaption><\/figure>\n<p>Som du kan se p\u00e5 bilden ovan s\u00e5 har v\u00e5rt <strong>index.js<\/strong>-skript som finns i <strong>byggmappen<\/strong> regelbundet st\u00e4llts in i k\u00f6 <strong>utan att det har kr\u00e4vts n\u00e5gon PHP-kod<\/strong>.<\/p>\n<h4>UI-etiketter<\/h4>\n<p>Egenskaperna <code>title<\/code> och <code>description<\/code> ger de etiketter som kr\u00e4vs f\u00f6r att identifiera blocket i redigeraren:<\/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=\"Blockets namn och beskrivning i blockets sidof\u00e4lt.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Blockets namn och beskrivning i blockets sidof\u00e4lt.<\/figcaption><\/figure>\n<h4>Nyckelord<\/h4>\n<p>Som vi n\u00e4mnde tidigare s\u00e5 kan du konfigurera dina blockinst\u00e4llningar noggrant med hj\u00e4lp av <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">egenskaper<\/a> och <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attribut<\/a>. Du kan exempelvis l\u00e4gga till en eller flera <code>keywords<\/code> f\u00f6r att hj\u00e4lpa anv\u00e4ndarna att s\u00f6ka efter block:<\/p>\n<pre><code class=\"language-json\">\"keywords\": [ \n\"kinsta\", \n\t\t\"academy\", \n\t\t\"superhero\" \n\t],<\/code><\/pre>\n<p>Om du nu anger &#8221;kinsta&#8221;, &#8221;academy&#8221; eller &#8221;superhero&#8221; i snabbinfogaren s\u00e5 kommer redigeraren att f\u00f6resl\u00e5 Kinsta Academy-blocket:<\/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\u00f6ka efter ett block med hj\u00e4lp av ett nyckelord i snabbinfogaren.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">S\u00f6ka efter ett block med hj\u00e4lp av ett nyckelord i snabbinfogaren.<\/figcaption><\/figure>\n<h4>Lokalisering<\/h4>\n<p>Om du undrar hur lokaliseringen av str\u00e4ngarna i JSON-filen g\u00e5r till s\u00e5 kommer <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">svaret<\/a> h\u00e4r:<\/p>\n<blockquote><p><em>I JavaScript s\u00e5 kan du anv\u00e4nda metoden\u00a0<code>registerBlockTypeFromMetadata<\/code> fr\u00e5n paketet <code>@wordpress\/blocks<\/code> f\u00f6r att registrera en blocktyp med hj\u00e4lp av metadata som laddas fr\u00e5n filen <strong>block.json<\/strong>. Alla lokaliserade egenskaper blir automatiskt f\u00f6rpackade i <code>_x<\/code> (fr\u00e5n <code>@wordpress\/i18n<\/code> -paketet)-funktionsanropet p\u00e5 samma s\u00e4tt som det fungerar i PHP med <code>register_block_type_from_metadata<\/code>. Det enda kravet \u00e4r att st\u00e4lla in egenskapen <code>textdomain<\/code> i filen <strong>block.json<\/strong>.<\/em><\/p><\/blockquote>\n<p>H\u00e4r anv\u00e4nder vi funktionen <code>registerBlockType<\/code> i st\u00e4llet f\u00f6r <code>registerBlockTypeFromMetadata<\/code>, eftersom den senare <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">har blivit \u00f6verspelad<\/a> sedan <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a>, men mekanismen \u00e4r densamma.<\/p>\n<h3 id=\"using-richtext-component\">Anv\u00e4ndning av inbyggda komponenter: RichText-komponenten<\/h3>\n<p>De element som ing\u00e5r i ett Gutenberg-block \u00e4r React-komponenter, och du kan komma \u00e5t dessa komponenter via den globala variabeln <code>wp<\/code>. F\u00f6rs\u00f6k exempelvis att skriva <code>wp.editor<\/code> i webbl\u00e4sarens konsol. D\u00e5 f\u00e5r du en fullst\u00e4ndig lista \u00f6ver de komponenter som ing\u00e5r i modulen <code>wp.editor<\/code>.<br \/>\nBl\u00e4ddra igenom listan och gissa vad komponenterna \u00e4r avsedda f\u00f6r utifr\u00e5n deras namn.<br \/>\nP\u00e5 samma s\u00e4tt kan du kontrollera listan \u00f6ver de komponenter som ing\u00e5r i modulen <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-komponenter\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">WP-komponenter<\/figcaption><\/figure>\n<p class=\"p1\"><aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><b>Modul\u00e4r programmering<\/b> \u00e4r en teknik f\u00f6r programvarudesign som betonar att man separerar en applikations funktionalitet i oberoende, utbytbara <b>moduler<\/b>, s\u00e5 att varje modul inneh\u00e5ller allt som beh\u00f6vs f\u00f6r att utf\u00f6ra endast en aspekt av den \u00f6nskade funktionaliteten (k\u00e4lla: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\"><span class=\"s1\">Wikipedia<\/span><\/a>).<\/p>\n<\/aside>\n.<\/p>\n<p class=\"p1\">G\u00e5 nu tillbaka till filen <b>edit.js<\/b> och titta n\u00e4rmare p\u00e5 skriptet:<\/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() {\nreturn (\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>Den h\u00e4r koden genererar ett statiskt block med enkel, icke-redigerbar text. Men vi kan enkelt \u00e4ndra saker och ting:<\/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=\"Startblocket i kodredigeraren.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">Startblocket i kodredigeraren.<\/figcaption><\/figure>\n<p class=\"p1\">F\u00f6r att g\u00f6ra texten redigerbar m\u00e5ste du ers\u00e4tta den nuvarande &lt;p&gt; -taggen med en komponent som g\u00f6r det <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\"><span class=\"s1\">inmatade inneh\u00e5llet redigerbart<\/span><\/a>. F\u00f6r detta tillhandah\u00e5ller Gutenberg den inbyggda <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\"><span class=\"s1\">RichText-komponenten<\/span><\/a>.<\/p>\n<p class=\"p1\">Att l\u00e4gga till en inbyggd komponent i ditt block \u00e4r en process i fem steg:<\/p>\n<ol>\n<li><a href=\"#import-components\">Importera de n\u00f6dv\u00e4ndiga komponenterna fr\u00e5n ett WordPress-paket<\/a><\/li>\n<li><a href=\"#jsx-elements\">Inkludera motsvarande element i din JSX-kod.<\/a><\/li>\n<li><a href=\"#define-attributes\">Definiera de n\u00f6dv\u00e4ndiga attributen i filen block.json.<\/a><\/li>\n<li><a href=\"#define-event-handlers\">Definiera h\u00e4ndelsehanterare.<\/a><\/li>\n<li><a href=\"#save-data\">Spara data<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Steg 1: Importera de n\u00f6dv\u00e4ndiga komponenterna fr\u00e5n ett WordPress-paket<\/h4>\n<p>\u00d6ppna nu filen <strong>edit.js<\/strong> och \u00e4ndra f\u00f6ljande <code>import<\/code> -angivelse:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>&#8230;till:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>P\u00e5 detta s\u00e4tt importerar du funktionen <code>useBlockProps<\/code> och komponenten <code>RichText<\/code> fr\u00e5n paketet <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\"><code>useBlockProps<\/code><\/a> React hook markerar <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">blockets omslagselement<\/a>:<\/p>\n<blockquote><p><em>N\u00e4r du anv\u00e4nder API version 2 m\u00e5ste du anv\u00e4nda den nya <code>useBlockProps<\/code> -kroken i blockets <code>edit<\/code> -funktion f\u00f6r att markera blockets omslagselement. Haken infogar de attribut och h\u00e4ndelsestyrare som beh\u00f6vs f\u00f6r att aktivera blockets beteende. Alla attribut som du vill skicka till blockelementet m\u00e5ste skickas via <code>useBlockProps<\/code> och det returnerade v\u00e4rdet m\u00e5ste spridas till elementet.<\/em><\/p><\/blockquote>\n<p>Enkelt uttryckt tilldelar <code>useBlockProps<\/code> automatiskt attribut och klasser till omslagselementet ( <code>p<\/code> -elementet i v\u00e5rt exempel):<\/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=\"Element och klasser som genereras av useBlockProps.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Element och klasser som genereras av useBlockProps.<\/figcaption><\/figure>\n<p>Om du tar bort <code>useBlockProps<\/code> fr\u00e5n omslagselementet har du en enkel textstr\u00e4ng utan tillg\u00e5ng till blockfunktionalitet och 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=\"Samma block utan useBlockProps.\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">Samma block utan useBlockProps.<\/figcaption><\/figure>\n<p>Som vi <a href=\"#additional-improvements\">f\u00f6rklarar senare<\/a> kan du ocks\u00e5 skicka ett objekt med egenskaper till <code>useBlockProps<\/code> f\u00f6r att anpassa utmatningen.<\/p>\n<h5>RichText<\/h5>\n<p>RichText-komponenten ger en <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">inneh\u00e5llsanpassad<\/a> ing\u00e5ng, vilket g\u00f6r att anv\u00e4ndarna kan redigera och formatera inneh\u00e5llet.<\/p>\n<p>Du hittar komponenten dokumenterad 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\">Steg 2: Inkludera motsvarande element i din JSX-kod<\/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>L\u00e5t oss kommentera koden rad f\u00f6r rad:<\/p>\n<ul>\n<li><code>tagName<\/code> \u2014 Taggenamnet f\u00f6r det redigerbara HTML-elementet.<\/li>\n<li><code>onChange<\/code> \u2014 Funktion som anropas n\u00e4r elementets inneh\u00e5ll \u00e4ndras.<\/li>\n<li><code>allowedFormats<\/code> \u2014 En matris med till\u00e5tna format. Som standard \u00e4r alla format till\u00e5tna.<\/li>\n<li><code>value<\/code> \u2014 Den HTML-str\u00e4ng som ska g\u00f6ras redigerbar.<\/li>\n<li><code>placeholder<\/code> \u2014 Platsh\u00e5llartext som ska visas n\u00e4r elementet \u00e4r tomt.<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Steg 3: Definiera de n\u00f6dv\u00e4ndiga attributen i filen block.json<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Attribut<\/a> ger information om de data som lagras av ett block, t.ex. rikt inneh\u00e5ll, bakgrundsf\u00e4rg, URL:er osv.<\/p>\n<p>Du kan st\u00e4lla in ett godtyckligt antal attribut i ett <code>attributes<\/code> -objekt i nyckel\/v\u00e4rdepar, d\u00e4r nyckeln \u00e4r attributnamnet och v\u00e4rdet \u00e4r attributdefinitionen.<\/p>\n<p>\u00d6ppna nu filen <strong>block.json<\/strong> och l\u00e4gg till f\u00f6ljande <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>Med attributet <code>content<\/code> kan man lagra den text som anv\u00e4ndaren skriver i det redigerbara f\u00e4ltet:<\/p>\n<ul>\n<li><code>type<\/code> anger vilken typ av data som lagras i attributet. Typ kr\u00e4vs om du inte definierar en egenskap <code>enum<\/code>.<\/li>\n<li><code>source<\/code> definierar hur attributv\u00e4rdet extraheras fr\u00e5n inl\u00e4ggets inneh\u00e5ll. I v\u00e5rt exempel \u00e4r det HTML-inneh\u00e5llet. Observera att om du inte anger en egenskap f\u00f6r k\u00e4llan lagras data i blockavgr\u00e4nsaren (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">l\u00e4s mer<\/a>).<\/li>\n<li><code>selector<\/code> \u00e4r en HTML-tagg eller n\u00e5gon annan selektor, t.ex. ett klassnamn eller ett id-attribut.<\/li>\n<\/ul>\n<p>Vi skickar ett objekt med egenskaper till funktionen <code>Edit<\/code>. G\u00e5 tillbaka till filen <strong>edit.js<\/strong> och g\u00f6r f\u00f6ljande \u00e4ndring:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Steg 4: Definiera h\u00e4ndelsehanterare<\/h4>\n<p>Elementet <code>RichText<\/code> har ett <code>onChange<\/code> -attribut som ger en funktion som ska anropas n\u00e4r elementets inneh\u00e5ll \u00e4ndras.<\/p>\n<p>L\u00e5t oss definiera denna funktion och se hela <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>Spara nu filen och g\u00e5 tillbaka till din WordPress-instrumentpanel, skapa ett nytt inl\u00e4gg eller en ny sida och l\u00e4gg till ditt anpassade block:<\/p>\n<figure id=\"attachment_134001\" aria-describedby=\"caption-attachment-134001\" style=\"width: 2618px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134001\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/rich-text-component.jpg\" alt width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">Utmatningen av RichText-komponenten i Block Editor.<\/figcaption><\/figure>\n<p>L\u00e4gg till lite text och v\u00e4xla till kodvyn. S\u00e5 h\u00e4r b\u00f6r din kod se ut:<\/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 inneh\u00e5llet i ditt block \u00e4ndrats om du byter till kodredigeraren. Det beror p\u00e5 att du m\u00e5ste \u00e4ndra filen <strong>save.js<\/strong> f\u00f6r att lagra anv\u00e4ndarinmatningen i databasen n\u00e4r inl\u00e4gget sparas.<\/p>\n<h4 id=\"save-data\">Steg 5: Spara data<\/h4>\n<p>\u00d6ppna nu filen <strong>save.js<\/strong> och \u00e4ndra skriptet enligt f\u00f6ljande:<\/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 \u00e4r vad vi g\u00f6r h\u00e4r:<\/p>\n<ul>\n<li>Importera komponenten <code>RichText<\/code> fr\u00e5n paketet <code>block-editor<\/code>.<\/li>\n<li>Skicka flera egenskaper via ett objektargument till funktionen <code>save<\/code> (i det h\u00e4r exemplet skickar vi bara <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\">egenskapen<code>attributes<\/code><\/a>).<\/li>\n<li>\u00c5terge inneh\u00e5llet i 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>N\u00e4r du \u00e4ndrar sparfunktionen m\u00e5ste du ta bort alla blockinstanser i redigeringsduken och inkludera dem igen f\u00f6r att se att de fungerar korrekt. L\u00e4s mer om <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">blockvalidering<\/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=\"Blockets inneh\u00e5ll har sparats i databasen\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">Blockets inneh\u00e5ll har sparats i databasen<\/figcaption><\/figure>\n<p>Du kan l\u00e4sa mer om komponenten <code>RichText<\/code>\u00a0i <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Handboken f\u00f6r Blockredigeraren<\/a> och hitta den <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">fullst\u00e4ndiga listan \u00f6ver props p\u00e5 Github<\/a>.<\/p>\n<p>Nu ska vi ta det ett steg l\u00e4ngre. I n\u00e4sta avsnitt s\u00e5 l\u00e4r du dig hur du l\u00e4gger till kontroller i blockverktygsf\u00e4ltet.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">L\u00e4gga till kontroller till Blockverktygsf\u00e4ltet<\/h3>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">Blockverktygsf\u00e4ltet<\/a> inneh\u00e5ller en upps\u00e4ttning kontroller som g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndare att manipulera delar av blockinneh\u00e5llet. F\u00f6r varje kontroll i verktygsf\u00e4ltet s\u00e5 finns det 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=\"Det centrala verktygsf\u00e4ltet f\u00f6r block.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">Det centrala verktygsf\u00e4ltet f\u00f6r block.<\/figcaption><\/figure>\n<p>Du kan exempelvis l\u00e4gga till en kontroll f\u00f6r textjustering f\u00f6r ditt block. Allt som du beh\u00f6ver g\u00f6ra \u00e4r att importera tv\u00e5 komponenter fr\u00e5n paketet <code>@wordpress\/block-editor<\/code>.<\/p>\n<p>Vi g\u00e5r igenom samma steg som i det f\u00f6reg\u00e5ende exemplet:<\/p>\n<ol>\n<li>Importera n\u00f6dv\u00e4ndiga komponenter fr\u00e5n WordPress-paket<\/li>\n<li>Inkludera motsvarande element i din JSX-kod<\/li>\n<li>Definiera de n\u00f6dv\u00e4ndiga attributen i filen <strong>block.json<\/strong><\/li>\n<li>Definiera h\u00e4ndelsehanterare<\/li>\n<li>Spara data<\/li>\n<\/ol>\n<h4>Steg 1: Importera komponenterna BlockControls och AlignmentControl fr\u00e5n @wordpress\/block-editor<\/h4>\n<p>F\u00f6r att l\u00e4gga till en justeringskontroll i verktygsf\u00e4ltet f\u00f6r block s\u00e5 beh\u00f6ver du tv\u00e5 komponenter:<\/p>\n<ul>\n<li><code>BlockControls<\/code> visar ett dynamiskt verktygsf\u00e4lt med kontroller (odokumenterat).<\/li>\n<li><code>AlignmentControl<\/code> Renderar en rullgardinsmeny som visar justeringsalternativ f\u00f6r det valda blocket (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">l\u00e4s mer<\/a>).<\/li>\n<\/ul>\n<p>\u00d6ppna filen <strong>edit.js<\/strong> och redigera <code>import<\/code> -angivelsen enligt nedan:<\/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>Steg 2: L\u00e4gg till BlockControls och AlignmentControl-element<\/h4>\n<p>G\u00e5 till funktionen <code>Edit<\/code> och infoga elementet <code>&lt;BlockControls \/&gt;<\/code> p\u00e5 samma niv\u00e5 som <code>&lt;RichText \/&gt;<\/code>. L\u00e4gg sedan till\u00a0<code>&lt;AlignmentControl \/&gt;<\/code> inom <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 ovan \u00e4r <code>&lt;&gt;<\/code> och <code>&lt;\/&gt;<\/code> den korta syntaxen f\u00f6r att deklarera <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">React-fragment<\/a>, vilket \u00e4r hur vi returnerar flera element i React.<\/p>\n<p>I det h\u00e4r exemplet s\u00e5 har <code>AlignmentControl<\/code> tv\u00e5 attribut:<\/p>\n<ul>\n<li><code>value<\/code> ger det aktuella v\u00e4rdet f\u00f6r elementet<\/li>\n<li><code>onChange<\/code> tillhandah\u00e5ller en <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">h\u00e4ndelsehanterare<\/a> som ska k\u00f6ras n\u00e4r v\u00e4rdet \u00e4ndras<\/li>\n<\/ul>\n<p>Vi har \u00e4ven definierat ytterligare attribut f\u00f6r elementet <code>RichText<\/code> (se <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">hela listan \u00f6ver attribut med exempel<\/a>).<\/p>\n<h4>Steg 3: Definiera attributet align i block.json<\/h4>\n<p>G\u00e5 nu till filen <strong>block.json<\/strong> och l\u00e4gg till attributet <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\u00e4r du \u00e4r klar s\u00e5 g\u00e5r du tillbaka till blockredigeraren, uppdaterar sidan och v\u00e4ljer blocket. Du b\u00f6r se ett felmeddelande i blocket.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134008 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt=\"Blocket visar ett felmeddelande\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">Blocket visar ett felmeddelande<\/figcaption><\/figure>\n<p>Orsaken \u00e4r att vi \u00e4nnu inte har definierat v\u00e5r h\u00e4ndelsehanterare.<\/p>\n<h4>Steg 4: Definiera h\u00e4ndelsehanteraren<\/h4>\n<p>Definiera nu <code>onChangeAlign<\/code>:<\/p>\n<pre><code class=\"language-js\">const onChangeAlign = ( newAlign ) =&gt; {\n\tsetAttributes( { \n\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t} )\n}<\/code><\/pre>\n<p>Om <code>newAlign<\/code> \u00e4r <code>undefined<\/code>, s\u00e5 st\u00e4ller vi in <code>newAlign<\/code> till <code>none<\/code>. Annars s\u00e5 anv\u00e4nder vi <code>newAlign<\/code>.<\/p>\n<p>V\u00e5rt <strong>edit.js<\/strong>-skript borde vara f\u00e4rdigt (f\u00f6r tillf\u00e4llet):<\/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 tillbaka till redigeraren och anpassa blockets inneh\u00e5ll. Ditt block b\u00f6r nu stolt visa ett verktygsf\u00e4lt f\u00f6r justering.<\/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=\"V\u00e5rt block har nu ett verktygsf\u00e4lt f\u00f6r justering\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">V\u00e5rt block har nu ett verktygsf\u00e4lt f\u00f6r justering<\/figcaption><\/figure>\n<p>Men om du sparar inl\u00e4gget s\u00e5 kommer du att se att inneh\u00e5llet i ditt block inte \u00e4r justerat p\u00e5 frontend som det \u00e4r i blockredigeraren. Detta beror p\u00e5 att vi m\u00e5ste \u00e4ndra funktionen <code>save<\/code> f\u00f6r att lagra blockets inneh\u00e5ll och attribut i databasen.<\/p>\n<h4>Steg 5: Spara data<\/h4>\n<p>\u00d6ppna <strong>save.js<\/strong> och \u00e4ndra funktionen <code>save<\/code> p\u00e5 f\u00f6ljande s\u00e4tt:<\/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>F\u00f6r att g\u00f6ra koden mer l\u00e4ttl\u00e4st s\u00e5 kan du slutligen extrahera de enskilda egenskaperna fr\u00e5n <code>attribute<\/code> -objektet med hj\u00e4lp av <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">syntaxen f\u00f6r destructuring assignment<\/a>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Du kan g\u00f6ra samma sak i filen <strong>edit.js<\/strong>.<\/p>\n<p>Spara nu filen och v\u00e4xla till kodredigeraren. Blockkoden b\u00f6r se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/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=\"Kontroll av blockets verktygsf\u00e4lt\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">Kontroll av blockets verktygsf\u00e4lt<\/figcaption><\/figure>\n<p>Nu \u00e4r det klart! Du har just lagt till en justeringskontroll i blockets verktygsf\u00e4lt \ud83e\udd13.<\/p>\n<p>Du kan l\u00e4sa mer om <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">kontroller i verktygsf\u00e4ltet f\u00f6r block<\/a> i Handboken f\u00f6r Blockredigeraren.<\/p>\n<h3 id=\"settings-sidebar\">Anpassa sidof\u00e4ltet f\u00f6r blockinst\u00e4llningar<\/h3>\n<p>Du kan \u00e4ven l\u00e4gga till kontroller till blockets <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">inst\u00e4llningssidof\u00e4lt<\/a> (eller till och med skapa ett nytt sidof\u00e4lt f\u00f6r din applikation).<\/p>\n<p>API tillhandah\u00e5ller en <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\"><code>InspectorControls<\/code> -komponent<\/a> f\u00f6r detta.<\/p>\n<p>I Handboken f\u00f6r Blockredigeraren f\u00f6rklaras det\u00a0<a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">hur du anv\u00e4nder Inst\u00e4llningssidof\u00e4ltet<\/a>:<\/p>\n<blockquote><p><em>Inst\u00e4llningssidof\u00e4ltet anv\u00e4nds f\u00f6r att visa inst\u00e4llningar som anv\u00e4nds mindre ofta eller inst\u00e4llningar som kr\u00e4ver mer sk\u00e4rmutrymme. Inst\u00e4llningssidof\u00e4ltet b\u00f6r <strong>endast anv\u00e4ndas f\u00f6r inst\u00e4llningar p\u00e5 blockniv\u00e5<\/strong><\/em>.<\/p>\n<p><em>Om du har inst\u00e4llningar som endast p\u00e5verkar valt inneh\u00e5ll i ett block (t.ex. inst\u00e4llningen &#8221;fet&#8221; f\u00f6r vald text i ett stycke): <\/em>placera den inte i Inst\u00e4llningssidof\u00e4ltet.<em>\u00a0Detta sidof\u00e4lt visas \u00e4ven n\u00e4r du redigerar ett block i HTML-l\u00e4ge, s\u00e5 det b\u00f6r endast inneh\u00e5lla inst\u00e4llningar p\u00e5 blockniv\u00e5.<\/em><\/p><\/blockquote>\n<p>\u00c5terigen:<\/p>\n<ol>\n<li>Importera n\u00f6dv\u00e4ndiga komponenter fr\u00e5n WordPress-paket<\/li>\n<li>Inkludera motsvarande element i din JSX-kod<\/li>\n<li>Definiera de n\u00f6dv\u00e4ndiga attributen i filen block.json<\/li>\n<li>Definiera h\u00e4ndelsehanterare<\/li>\n<li>Spara data<\/li>\n<\/ol>\n<h4>Steg 1. Importera komponenterna InspectorControls och PanelColorSettings fr\u00e5n @wordpress\/block-editor<\/h4>\n<p>Du kan l\u00e4gga till flera kontroller s\u00e5 att anv\u00e4ndarna kan anpassa specifika aspekter av blocket. Du kan exempelvis tillhandah\u00e5lla en f\u00e4rgkontrollpanel. F\u00f6r att g\u00f6ra detta s\u00e5 m\u00e5ste du importera komponenterna <code>InspectorControls<\/code> och <code>PanelColorSettings<\/code> fr\u00e5n modulen <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>Steg 2: Inkludera motsvarande element i din JSX-kod<\/h4>\n<p>Nu kan du l\u00e4gga till motsvarande element i den JSX som returneras av funktionen <code>Edit<\/code>:<\/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>Observera att vi \u00e4ven har uppdaterat attributet <code>style<\/code> i elementet <code>RichText<\/code>:<\/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>Steg 3: Definiera de n\u00f6dv\u00e4ndiga attributen i block.json<\/h4>\n<p>Definiera nu attributen <code>backgroundColor<\/code> och <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>Steg 4: Definiera h\u00e4ndelsehanterare<\/h4>\n<p>Nu m\u00e5ste du definiera tv\u00e5 funktioner f\u00f6r att uppdatera <code>backgroundColor<\/code> och <code>textColor<\/code> vid anv\u00e4ndarinmatning:<\/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>Steg 5: Spara data<\/h4>\n<p>Ett sista steg: \u00d6ppna filen <strong>save.js<\/strong> och \u00e4ndra skriptet p\u00e5 f\u00f6ljande s\u00e4tt:<\/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>Spara filen och kontrollera blocket i redigeraren. Du kanske hittar en ov\u00e4lkommen \u00f6verraskning: ett felmeddelande som talar om att blocket inneh\u00e5ller ov\u00e4ntat eller ogiltigt inneh\u00e5ll.<\/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=\"Felmeddelande om ov\u00e4ntat eller ogiltigt inneh\u00e5ll\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Felmeddelande om ov\u00e4ntat eller ogiltigt inneh\u00e5ll<\/figcaption><\/figure>\n<p>Detta sker eftersom filen <strong>save.js<\/strong> \u00e4ndras och den kod som sparas i databasen inte st\u00e4mmer \u00f6verens med den kod som anv\u00e4nds i redigeraren.<\/p>\n<p>F\u00f6r att \u00e5tg\u00e4rda detta s\u00e5 uppdaterar du sidan, tar bort alla exempel p\u00e5 ditt block och l\u00e4gger till det igen i ditt inl\u00e4gg:<\/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=\"Panelen f\u00f6r f\u00e4rginst\u00e4llningar i sidof\u00e4ltet f\u00f6r blockinst\u00e4llningar\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">Panelen f\u00f6r f\u00e4rginst\u00e4llningar i sidof\u00e4ltet f\u00f6r blockinst\u00e4llningar<\/figcaption><\/figure>\n<p>G\u00f6r dina \u00e4ndringar, spara inl\u00e4gget och visa det p\u00e5 frontend. Nu b\u00f6r de \u00e4ndringar som du har gjort i blockredigeraren \u00e5terspeglas p\u00e5 frontend.<\/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=\"Det anpassade blocket fungerar nu korrekt p\u00e5 frontend\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">Det anpassade blocket fungerar nu korrekt p\u00e5 frontend<\/figcaption><\/figure>\n<h3 id=\"external-link\">L\u00e4gga till och anpassa en extern l\u00e4nk<\/h3>\n<p>I det h\u00e4r avsnittet s\u00e5 l\u00e4gger du till nya komponenter till din blocktyp:<\/p>\n<ul>\n<li>En <code>ExternalLink<\/code> -komponent som g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndare att l\u00e4gga till en anpassningsbar l\u00e4nk till ditt anpassade block.<\/li>\n<li>Flera kontroller i sidof\u00e4ltet som g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndare att anpassa l\u00e4nkinst\u00e4llningarna.<\/li>\n<\/ul>\n<h4>Steg 1. Importera komponenter fr\u00e5n @wordpress\/components<\/h4>\n<p>Nu m\u00e5ste du importera flera komponenter fr\u00e5n <code>@wordpress\/components<\/code>. \u00d6ppna din edit.js-fil och l\u00e4gg till f\u00f6ljande <code>import<\/code> -meddelande:<\/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> l\u00e4gger till en ihopf\u00e4llbar container till inst\u00e4llningssidof\u00e4ltet.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> Producerar en generisk container f\u00f6r sidobarkontroller.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> ger en textinmatningskontroll.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> ger en v\u00e4xel som g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndare att aktivera\/avaktivera ett visst alternativ.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> \u00e4r en enkel komponent f\u00f6r att l\u00e4gga till en extern l\u00e4nk.<\/li>\n<\/ul>\n<h4>Steg 2. Inkludera motsvarande element i din JSX-kod<\/h4>\n<p>F\u00f6rst s\u00e5 l\u00e4gger du till <code>ExternalLink<\/code> -elementet p\u00e5 samma niv\u00e5 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>Komponenten <code>ExternalLink<\/code> \u00e4r inte dokumenterad, s\u00e5 vi h\u00e4nvisar till <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">sj\u00e4lva komponenten<\/a> f\u00f6r att f\u00e5 en lista \u00f6ver tillg\u00e4ngliga attribut. H\u00e4r s\u00e5 anv\u00e4nder vi attributen <code>href<\/code>, <code>className<\/code> och <code>rel<\/code>.<\/p>\n<p>Som standard s\u00e5 \u00e4r v\u00e4rdet f\u00f6r attributet <code>rel<\/code> inst\u00e4llt p\u00e5 <code>noopener noreferrer<\/code>. V\u00e5r kod kommer att l\u00e4gga till <a href=\"https:\/\/kinsta.com\/se\/blog\/lagg-till-nofollow-lankar-i-wordpress\/\">nyckelordet<code>nofollow<\/code> <\/a> till attributet <code>rel<\/code> i den resulterande <code>a<\/code> -taggen n\u00e4r v\u00e4xelkontrollen \u00e4r <strong>aktiverad<\/strong>.<\/p>\n<p>Nu kan du l\u00e4gga till l\u00e4nkinst\u00e4llningar i blockets sidof\u00e4lt.<\/p>\n<p>F\u00f6rst s\u00e5 l\u00e4gger du till ett <code>PanelBody<\/code> -element inuti <code>InspectorControls<\/code> p\u00e5 samma niv\u00e5 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>S\u00e5 h\u00e4r g\u00f6r vi med detta:<\/p>\n<ol>\n<li>Attributet <code>title<\/code> anger panelens titel.<\/li>\n<li><code>initialOpen<\/code> anger om panelen \u00e4r \u00f6ppen fr\u00e5n b\u00f6rjan eller inte.<\/li>\n<\/ol>\n<p>D\u00e4refter s\u00e5 l\u00e4gger vi till tv\u00e5 <code>PanelRow<\/code> -element i <code>PanelBody<\/code> och ett <code>TextControl<\/code> -element i varje <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>Koden ovan b\u00f6r nu se ganska enkel ut. De tv\u00e5 textkontrollerna g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndaren att st\u00e4lla in l\u00e4nketikett och webbadress.<\/p>\n<p>Vi l\u00e4gger \u00e4ven till ytterligare en <code>PanelRow<\/code> med <code>ToggleControl<\/code> f\u00f6r att sl\u00e5 p\u00e5\/av ett visst alternativ, t.ex. om ett attribut ska inkluderas eller inte:<\/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>Steg 3: Definiera de n\u00f6dv\u00e4ndiga attributen i block.json<\/h4>\n<p>Definiera nu attributen <code>kaLink<\/code>, <code>linkLabel<\/code> och <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>Inget mer att till\u00e4gga h\u00e4r! L\u00e5t oss g\u00e5 vidare till att definiera <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">funktionerna f\u00f6r hantering av h\u00e4ndelser<\/a>.<\/p>\n<h4>Steg 4: Definiera Funktionerna f\u00f6r hantering av h\u00e4ndelser<\/h4>\n<p>G\u00e5 tillbaka till filen <strong>edit.js<\/strong>, l\u00e4gg till de nya attributen till attributobjektet och l\u00e4gg till f\u00f6ljande 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>Dessa funktioner uppdaterar motsvarande attributv\u00e4rden vid anv\u00e4ndarinmatning.<\/p>\n<h4>Steg 5: Spara data<\/h4>\n<p>Till sist s\u00e5 m\u00e5ste vi uppdatera 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>Observera att vi h\u00e4r har anv\u00e4nt ett vanligt <code>a<\/code> -element i st\u00e4llet f\u00f6r <code>ExternalLink<\/code>.<\/p>\n<p>Du kan se resultatet i bilden nedan.<\/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=\"Panelen f\u00f6r l\u00e4nkinst\u00e4llningar i sidof\u00e4ltet f\u00f6r blockinst\u00e4llningar\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">Panelen f\u00f6r l\u00e4nkinst\u00e4llningar i sidof\u00e4ltet f\u00f6r blockinst\u00e4llningar<\/figcaption><\/figure>\n<h3 id=\"multiple-block-styles\">L\u00e4gga till flera blockstyper<\/h3>\n<p>I ett tidigare avsnitt s\u00e5 l\u00e4rde du dig hur du l\u00e4gger till en blockverktygsbalkskontroll som g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndare att justera anv\u00e4ndarinmatningen. Vi kan l\u00e4gga till fler stilkontroller till blockverktygsf\u00e4ltet, men vi kan \u00e4ven tillhandah\u00e5lla en upps\u00e4ttning f\u00f6rdefinierade blockstilar som anv\u00e4ndaren kan v\u00e4lja mellan med ett enda klick.<\/p>\n<p>F\u00f6r detta \u00e4ndam\u00e5l s\u00e5 kommer vi att anv\u00e4nda en anv\u00e4ndbar funktion i Block API: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Blockformat<\/a>.<\/p>\n<p>Allt som du beh\u00f6ver g\u00f6ra \u00e4r att definiera egenskapen <strong>block.json<\/strong> <code>styles<\/code> och deklarera motsvarande stilar i dina formatmallar.<\/p>\n<p>Du kan exempelvis l\u00e4gga till f\u00f6ljande array av stilar:<\/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>Med detta s\u00e5 har du bara lagt till en standardstil och en ytterligare stil som heter <code>border<\/code>. G\u00e5 nu tillbaka till blockredigeraren:<\/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=\"Tv\u00e5 f\u00f6rbyggda blockstilar.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Tv\u00e5 f\u00f6rbyggda blockstilar.<\/figcaption><\/figure>\n<p>Stilarna kommer att vara tillg\u00e4ngliga f\u00f6r anv\u00e4ndaren genom att den klickar p\u00e5 <a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-5-8\/#normalized-block-toolbars\">blockv\u00e4xlaren<\/a> och sedan letar efter <strong>panelen Stilar<\/strong> i <strong>sidof\u00e4ltet f\u00f6r blockinst\u00e4llningar<\/strong>.<\/p>\n<p>V\u00e4lj en stil och kontrollera de klasser som till\u00e4mpas p\u00e5 elementet <code>p<\/code>. H\u00f6gerklicka p\u00e5 blocket och <strong>inspektera<\/strong>. En ny klass har lagts till med ett namn som \u00e4r strukturerat p\u00e5 f\u00f6ljande s\u00e4tt:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Om du har markerat stilen &#8221;Border&#8221; s\u00e5 l\u00e4ggs klassen\u00a0<code>is-style-border<\/code> till i elementet <code>p<\/code>. Om du har markerat stilen &#8221;Default&#8221; s\u00e5 kommer klassen\u00a0<code>is-style-default<\/code> att l\u00e4ggas till i st\u00e4llet.<\/p>\n<p>Nu beh\u00f6ver du bara deklarera CSS-egenskaperna. \u00d6ppna filen <strong>editor.scss<\/strong> och ers\u00e4tt de nuvarande stilarna med f\u00f6ljande:<\/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\u00f6ra samma sak med <strong>style.scss<\/strong>. Som vi n\u00e4mnde ovan s\u00e5 till\u00e4mpas stilar som definieras i <strong>style.scss<\/strong> b\u00e5de p\u00e5 frontend och i redigeraren:<\/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>Och det \u00e4r allt! Uppdatera sidan och ha kul med dina nya blockformatmallar:<\/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=\"J\u00e4mf\u00f6relse av blockformat\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">J\u00e4mf\u00f6relse av blockformat<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">B\u00e4dda in Gutenberg Block med InnerBlocks-komponenten<\/h3>\n<p>\u00c4ven om v\u00e5rt anpassade block \u00e4r fullt fungerande s\u00e5 \u00e4r det fortfarande inte s\u00e4rskilt tilltalande. F\u00f6r att g\u00f6ra det mer engagerande f\u00f6r publiken s\u00e5 kan vi l\u00e4gga till en bild.<\/p>\n<p>Detta kan l\u00e4gga till ett lager av komplexitet till v\u00e5rt block, men som tur \u00e4r s\u00e5 beh\u00f6ver du inte uppfinna hjulet p\u00e5 nytt. Gutenberg tillhandah\u00e5ller n\u00e4mligen en specifik komponent som du kan anv\u00e4nda f\u00f6r att skapa en struktur av <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">inb\u00e4ddade block<\/a>.<\/p>\n<p>Komponenten <code>InnerBlocks<\/code> <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">definieras p\u00e5 f\u00f6ljande s\u00e4tt<\/a>:<\/p>\n<blockquote><p><em><code>InnerBlocks<\/code> exporterar ett par komponenter som kan anv\u00e4ndas i blockimplementationer f\u00f6r att m\u00f6jligg\u00f6ra inb\u00e4ddat blockinneh\u00e5ll.<\/em><\/p><\/blockquote>\n<p>F\u00f6rst s\u00e5 m\u00e5ste du skapa en ny <strong>.js<\/strong>-fil i mappen <strong>src<\/strong>. I v\u00e5rt exempel s\u00e5 kallar vi filen <strong>container.js<\/strong>.<\/p>\n<p>Nu m\u00e5ste du importera den nya resursen till filen <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>G\u00e5 tillbaka till <strong>container.js<\/strong> och importera de n\u00f6dv\u00e4ndiga komponenterna:<\/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>N\u00e4sta steg \u00e4r att definiera en mall som ger den struktur i vilken blocken kommer att placeras. I f\u00f6ljande exempel s\u00e5 definierar vi en mall som best\u00e5r av tv\u00e5 kolumner som inneh\u00e5ller en k\u00e4rnblocksbild och v\u00e5rt anpassade block:<\/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>Mallen \u00e4r strukturerad som en <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">array av blockTyper<\/a> (blocknamn och valfria attribut).<\/p>\n<p>I koden ovan s\u00e5 anv\u00e4nde vi flera attribut f\u00f6r att konfigurera blocken Kolumner och Kolumn. S\u00e4rskilt attributet <code>templateLock: 'all'<\/code> l\u00e5ser Kolumn-blocken s\u00e5 att anv\u00e4ndaren inte kan l\u00e4gga till, \u00e4ndra eller ta bort befintliga block. <code>templateLock<\/code> kan ha ett av f\u00f6ljande v\u00e4rden:<\/p>\n<ul>\n<li><code>all<\/code> \u2014 <code>InnerBlocks<\/code> \u00e4r l\u00e5st, och inga block kan l\u00e4ggas till, ordnas om eller tas bort.<\/li>\n<li><code>insert<\/code> \u2014 Blocken kan endast omordnas eller tas bort.<\/li>\n<li><code>false<\/code> \u2014 Mallen \u00e4r inte l\u00e5st.<\/li>\n<\/ul>\n<p>Mallen tilldelas sedan elementet <code>InnerBlocks<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>F\u00f6r att f\u00f6rhindra kompatibilitetsproblem s\u00e5 har vi \u00e4ven lagt till attributet\u00a0<code>templateLock<\/code> till <code>InnerBlocks<\/code> -elementet (se \u00e4ven \u00e4rende #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> och pull #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>H\u00e4r \u00e4r v\u00e5r slutliga <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=\"Det slutgiltiga blocket i blockredigeraren\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">Det slutgiltiga blocket i blockredigeraren<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Ytterligare f\u00f6rb\u00e4ttringar<\/h3>\n<p>V\u00e5rt block \u00e4r fullt fungerande, men vi kan f\u00f6rb\u00e4ttra det ytterligare med n\u00e5gra sm\u00e5 \u00e4ndringar.<\/p>\n<p>Vi tilldelade attributet <code>backgroundColor<\/code> till stycket som genereras av komponenten <code>RichText<\/code>. Vi kanske f\u00f6redrar att tilldela bakgrundsf\u00e4rgen till containern\u00a0<code>div<\/code>:<\/p>\n<p>\u00c4ndra d\u00e4rf\u00f6r filen <strong>edit.js<\/strong> och <strong>save.js<\/strong> <code>div<\/code>s p\u00e5 f\u00f6ljande s\u00e4tt:<\/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>Detta g\u00f6r det m\u00f6jligt f\u00f6r anv\u00e4ndaren att \u00e4ndra bakgrundsf\u00e4rgen f\u00f6r hela blocket.<\/p>\n<p>En mer relevant \u00e4ndring g\u00e4ller d\u00e4remot metoden <code>useBlockProps<\/code>. I den ursprungliga koden s\u00e5 definierade vi konstanten <code>blockProps<\/code> p\u00e5 f\u00f6ljande s\u00e4tt:<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Men vi kan anv\u00e4nda <code>useBlockProps<\/code> mer effektivt <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">genom att skicka en upps\u00e4ttning egenskaper<\/a>. Vi kan exempelvis importera <code>classnames<\/code> fr\u00e5n modulen <code>classnames<\/code> och st\u00e4lla in namnet p\u00e5 wrapperklassen i enlighet med detta.<\/p>\n<p>I f\u00f6ljande exempel s\u00e5 tilldelar vi ett klassnamn baserat p\u00e5 v\u00e4rdet av attributet <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 g\u00f6r samma \u00e4ndring 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>Och det \u00e4r klart! Du kan nu <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">k\u00f6ra byggnaden f\u00f6r produktion<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Sammanfattning<\/h2>\n<p>Och nu har vi kommit till slutet av denna otroliga resa! Vi b\u00f6rjade med konfigurationen av utvecklingsmilj\u00f6n och slutade med att skapa en komplett blocktyp.<\/p>\n<p>Som vi n\u00e4mnde i inledningen s\u00e5 \u00e4r en gedigen kunskap om Node.js, Webpack, Babel och React n\u00f6dv\u00e4ndig f\u00f6r att skapa avancerade Gutenbergblock och positionera dig p\u00e5 marknaden som en professionell Gutenbergutvecklare.<\/p>\n<p>Men du beh\u00f6ver dock inte ha etablerad React-erfarenhet f\u00f6r att b\u00f6rja ha kul med blockutveckling. Blockutveckling kan ge dig motivation och m\u00e5l att skaffa dig allt bredare f\u00e4rdigheter i teknikerna bakom Gutenbergblock.<\/p>\n<p>Den h\u00e4r guiden \u00e4r d\u00e4rf\u00f6r l\u00e5ngt ifr\u00e5n komplett. Den \u00e4r endast en introduktion till en m\u00e4ngd olika \u00e4mnen som hj\u00e4lper dig att komma ig\u00e5ng med att bygga dina allra f\u00f6rsta Gutenbergblock.<\/p>\n<p>D\u00e4rf\u00f6r s\u00e5 rekommenderar vi att du f\u00f6rdjupar dina kunskaper genom att noggrant l\u00e4sa dokumentation och guider online. Bland de m\u00e5nga resurser som finns d\u00e4r ute s\u00e5 rekommenderar vi f\u00f6ljande:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Officiell handledning f\u00f6r nyb\u00f6rjare om att skapa ett block<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Officiell blockhandledning<\/a> f\u00f6r avancerade utvecklare<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Dynamiska block<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/dynamic-blocks\/\">Hur man skapar dynamiska block f\u00f6r Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Meta-rutor<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Skapa ett sidof\u00e4lt f\u00f6r ditt plugin<\/a><\/li>\n<\/ul>\n<p>Om du precis har b\u00f6rjat med WordPress-utveckling s\u00e5 kanske du vill f\u00f6rst\u00e5 de grundl\u00e4ggande begreppen f\u00f6r frontend-utveckling. H\u00e4r \u00e4r en snabb lista \u00f6ver resurser som kan hj\u00e4lpa dig att komma ig\u00e5ng:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/se\/ebooks\/wordpress\/wordpress-lokal-utveckling\/\">Hur man installerar WordPress lokalt<\/a> (kostnadsfri e-bok)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/se\/ebooks\/wordpress\/hanterad-wordpress-hosting\/\">Det verkliga v\u00e4rdet av Hanterad WordPress Hosting<\/a> (kostnadsfri e-bok)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/what-is-javascript\/\">Vad \u00e4r JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/se\/blog\/html-vs-html5\/\">HTML och HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/se\/blog\/wordpress-css\/\">Hur man redigerar CSS i WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/se\/blog\/vad-ar-php\/\">Vad \u00e4r PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/se\/blog\/wordpresskrokar\/\">WordPress Krok Bootcamp: Hur man anv\u00e4nder \u00e5tg\u00e4rder, filter och anpassade krokar<\/a><\/li>\n<\/ul>\n<p>Kom ih\u00e5g att den fullst\u00e4ndiga koden f\u00f6r exemplen i den h\u00e4r guiden <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">finns tillg\u00e4nglig p\u00e5 Gist<\/a>.<\/p>\n<p>Nu \u00e4r det din tur: Har du utvecklat n\u00e5gra Gutenbergblock? Vilka \u00e4r de st\u00f6rsta sv\u00e5righeterna som du har upplevt hittills? Ber\u00e4tta om dina erfarenheter i kommentarerna!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>M\u00e5nga klagar p\u00e5 att det \u00e4r sv\u00e5rt att komma ig\u00e5ng med att bygga Gutenbergblock och appar. Inl\u00e4rningskurvan \u00e4r brant, fr\u00e4mst p\u00e5 grund av sv\u00e5righeten att installera &#8230;<\/p>\n","protected":false},"author":36,"featured_media":46338,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[441,323,37],"topic":[],"class_list":["post-46337","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg"],"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>Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block<\/title>\n<meta name=\"description\" content=\"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.\" \/>\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\/se\/blog\/gutenberg-block\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block\" \/>\n<meta property=\"og:description\" content=\"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstasweden\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-29T14:26:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-08T08:32:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/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=\"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_se\" \/>\n<meta name=\"twitter:label1\" content=\"Skriven av\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data2\" content=\"49 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block\",\"datePublished\":\"2022-11-29T14:26:21+00:00\",\"dateModified\":\"2023-06-08T08:32:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/\"},\"wordCount\":8878,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/\",\"url\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/\",\"name\":\"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"datePublished\":\"2022-11-29T14:26:21+00:00\",\"dateModified\":\"2023-06-08T08:32:18+00:00\",\"description\":\"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/se\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/se\/#website\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/se\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/se\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstasweden\/\",\"https:\/\/x.com\/kinsta_se\",\"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\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block","description":"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.","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\/se\/blog\/gutenberg-block\/","og_locale":"sv_SE","og_type":"article","og_title":"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block","og_description":"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.","og_url":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstasweden\/","article_published_time":"2022-11-29T14:26:21+00:00","article_modified_time":"2023-06-08T08:32:18+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.","twitter_image":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_se","twitter_misc":{"Skriven av":"Carlo Daniele","Ber\u00e4knad l\u00e4stid":"49 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block","datePublished":"2022-11-29T14:26:21+00:00","dateModified":"2023-06-08T08:32:18+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/"},"wordCount":8878,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png","keywords":["Block Editor","development","Gutenberg"],"inLanguage":"sv-SE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/","url":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/","name":"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png","datePublished":"2022-11-29T14:26:21+00:00","dateModified":"2023-06-08T08:32:18+00:00","description":"Att bygga Gutenberg-block kan verka skr\u00e4mmande till en b\u00f6rjan. Men det \u00e4r det inte! Denna djupg\u00e5ende guide visar dig hur du skapar ditt f\u00f6rsta WP-block.","breadcrumb":{"@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#primaryimage","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/10\/Gutenberg-blocks_Blog_cover.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/se\/blog\/gutenberg-block\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/se\/"},{"@type":"ListItem","position":2,"name":"Bygga anpassade Gutenbergblock: Den slutgiltiga handledningen f\u00f6r utveckling av block"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/se\/#website","url":"https:\/\/kinsta.com\/se\/","name":"Kinsta\u00ae","description":"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar","publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/se\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/se\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstasweden\/","https:\/\/x.com\/kinsta_se","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\/se\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/46337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/comments?post=46337"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/46337\/revisions"}],"predecessor-version":[{"id":53538,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/46337\/revisions\/53538"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/translations\/se"},{"href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/46337\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media\/46338"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media?parent=46337"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/tags?post=46337"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/topic?post=46337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}