{"id":233672,"date":"2023-02-20T09:52:00","date_gmt":"2023-02-20T06:52:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233672"},"modified":"2023-02-26T12:25:48","modified_gmt":"2023-02-26T09:25:48","slug":"laegg-till-anpassade-instaellningar-till-befintliga-wordpress-gutenberg-block","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/laegg-till-anpassade-instaellningar-till-befintliga-wordpress-gutenberg-block\/","title":{"rendered":"L\u00e4gg till anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block"},"content":{"rendered":"\n<p>Har du n\u00e5gonsin hamnat i situationen d\u00e4r du vill l\u00e4gga till dina anpassade inst\u00e4llningar i WordPress Gutenberg-block? I det h\u00e4r inl\u00e4gget kommer vi att g\u00e5 in i detalj p\u00e5 hur man g\u00f6r det. Du hittar tv\u00e5 exempelkoder p\u00e5 verkliga anv\u00e4ndningsfall f\u00f6r att l\u00e4gga till anpassade inst\u00e4llningar till WordPress-block.<\/p>\n<p>T\u00e4nk p\u00e5 att eftersom Gutenberg-blocken \u00e4r Javascript kr\u00e4ver \u00e4ndring av dem att du skriver koden i Javascript. Precis som WordPress PHP-kod har krokar och filter som g\u00f6r att tema- eller plugin-utvecklare kan modifiera sin kod, finns det \u00e4ven filter i WordPress Javascript-kod. P\u00e5 samma s\u00e4tt som PHPs <code>[add_filter](https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/)()<\/code>funktion har vi Javascript-funktionen <code>[addFilter](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-hooks\/#api-usage)()<\/code>.<\/p>\n<p>Jag kommer att skriva koden i Javascript ES6-syntax, vilket kr\u00e4ver en kompilator f\u00f6r att transformera den. Du kan skriva i ES5-syntax men jag rekommenderar att du g\u00e5r f\u00f6r ES6\/ESNext. Jag har ett <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/komplett-guide-foer-att-skapa-en-utvecklingsmiljoe-foer-gutenberg\/\" title=\"inl\u00e4gg som f\u00f6rklarar hur man st\u00e4ller in en transformator f\u00f6r ES6\/ESNext\">inl\u00e4gg som f\u00f6rklarar hur man st\u00e4ller in en transformator f\u00f6r ES6\/ESNext<\/a>. Jag antar ocks\u00e5 att du har en viss f\u00f6rtrogenhet med React\/JSX, m\u00f6jligen viss erfarenhet av <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-skapar-ett-anpassat-wordpress-gutenberg-block-tutorial-serien\/\" title=\"hur du skapar dina egna anpassade Gutenberg-block\">hur du skapar dina egna anpassade Gutenberg-block<\/a>.<\/p>\n<h2>Vad du kan filtrera p\u00e5 Gutenberg-block<\/h2>\n<p>Det finns inte mycket dokumentation i tillg\u00e4ngliga Gutenberg-krokar och filter. Men i syfte att l\u00e4gga till anpassade inst\u00e4llningar och p\u00e5 n\u00e5got s\u00e4tt till\u00e4mpa dem p\u00e5 befintliga block; det h\u00e4r \u00e4r vad jag har hittat hittills. Jag har fokuserat p\u00e5 att l\u00e4gga till enkla inst\u00e4llningar \u2013 inte operationer som kr\u00e4ver drastiska komponent\u00e4ndringar eller komplext beteende.<\/p>\n<p>Det finns tre steg f\u00f6r att l\u00e4gga till anpassade inst\u00e4llningar till befintliga block:<\/p>\n<ul>\n<li>Vi l\u00e4gger till ett filter p\u00e5 befintliga blocks <code>[registerBlockType](https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-registration\/#registerblocktype)<\/code>inst\u00e4llningar. Detta till\u00e5ter oss att l\u00e4gga till nya attribut till <code>attributes<\/code>arrayen, vilket g\u00f6r att vi kan spara ytterligare information i blocket. Vi m\u00e5ste spara v\u00e5r anpassade inst\u00e4llning n\u00e5gonstans.<\/li>\n<li>Haka fast p\u00e5 blockets <code>edit<\/code>komponent (komponenten som ansvarar f\u00f6r att rendera blocket i editorn). I denna krok kan vi haka p\u00e5 Inspector (sidof\u00e4ltet) och l\u00e4gga till v\u00e5ra egna komponenter. Vi kan antingen l\u00e4gga till en ny sektion\/panel, eller s\u00e5 kan vi haka p\u00e5 avsnittet &quot;Avancerat&quot; som alltid finns i alla block. Sedan \u00e4r det upp till oss att rendera inst\u00e4llningsing\u00e5ngar, s\u00e5som textinmatningar, kryssrutor eller vad som helst.<\/li>\n<li>Filtrera blockets <code>save<\/code>rekvisita. Vi kan justera rekvisitan f\u00f6r spara, som \u00e4r ansvarig f\u00f6r att b\u00e5de spara blocket och rendera det i frontend (utanf\u00f6r editorn). I v\u00e5rt fall vill vi l\u00e4gga till en klass eller inline-stil.<\/li>\n<\/ul>\n<p>Vi kan rikta in oss p\u00e5 specifika block eller rikta in oss p\u00e5 alla. Vi har alltid tillg\u00e5ng till vilken typ av block vi befinner oss p\u00e5.<\/p>\n<p>F\u00f6r att s\u00e4ga det med andra ord: Vi l\u00e4gger till n\u00e5gra anpassade inst\u00e4llningar i Inspector och sparar det i anpassade attribut som vi har lagt till i blocket. Vi kan sedan p\u00e5verka blockets klassnamn eller inline-stil (i vissa fall), beroende p\u00e5 de sparade attributen. Med de anpassade klassnamnen kan vi enkelt l\u00e4gga till anpassad CSS som visuellt ger v\u00e5ra inst\u00e4llningar en effekt.<\/p>\n<h2>Vad kan vi inte g\u00f6ra (f\u00f6r nu?)<\/h2>\n<p>Tyv\u00e4rr finns det vissa saker vi inte kan komma \u00e5t med filter p\u00e5 befintliga block. N\u00e4r det g\u00e4ller att l\u00e4gga till enkla anpassade inst\u00e4llningar till block \u00e4r dessa vanliga saker vi inte kan p\u00e5verka.<\/p>\n<h3>Ingen \u00e5tkomst till blockets inline-stil i editorn<\/h3>\n<p>I kommande fall av inst\u00e4llningar som p\u00e5verkar ett blocks design m\u00e5ste vi l\u00e4gga till inline-stil p\u00e5 blockets omslutningsnod. Bara klassnamn duger inte. Om du till exempel l\u00e4gger till en anpassad f\u00e4rginst\u00e4llning och anv\u00e4ndaren v\u00e4ljer en anpassad f\u00e4rg (fr\u00e5n colorpicker), kan du inte l\u00f6sa detta genom att l\u00e4gga till en klass \u2013 du beh\u00f6ver inline stil.<\/p>\n<p>Tyv\u00e4rr verkar det som att WordPresss standardblock hanterar inline-stil i editor helt oberoende utan m\u00f6jlighet att filtrera eller &quot;haka in&quot;. Jag kommer att visa ett s\u00e4tt att kringg\u00e5 detta i det sista exemplet nedan, men det \u00e4r inte idealiskt i alla fall.<\/p>\n<p>Varf\u00f6r bry sig om att blocket ser annorlunda ut i editor kontra frontend, kanske du fr\u00e5gar? Hela po\u00e4ngen med Gutenberg \u00e4r att implementera ett visuellt s\u00e4tt att redigera inneh\u00e5ll d\u00e4r det vi ser faktiskt \u00e4r vad vi f\u00e5r. Vi vill uppn\u00e5 samma visuella utseende b\u00e5de i editor och frontend.<\/p>\n<h3>Vissa block inkluderar inte klassnamn i editorn<\/h3>\n<p>Som n\u00e4mnts ovan kan vi filtrera blockets inpackningsklassnamn eftersom detta \u00e4r en rekvisita som skickas till alla Gutenberg-block. Men tyv\u00e4rr finns det n\u00e5gra block som inte till\u00e4mpar blockets klass alls i <code>edit<\/code>. Ett exempel \u00e4r t\u00e4ckblocket. Jag har lekt runt mycket med att anv\u00e4nda omslagsblock som &quot;sektioner&quot; f\u00f6r f\u00f6rstasidor och st\u00f6ter p\u00e5 problem eftersom omslagsblocket bygger sin egen klass inuti <code>edit<\/code>. Den hoppar helt \u00f6ver blockets &quot;globala&quot; klass (som \u00e4r den vi har tillg\u00e5ng till via filter).<\/p>\n<p>Men vi kan \u00e5tminstone vara s\u00e4kra p\u00e5 att filtrerade klassnamn alltid till\u00e4mpas i <code>save<\/code>(frontend). Detta sker automatiskt utanf\u00f6r varje blocks specifika kod.<\/p>\n<p>Om jag har fel om n\u00e5got av ovanst\u00e5ende, V\u00e4nligen meddela mig i kommentarerna nedan! Jag l\u00e4r mig st\u00e4ndigt Gutenberg, och samtidigt utvecklas Gutenberg ocks\u00e5. Jag hoppas n\u00e5gon g\u00e5ng ovanst\u00e5ende kommer att vara m\u00f6jligt n\u00e5gon g\u00e5ng eller att det \u00e4r m\u00f6jligt men jag saknar bara lite viktig information!<\/p>\n<p>Med det ur v\u00e4gen, l\u00e5t oss b\u00f6rja titta p\u00e5 lite kod.<\/p>\n<h2>Exempel 1: L\u00e4gg till ett v\u00e4xlingsf\u00e4lt f\u00f6r att d\u00f6lja ett t\u00e4ckblock p\u00e5 mobilen<\/h2>\n<p>L\u00e5t oss anta att vi utvecklar ett tema d\u00e4r omslagsblock kommer att anv\u00e4ndas f\u00f6r &quot;sektioner&quot; p\u00e5 f\u00f6rstasidan. Och vi vill ge anv\u00e4ndaren en m\u00f6jlighet att d\u00f6lja en viss sektion fr\u00e5n mobilen. F\u00f6r att l\u00f6sa detta kan vi l\u00e4gga till ett v\u00e4xlingsf\u00e4lt i avsnittet &quot;Avancerat&quot; i Cover blocks Inspector. Om f\u00e4ltet \u00e4r aktiverat kommer Cover-blocket att f\u00e5 en extra anpassad klass som vi kan rikta in oss p\u00e5 med CSS och mediafr\u00e5gor.<\/p>\n<p>F\u00f6rresten: Detta \u00e4r ett fall d\u00e4r problemet med Cover block inte till\u00e4mpar v\u00e5ra anpassade klassnamn i editorn faktiskt \u00e4r en f\u00f6rdel! T\u00e4nk om det gjorde det; d\u00e5 skulle det vara om\u00f6jligt f\u00f6r anv\u00e4ndaren att redigera blocket i editorn om han eller hon har en liten sk\u00e4rm!<\/p>\n<p>Som n\u00e4mnts tidigare finns det tre steg vi beh\u00f6ver koda f\u00f6r. Vi m\u00e5ste ocks\u00e5 l\u00e4gga till lite PHP f\u00f6r att k\u00f6a v\u00e5r Javascript-fil till redigeraren. L\u00e5t oss g\u00f6ra det f\u00f6rst.<\/p>\n<h3>L\u00e4gger till v\u00e5rt manus i editorn<\/h3>\n<p>Vi kopplar en funktion till handlingen <code>[enqueue_block_editor_assets](https:\/\/developer.wordpress.org\/reference\/hooks\/enqueue_block_editor_assets\/)<\/code>. Inuti v\u00e5r funktion k\u00f6ar vi ett script, precis som vi brukar g\u00f6ra i <code>wp_enqueue_scripts<\/code>hook.<\/p>\n<pre><code>add_action('enqueue_block_editor_assets', function() {\n    wp_enqueue_script('awp-gutenberg-filters', get_template_directory_uri(). '\/assets\/js\/gutenberg-filters.js', ['wp-edit-post']);\n});<\/code><\/pre>\n<p>Kom ih\u00e5g att justera s\u00f6kv\u00e4gen till var ditt manus \u00e4r! Obs: Om du skriver i ES6 med webbpaket som kompilerar ditt Javascript, kom ih\u00e5g att st\u00e4lla in s\u00f6kv\u00e4gen till byggandet av ditt skript, inte k\u00e4llan.<\/p>\n<p>Jag gillar att l\u00e4gga till &#8217; <code>wp-edit-post<\/code>&#8217; som ett beroende till skriptet f\u00f6r att s\u00e4kerst\u00e4lla att det laddas tillr\u00e4ckligt sent.<\/p>\n<p>Det \u00e4r allt PHP vi beh\u00f6ver g\u00f6ra. Resten skrivs i v\u00e5r Javascript-fil.<\/p>\n<h3>L\u00e4gg till ett anpassat attribut<\/h3>\n<p>Det f\u00f6rsta filtret vi kommer att anv\u00e4nda \u00e4r <code>blocks.registerBlockType<\/code>vilka filters <code>registerBlockType<\/code>inst\u00e4llningsobjekt.<\/p>\n<p>Men f\u00f6rst lite om att l\u00e4gga till filter i Javascript. Eftersom jag inte hittat n\u00e5gon bra dokumentation f\u00f6r detta s\u00e5 ska jag f\u00f6rklara det lite h\u00e4r. Funktionen <code>addFilter<\/code>finns i <code>wp.hooks<\/code>namnutrymmet och accepterar fyra argument.<\/p>\n<p><code>addFilter('hookName', 'namespace', 'functionName', 'priority');<\/code><\/p>\n<p>Den f\u00f6rsta parametern, &#8217;hookName&#8217;, \u00e4r namnet p\u00e5 filtret vi vill haka p\u00e5. Detta motsvarar den f\u00f6rsta parametern n\u00e4r du anv\u00e4nder PHP:s <code>add_filter()<\/code>. Den andra parametern, &#8217;namespace&#8217;, \u00e4r ett anpassat namnomr\u00e5de f\u00f6r din kod. Detta \u00e4r bara f\u00f6r att undvika namnkollision. Du kan i stort sett st\u00e4lla in vad du vill h\u00e4r, anv\u00e4nd bara inte WordPress namnutrymme (&#8217;wp&#8217;). Anv\u00e4nd en kort form av ditt namn eller projektnamn. Den tredje parametern, &#8217;functionName&#8217;, \u00e4r den kopplade funktionen \u2013 vilket \u00e4r samma som PHP: <code>add_filter()<\/code>s andra argument. Och slutligen \u00e4r den fj\u00e4rde parametern, &#8217;prioritet&#8217;, valfri. \u00c5terigen, detta \u00e4r detsamma som PHPs <code>add_filter()<\/code>tredje argument.<\/p>\n<p>Processen f\u00f6r filter i Javascript \u00e4r densamma som i PHP. Vi definierar en funktion som beh\u00f6ver returnera den filtrerade variabeln. Ibland \u00e4r variabeln en str\u00e4ng, ett objekt eller en komponent. Inuti funktionen modifierar vi variabeln som vi tycker passar.<\/p>\n<p>I v\u00e5rt fall vill vi l\u00e4gga till ett nytt attribut till blockets <code>attribute<\/code>objekt. Vi anropar det nya attributet <code>hideOnMobile<\/code>och st\u00e4ller in dess typ till <code>boolean<\/code>. Detta g\u00f6rs s\u00e5 h\u00e4r:<\/p>\n<pre><code>function addCoverAttribute(settings, name) {\n    if (typeof settings.attributes !== 'undefined') {\n        if (name == 'core\/cover') {\n            settings.attributes = Object.assign(settings.attributes, {\n                hideOnMobile: {\n                    type: 'boolean',\n                }\n            });\n        }\n    }\n    return settings;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.registerBlockType',\n    'awp\/cover-custom-attribute',\n    addCoverAttribute\n);<\/code><\/pre>\n<p>P\u00e5 linjen <code>#3<\/code>ser vi till att endast rikta oss mot block av typen &#8217; <code>core\/cover<\/code>&#8217;. Det andra argumentet att <code>blocks.registerBlockType<\/code>filtrera \u00e4r l\u00e4mpligt nog blockets namn. Vi l\u00e4gger sedan till ett nytt objektobjekt till <code>settings.attributes<\/code>objektet. Slutligen ser vi till att returnera den filtrerade variabeln, <code>settings<\/code>.<\/p>\n<p>Vid denna tidpunkt har ingenting f\u00f6r\u00e4ndrats visuellt i Gutenberg. Men alla t\u00e4ckblock har nu ytterligare ett attribut som vi kan anv\u00e4nda f\u00f6r att lagra v\u00e5r inst\u00e4llning.<\/p>\n<h3>L\u00e4gg till inst\u00e4llning i Inspector (avancerad panel)<\/h3>\n<p>Det andra filtret anropas <code>editor.BlockEdit<\/code>och filtrerar blockets <code>edit<\/code>komponent. Detta filter tar emot det ursprungliga blockets <code>BlockEdit<\/code>komponent och returnerar en ny inpackad komponent. Vi m\u00e5ste anv\u00e4nda <code>wp.compose.createHigherOrderComponent<\/code>f\u00f6r att returnera den inslagna komponenten.<\/p>\n<p>Inuti v\u00e5r komponent ser vi till att g\u00f6ra den inslagna komponenten <code>BlockEdit<\/code>, oavsett. Men om blocket \u00e4r av typen Cover s\u00e5 hakar vi \u00e4ven fast p\u00e5 komponenten <code>InspectorAdvancedControls<\/code>(som \u00e4r panelen &quot;Advanced&quot; i Inspector) och l\u00e4gger till en <code>ToggleControl<\/code>. Vi skriver f\u00f6r <code>ToggleControl<\/code>att visa v\u00e4rdet p\u00e5 och uppdatera det anpassade attributet som vi lade till tidigare, <code>hideOnMobile<\/code>.<\/p>\n<pre><code>const coverAdvancedControls = wp.compose.createHigherOrderComponent((BlockEdit) =&gt; {\n    return (props) =&gt; {\n        const { Fragment } = wp.element;\n        const { ToggleControl } = wp.components;\n        const { InspectorAdvancedControls } = wp.blockEditor;\n        const { attributes, setAttributes, isSelected } = props;\n        return (&lt;Fragment&gt;\n                &lt;BlockEdit {...props} \/&gt;\n                {isSelected &amp;&amp; (props.name == 'core\/cover') &amp;&amp; \n                    &lt;InspectorAdvancedControls&gt;\n                        &lt;ToggleControl\n                            label={wp.i18n.__('Hide on mobile', 'awp')}\n                            checked={!!attributes.hideOnMobile}\n                            onChange={(newval) =&gt; setAttributes({ hideOnMobile: !attributes.hideOnMobile })}\n                        \/&gt;\n                    &lt;\/InspectorAdvancedControls&gt;\n                }\n            &lt;\/Fragment&gt;\n        );\n    };\n}, 'coverAdvancedControls');\n\u00a0\nwp.hooks.addFilter(\n    'editor.BlockEdit',\n    'awp\/cover-advanced-control',\n    coverAdvancedControls\n);<\/code><\/pre>\n<p>Gl\u00f6m inte att alltid l\u00e4mna tillbaka originalet <code>BlockEdit<\/code>, vilket vi g\u00f6r p\u00e5 linjen <code>#9<\/code>. P\u00e5 rad #10 kontrollerar vi om blockets typ \u00e4r Cover, och renderar <code>InspectorAdvancedControls<\/code>komponenten. Inuti h\u00e4r l\u00e4gger vi till en <code>ToggleControl<\/code>, som \u00e4r en ing\u00e5ngskontroll som visas som en v\u00e4xling mellan sant eller falskt. Vi s\u00e4tter en etikett och kopplar dess v\u00e4rde till <code>hideOnMobile<\/code>attributet. Om du har lagt till inst\u00e4llningar i Inspector tidigare borde detta vara ganska enkelt f\u00f6r dig.<\/p>\n<p>Med ovanst\u00e5ende kod b\u00f6r vi nu f\u00e5 detta inuti panelen &quot;Avancerat&quot; i Inspector on Cover blocks:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70271f5a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70271f5a.png\" alt=\"L\u00e4gg till anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block\"><\/a><\/p>\n<p>Inmatningen kommer nu att uppdatera v\u00e5rt anpassade attribut <code>hideOnMobile<\/code>. Det sista steget \u00e4r att g\u00f6ra n\u00e5got beroende p\u00e5 v\u00e4rdet av detta attribut. Fr\u00e5n och med nu \u00e4r attributet sparat, men det p\u00e5verkar faktiskt ingenting.<\/p>\n<h3>L\u00e4gg till en anpassad klass<\/h3>\n<p>Det sista steget \u00e4r att l\u00e4gga till en anpassad klass i blockets klass. Vi g\u00f6r detta med filtret <code>blocks.getSaveContent.extraProps<\/code>. Detta filter p\u00e5verkar rekvisitan till blockets <code>save<\/code>komponent. En av dem \u00e4r propen <code>className<\/code>, som alltid kommer att till\u00e4mpas p\u00e5 frontend. Vi l\u00e4gger helt enkelt till v\u00e5r anpassade klass efter den om attributet var <code>true<\/code>, och returnerar den sedan. Jag har best\u00e4mt mig f\u00f6r att l\u00e4gga till en klass &#8217; <code>hide-on-mobile<\/code>&#8217;, men du kan kalla den vad du vill.<\/p>\n<pre><code>function coverApplyExtraClass(extraProps, blockType, attributes) {\n    const { hideOnMobile } = attributes;\n\u00a0\n    if (typeof hideOnMobile !== 'undefined' &amp;&amp; hideOnMobile) {\n        extraProps.className = extraProps.className + ' hide-on-mobile';\n    }\n    return extraProps;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.getSaveContent.extraProps',\n    'awp\/cover-apply-class',\n    coverApplyExtraClass\n);<\/code><\/pre>\n<p>Den h\u00e4r koden \u00e4r ganska sj\u00e4lvf\u00f6rklarande. P\u00e5 raden <code>#4<\/code>kontrollerar vi om attributet <code>hideOnMobile<\/code>finns och \u00e4r <code>true<\/code>. Om s\u00e5 \u00e4r fallet l\u00e4gger vi till en anpassad klass till <code>className<\/code>str\u00e4ngen.<\/p>\n<p>Med alla ovanst\u00e5ende tre filter b\u00f6r vi nu f\u00e5 en anpassad klass &quot;g\u00f6m-p\u00e5-mobil&quot; applicerad p\u00e5 v\u00e5rt Cover-block n\u00e4rhelst inst\u00e4llningen \u00e4r aktiverad.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70343817.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70343817.png\" alt=\"L\u00e4gg till anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block\"><\/a><\/p>\n<p>Allt som \u00e5terst\u00e5r \u00e4r att l\u00e4gga till lite CSS till ditt temas frontend-stilmall. N\u00e5got som det h\u00e4r;<\/p>\n<pre><code>.wp-block-cover.hide-on-mobile { display: none; }\n@media (min-width: 480px) {\n    .wp-block-cover.hide-on-mobile { display: block; }\n}<\/code><\/pre>\n<h2>Exempel 2: L\u00e4gg till Inspector-panel med anpassad bakgrundsf\u00e4rgsinst\u00e4llning f\u00f6r Spacer-block<\/h2>\n<p>F\u00f6r det andra anv\u00e4ndningsfallet vill vi l\u00e4gga till anpassade f\u00e4rginst\u00e4llningar till Spacer-blocket. Som standard har Spacer-blocket inga andra inst\u00e4llningar \u00e4n dess h\u00f6jd. L\u00e5t oss anta att vi vill l\u00e4gga till en bakgrundsf\u00e4rg som f\u00e4rgar Spacer-blockets fulla h\u00f6jd. Det g\u00f6r att anv\u00e4ndaren kan l\u00e4gga till tomma, f\u00e4rgade &quot;r\u00e4nder&quot; i sitt inneh\u00e5ll. I det h\u00e4r fallet vill vi l\u00e4gga till f\u00e4rginst\u00e4llningarna i sin egen separata panel i Inspector, enligt vanligt f\u00f6rv\u00e4ntat beteende f\u00f6r f\u00e4rginst\u00e4llningar.<\/p>\n<p>Obs: Att hantera f\u00e4rger \u00e4r lite mer komplicerat eftersom vi beh\u00f6ver anv\u00e4nda en (annan) h\u00f6gre ordningskomponent <code>withColors<\/code>. Eftersom vi redan beh\u00f6ver implementera en h\u00f6gre ordningskomponent i <code>editor.BlockEdit<\/code>vi beh\u00f6ver <code>compose<\/code>flera komponenter. Dessutom m\u00e5ste vi l\u00e4gga till tv\u00e5 attribut f\u00f6r varje f\u00e4rginst\u00e4llning. En kommer att inneh\u00e5lla f\u00e4rgpalettens slug, och den andra kommer att inneh\u00e5lla hex-f\u00e4rgkoden \u2013 endast om anv\u00e4ndaren har valt en anpassad f\u00e4rg (anv\u00e4nt colorpicker). Allt detta \u00e4r vanligt beteende n\u00e4r man arbetar med <code>withColors<\/code>. Jag har ett &lt;a href=&quot;https:\/\/wordpress.mediadoma.com\/sv\/hur-man-laegger-till-faerginstaellningar-i-ditt-anpassade-gutenberg-block\/&quot; title=&quot;inl\u00e4gg som f\u00f6rklarar att l\u00e4gga till f\u00e4rginst\u00e4llningar och <code>withColors<\/code>i detalj&#8221; &gt;inl\u00e4gg som f\u00f6rklarar att l\u00e4gga till f\u00e4rginst\u00e4llningar och <code>withColors<\/code>i detalj<\/a> om du blir f\u00f6rvirrad.<\/p>\n<p>F\u00f6r det andra kommer vi i detta fall att st\u00f6ta p\u00e5 problemet som f\u00f6rklaras ovan; d\u00e4r vi inte kan l\u00e4gga till l\u00e4mplig inline-stil till redigeraren. L\u00f6sningen jag har valt i det h\u00e4r fallet \u00e4r att linda Spacer-blocket inuti a <code>div<\/code>i editorn och till\u00e4mpa r\u00e4tt klasser och inline-stil p\u00e5 omslaget <code>div<\/code>. Detta g\u00f6r den valda f\u00e4rgen synlig i editorn n\u00e4r blocket \u00e4r avmarkerat. N\u00e4r du v\u00e4ljer blocket l\u00e4gger WordPress dock till sin egen anpassade ljusgr\u00e5 bakgrund till blocket, som t\u00e4cker v\u00e5r anpassade bakgrundsf\u00e4rg. En CSS till editorn kommer att fixa detta. Jag ska f\u00f6rklara mer i slutet.<\/p>\n<p>Stegen \u00e4r desamma som exemplet ovan. Vi k\u00f6ar v\u00e5rt skript till editorn i PHP f\u00f6rst. Sedan i Javascript filtrerar vi <code>attributes<\/code>objektet, Spacers <code>edit<\/code>komponent och slutligen Spacers <code>save<\/code>komponent.<\/p>\n<h3>L\u00e4gger till v\u00e5rt manus i editorn<\/h3>\n<p>Vi kopplar en funktion till handlingen <code>[enqueue_block_editor_assets](https:\/\/developer.wordpress.org\/reference\/hooks\/enqueue_block_editor_assets\/)<\/code>. Inuti v\u00e5r funktion k\u00f6ar vi ett script, precis som vi brukar g\u00f6ra i <code>wp_enqueue_scripts<\/code>hook.<\/p>\n<pre><code>add_action('enqueue_block_editor_assets', function() {\n    wp_enqueue_script('awp-gutenberg-filters', get_template_directory_uri(). '\/assets\/js\/gutenberg-filters.js', ['wp-edit-post']);\n});<\/code><\/pre>\n<p>Kom ih\u00e5g att justera s\u00f6kv\u00e4gen till ditt skript. Jag gillar att l\u00e4gga till &#8217; <code>wp-edit-post<\/code>&#8217; som ett beroende till skriptet f\u00f6r att s\u00e4kerst\u00e4lla att det laddas tillr\u00e4ckligt sent.<\/p>\n<p>Det \u00e4r allt PHP vi beh\u00f6ver g\u00f6ra. Resten skrivs i v\u00e5r Javascript-fil.<\/p>\n<h3>L\u00e4gg till anpassade attribut<\/h3>\n<p>Som i exemplet ovan l\u00e4gger vi till ett filter <code>blocks.registerBlockType<\/code>f\u00f6r att l\u00e4gga till ytterligare objektobjekt till blockets <code>attributes<\/code>objekt.<\/p>\n<p>N\u00e4r vi arbetar med <code>withColors<\/code>m\u00e5ste vi l\u00e4gga till tv\u00e5 attribut f\u00f6r varje f\u00e4rg. Namnet p\u00e5 v\u00e5rt bakgrundsf\u00e4rgattribut \u00e4r <code>backgroundColor<\/code>, vilket betyder att det andra attributet m\u00e5ste namnges <code>customBackgroundColor<\/code>. Allt detta f\u00f6rklaras i <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-laegger-till-faerginstaellningar-i-ditt-anpassade-gutenberg-block\/\" title=\"mitt inl\u00e4gg om hantering av f\u00e4rginst\u00e4llningar i Gutenberg\">mitt inl\u00e4gg om hantering av f\u00e4rginst\u00e4llningar i Gutenberg<\/a>. B\u00e5da b\u00f6r vara av typen string och endast till\u00e4mpas p\u00e5 block av typen Spacer.<\/p>\n<pre><code>function addSpacerAttributes(settings, name) {\n    if (typeof settings.attributes !== 'undefined') {\n        if (name == 'core\/spacer') {\n            settings.attributes = Object.assign(settings.attributes, {\n                backgroundColor: {\n                    type: 'string',\n                },\n                customBackgroundColor: {\n                    type: 'string'\n                }\n            });\n        }\n    }\n    return settings;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.registerBlockType',\n    'awp\/spacer-background-attribute',\n    addSpacerAttributes\n);<\/code><\/pre>\n<h3>L\u00e4gg till panelen ColorSettings i Inspector<\/h3>\n<p>Det andra steget \u00e4r att l\u00e4gga till en f\u00e4rginst\u00e4llningspanel i Inspector f\u00f6r Spacer-blocket genom att filtrera <code>editor.BlockEdit<\/code>.<\/p>\n<pre><code>const spacerInspectorControls = wp.compose.compose(\n    wp.blockEditor.withColors({backgroundColor: 'background-color'}),\n\u00a0\n    wp.compose.createHigherOrderComponent((BlockEdit) =&gt; {\n        return (props) =&gt; {\n\u00a0\n            if (props.name !== 'core\/spacer') {\n                return(&lt;BlockEdit {...props} \/&gt;);\n            }\n\u00a0\n            const { Fragment } = wp.element;\n            const { InspectorControls, PanelColorSettings } = wp.blockEditor;\n            const { attributes, setAttributes, isSelected } = props;\n            const { backgroundColor, setBackgroundColor } = props;\n\u00a0\n            let newClassName = (attributes.className != undefined)? attributes.className: '';\n            let newStyles = {...props.style};\n            if (backgroundColor != undefined) {\n                if (backgroundColor.class == undefined) {\n                    newStyles.backgroundColor = backgroundColor.color;\n                } else {\n                    newClassName += ' ' + backgroundColor.class;\n                }\n            }\n            const newProps = {\n                ...props,\n                attributes: {\n                    ...attributes,\n                    className: newClassName\n                },\n                style: newStyles\n            }\n\u00a0\n            return (&lt;Fragment&gt;\n                    &lt;div style={newStyles} className={newClassName}&gt;\n                        &lt;BlockEdit {...newProps} \/&gt;\n                        {isSelected &amp;&amp; (props.name == 'core\/spacer') &amp;&amp; \n                            &lt;InspectorControls&gt;\n                                &lt;PanelColorSettings \n                                    title={wp.i18n.__('Color Settings', 'awp')}\n                                    colorSettings={[\n                                        {\n                                            value: backgroundColor.color,\n                                            onChange: setBackgroundColor,\n                                            label: wp.i18n.__('Background color', 'awp')\n                                        }\n                                    ]}\n                                \/&gt;\n                            &lt;\/InspectorControls&gt;\n                        }\n                    &lt;\/div&gt;\n                &lt;\/Fragment&gt;\n            );\n        };\n}, 'spacerInspectorControls'));\n\u00a0\nwp.hooks.addFilter(\n    'editor.BlockEdit',\n    'awp\/spacer-inspector-control',\n    spacerInspectorControls\n);<\/code><\/pre>\n<p>Vi m\u00e5ste anv\u00e4nda <code>compose<\/code>f\u00f6r att kombinera den h\u00f6gre ordningens komponent som returneras fr\u00e5n detta filter och <code>withColors<\/code>. Med andra ord, vi lindar helt enkelt den returnerade komponenten i <code>withColors<\/code>. Som parameter <code>withColors<\/code>tillhandah\u00e5ller vi v\u00e5rt attribut <code>backgroundColor<\/code>.<\/p>\n<p>Inuti den lindade komponenten ser vi till att alltid \u00e5terv\u00e4nda <code>BlockEdit<\/code>(linje <code>#9<\/code>och <code>#39<\/code>f\u00f6r Spacer-block). F\u00f6r block av typen Spacer hakar vi \u00e4ven p\u00e5 <code>InspectorControls<\/code>f\u00f6r att l\u00e4gga till en <code>PanelColorSettings<\/code>f\u00f6r v\u00e5rt f\u00e4rgval. Detta \u00e4r standardproceduren f\u00f6r att l\u00e4gga till f\u00e4rginst\u00e4llningar.<\/p>\n<p>P\u00e5 line <code>#17 - 34<\/code>genererar vi manuellt den n\u00f6dv\u00e4ndiga klassen och\/eller inline-stilen. Sedan <code>#38<\/code>l\u00e4gger vi till en omslutande div <code>BlockEdit<\/code>med dessa klasser och inline-stilar.<\/p>\n<p>Resultatet \u00e4r en ny f\u00e4rginst\u00e4llningspanel i Inspector f\u00f6r Spacer-block, fullt fungerande.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7041a66b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7041a66b.png\" alt=\"L\u00e4gg till anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block\"><\/a><\/p>\n<p>Att v\u00e4lja en palettf\u00e4rg eller en anpassad f\u00e4rg kommer verkligen att p\u00e5verkas i omslutnings-div i editorn. Men du kan bara se det n\u00e4r du avmarkerar Spacer-blocket!<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7052e0c9.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7052e0c9.gif\" alt=\"L\u00e4gg till anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block\"><\/a><\/p>\n<p>Detta beror p\u00e5 att WordPress anv\u00e4nder sin egen styling n\u00e4r man v\u00e4ljer ett spacerblock. Vi kommer att fixa det i slutet, f\u00f6rst beh\u00f6ver vi bara till\u00e4mpa samma klass och\/eller inline-stil i frontend ocks\u00e5.<\/p>\n<h3>L\u00e4gg till anpassad klass och inline-stil f\u00f6r att spara<\/h3>\n<p>Slutligen m\u00e5ste vi filtrera <code>blocks.getSaveContent.extraProps<\/code>och till\u00e4mpa n\u00f6dv\u00e4ndig klass och\/eller inline-styling f\u00f6r frontend. \u00c5terigen \u00e4r detta v\u00e4ldigt likt det vi gjorde i exempel 1 ovan. Om en palettf\u00e4rg har valts m\u00e5ste vi l\u00e4gga till ett klassnamn som f\u00f6ljer WordPresss standarder f\u00f6r f\u00e4rginst\u00e4llningar (&quot; <code>has-&lt;PALETTESLUG&gt;-background-color<\/code>&quot;). Om en anpassad f\u00e4rg valdes m\u00e5ste vi l\u00e4gga till inline-stil med hex-f\u00e4rgen.<\/p>\n<p>Obs: Om du beh\u00f6ver hantera klassnamn mycket rekommenderar jag att du importerar <code>classnames<\/code>biblioteket. Detta anv\u00e4nds flitigt i Gutenberg eftersom det f\u00f6renklar inst\u00e4llningen av de korrekta klassnamnen med en hel del. Koden nedan antar att du inte har det och komponerar klassnamnet manuellt.<\/p>\n<pre><code>function applySpacerBackground(props, blockType, attributes) {\n    if (blockType.name == 'core\/spacer') {\n        const { backgroundColor, customBackgroundColor } = attributes;\n\u00a0\n        \/\/ For improved class name handling, use classnames library. Or do it manually like..\n        let className = (props.className != undefined)? props.className: '';\n        if (backgroundColor != undefined) {\n            className += ' has-' + backgroundColor + '-background-color';\n        }\n        props.className = className;\n        if (customBackgroundColor != undefined) {\n            Object.assign(props, { style: { ...props.style, backgroundColor: customBackgroundColor }});\n        }\n    }\n    return props;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.getSaveContent.extraProps',\n    'awp\/spacer-apply-class',\n    applySpacerBackground\n);<\/code><\/pre>\n<p>Med ovanst\u00e5ende kod kommer frontend nu perfekt att \u00e5terge Spacer-block med v\u00e5rt anpassade f\u00e4rgval!<\/p>\n<p>Den sista (valfria) fixen \u00e4r att l\u00e4gga till lite CSS till redigeraren. Du m\u00e5ste antingen l\u00e4gga till inline CSS eller en redigeringsformatmall. Till exempel kan du st\u00e4lla en stilmall i samma PHP-hook som vi anv\u00e4nde f\u00f6r att k\u00f6a v\u00e5r Javascript-fil. Jag kommer inte att g\u00e5 in p\u00e5 detaljer om hur man g\u00f6r detta; men CSS du beh\u00f6ver \u00e4r n\u00e5got i stil med nedan. Allt den g\u00f6r \u00e4r att st\u00e4lla in Spacers <code>background-color<\/code>till den \u00e4rvda f\u00e4rgen (den kommer att \u00e4rva fr\u00e5n v\u00e5r omslags-div) n\u00e4r blocket v\u00e4ljs:<\/p>\n<pre><code>.block-library-spacer__resize-container.is-selected { \n    background-color: inherit; \n}<\/code><\/pre>\n<p>PS: T\u00e4nk p\u00e5 att detta kan komma att \u00e4ndras i framtiden. Gutenberg \u00e4r fortfarande starkt under utveckling.<\/p>\n<h2>Slutsats<\/h2>\n<p>I det h\u00e4r inl\u00e4gget har vi l\u00e4rt oss tv\u00e5 metoder f\u00f6r att implementera anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block. Det \u00e4r fullt m\u00f6jligt f\u00f6r enkla inst\u00e4llningar som kanske bara kr\u00e4ver en klass eller inline-styling. Vi har tittat p\u00e5 varningarna, som jag hoppas kommer att \u00e5tg\u00e4rdas i senare Gutenberg-versioner!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I det h\u00e4r inl\u00e4gget kommer vi att g\u00e5 in i detalj p\u00e5 hur du l\u00e4gger till dina anpassade inst\u00e4llningar till befintliga WordPress Gutenberg-block med tv\u00e5 exempelkoder p\u00e5 verkliga anv\u00e4ndningsfall.<\/p>\n","protected":false},"author":1,"featured_media":152422,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,724,838,942,942,848,901,1110,838,848,724,868,868],"tags":[1173],"class_list":{"0":"post-233672","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koda","8":"category-utvecklaren","9":"category-guide-foer-nyboerjare","10":"category-gutenberg-9","12":"category-handledningar","14":"category-n-a","18":"category-wordpress-9","20":"tag-affiai-sv"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233672"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233672\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/152422"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}