{"id":233918,"date":"2023-02-26T18:29:00","date_gmt":"2023-02-26T15:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233918"},"modified":"2022-11-11T13:11:39","modified_gmt":"2022-11-11T10:11:39","slug":"skapa-och-haemta-anpassade-rest-slutpunkter-i-gutenberg-block","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skapa-och-haemta-anpassade-rest-slutpunkter-i-gutenberg-block\/","title":{"rendered":"Skapa och h\u00e4mta anpassade REST-slutpunkter i Gutenberg-block"},"content":{"rendered":"\n<p>I det h\u00e4r inl\u00e4gget ska jag f\u00f6rs\u00f6ka skapa en \u00f6versikt \u00f6ver hur man skapar anpassade REST API-slutpunkter och utf\u00f6r f\u00f6rfr\u00e5gningar f\u00f6r dem i ett anpassat Gutenberg-block. Det vill s\u00e4ga att g\u00f6ra f\u00f6rfr\u00e5gningar med <code>fetch<\/code>metoder f\u00f6r information som inte finns i WordPress registrerade datalager.<\/p>\n<p>En v\u00e4nlig p\u00e5minnelse: den mesta grundl\u00e4ggande informationen finns redan i WordPress datalager. Till exempel \u00e4r grundl\u00e4ggande f\u00f6rfr\u00e5gningar av inl\u00e4gg, sidor, anpassade inl\u00e4ggstyper, taxonomier, f\u00f6rfattare, media och mer tillg\u00e4ngliga i befintligt skick utan att beh\u00f6va skapa dina egna anpassade slutpunkter. F\u00f6r att komma \u00e5t dessa butiker anv\u00e4nder du hellre WordPress k\u00e4rndatamodul (<code>withSelect<\/code>och <code>select()<\/code>). Nedan finns en handledningsdel som g\u00e5r p\u00e5 djupet om hur man g\u00f6r det.<\/p>\n<h2>WordPress REST API<\/h2>\n<p>Om du inte redan visste; WordPress REST API \u00e4r ett JSON-gr\u00e4nssnitt f\u00f6r att skicka och ta emot data fr\u00e5n din WordPress-webbplats. Den kan anv\u00e4ndas externt eller internt. Med Gutenberg-redigeraren och bytet till Javascript har anv\u00e4ndningen av REST API definitivt \u00f6kat. WordPress REST API har en hel massa slutpunkter som vi kan anv\u00e4nda. Se en <a href=\"https:\/\/developer.wordpress.org\/rest-api\/reference\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fullst\u00e4ndig referens om alla REST API-slutpunkter h\u00e4r<\/a>. Du hittar till exempel slutpunkter f\u00f6r inl\u00e4gg och det mesta annat internt inneh\u00e5ll \u2013 b\u00e5de f\u00f6r l\u00e4sning och uppdatering. Tema- eller plugin-utvecklare kan registrera sina egna anpassade slutpunkter.<\/p>\n<p>Din WordPress-webbplats har en root REST API URL, som standard finns p\u00e5 <code>&lt;your domain&gt;\/wp-json<\/code>. Till exempel kan en lokal WordPress med URL <code>http:\/\/localhost\/wordpress\/<\/code>komma \u00e5t REST API p\u00e5 <code>http:\/\/localhost\/wordpress\/wp-json<\/code>. D\u00e4rifr\u00e5n m\u00e5ste vi l\u00e4gga till slutpunkter. Med h\u00e4nvisning till ovanst\u00e5ende referens f\u00f6r slutpunkter kan vi h\u00e4mta en lista \u00f6ver senaste inl\u00e4gg i slutpunkten <code>\/wp\/v2\/posts<\/code>. Det betyder att om du g\u00e5r till <code>http:\/\/localhost\/wordpress\/wp-json\/wp\/v2\/posts<\/code>i din webbl\u00e4sare f\u00e5r du ett JSON-formaterat svar p\u00e5 de senaste inl\u00e4ggen p\u00e5 din WordPress-webbplats.<\/p>\n<p>En notering om namnrymder \u00e4r p\u00e5 sin plats. En REST API-URL b\u00f6rjar med ett namnomr\u00e5de (&#8217; <code>wp\/v2<\/code>&#8217; \u00e4r WordPress&#8217; namnomr\u00e5de som visas i exemplet med webbadresser ovan). Namnutrymmen \u00e4r ett koncept f\u00f6r att undvika sammandrabbningar i k\u00e4rnan i WordPress, teman och plugins som l\u00e4gger till slutpunkter med samma namn. Skapa ditt eget unika namnomr\u00e5de &#8211; vanligtvis en snigelform av ditt tema- eller pluginnamn. Efter slug \u00e4r en allm\u00e4n regel att l\u00e4gga till versionsnumret, normalt fr\u00e5n v1. Som ett exempel \u00e4r mitt temas slug &#8217; <code>awhitepixel<\/code>&#8217;, s\u00e5 om jag skulle skapa anpassade slutpunkter i mitt tema skulle jag anv\u00e4nda namnomr\u00e5det &#8217; <code>awhitepixel\/v1<\/code>&#8217;. Med detta namnutrymme kunde jag registrera en slutpunkt &#8217; <code>posts<\/code>&#8217; och det skulle inte orsaka n\u00e5gra problem \u00e4ven om det \u00e4r identiskt med WordPress&#8217; slutpunktsnamn.<\/p>\n<p>Att arbeta med REST API i WordPress \u00e4r ett stort \u00e4mne med mycket bra information tillg\u00e4nglig. I det h\u00e4r inl\u00e4gget fokuserar jag p\u00e5 anv\u00e4ndbarhet i Gutenberg editor och hur man h\u00e4mtar dem i Javascript.<\/p>\n<h2>Vad vi ska g\u00f6ra och vad vi beh\u00f6ver<\/h2>\n<p>Anv\u00e4ndbarheten f\u00f6r att beg\u00e4ra anpassad information har ett brett utbud av anv\u00e4ndningsfall, s\u00e5 du beh\u00f6ver vanligtvis anpassa kodexemplen nedan f\u00f6r att passa dina behov. Data kan vara en anpassad post-fr\u00e5ga, en anpassad SQL-fr\u00e5ga eller n\u00e5got helt annat.<\/p>\n<p>N\u00e4r vi skapar en anpassad slutpunkt har vi full kontroll \u00f6ver dess retur. Vi kan utf\u00f6ra alla typer av operationer och fr\u00e5gor i WordPress\/PHP och skicka detta vidare som JSON. Och i v\u00e5rt Gutenberg-block kommer vi att kunna h\u00e4mta denna retur och g\u00f6ra vad vi vill med den inom blockets <code>edit<\/code>funktion. Vanligtvis skulle du anv\u00e4nda data f\u00f6r att ge slutanv\u00e4ndaren ett val eller information i blockredigeraren, men du kan ocks\u00e5 lagra information fr\u00e5n den i ditt block f\u00f6r vidare anv\u00e4ndning. Du kan ocks\u00e5 skapa dina egna anpassade butiker f\u00f6r denna data, men jag g\u00e5r inte in p\u00e5 hur man g\u00f6r det.<\/p>\n<p>Jag antar att du redan \u00e4r bekant med hur man skapar anpassade Gutenberg-block s\u00e5 jag kommer inte att g\u00e5 igenom detta i detalj h\u00e4r.<\/p>\n<h2>Skapa en REST API-slutpunkt<\/h2>\n<p>Registrering av en anpassad REST API-slutpunkt g\u00f6rs i PHP. Du skulle l\u00e4gga till den h\u00e4r koden i ditt teman <code>functions.php<\/code>eller en aktiv plugin-kod. Koppla en funktion till \u00e5tg\u00e4rden <code>rest_api_init<\/code>och k\u00f6r funktionen <code>[register_rest_route](https:\/\/developer.wordpress.org\/reference\/functions\/register_rest_route\/)()<\/code>f\u00f6r varje slutpunkt du vill registrera.<\/p>\n<p>Ange ditt namnomr\u00e5de som f\u00f6rsta parameter, din slutpunktsrutt som andra och en rad inst\u00e4llningar som tredje parameter till <code>register_rest_route()<\/code>. Den fj\u00e4rde parametern styr om du vill \u00e5sidos\u00e4tta en befintlig rutt eller inte; inte n\u00e5got vi ska titta p\u00e5 h\u00e4r. I arrayen f\u00f6r den tredje parametern b\u00f6r du som minimum st\u00e4lla in egenskapen &#8217; <code>callback<\/code>&#8217; till en funktion som \u00e4r ansvarig f\u00f6r att returnera slutpunktens data. Att st\u00e4lla in &#8217; <code>method<\/code>&#8217; \u00e4r ocks\u00e5 vanligt, t.ex. att st\u00e4lla in din slutpunkt p\u00e5 &#8217; <code>GET<\/code>&#8217;, &#8217; <code>POST<\/code>&#8217;, &#8217; <code>PUT<\/code>&#8217; osv.<\/p>\n<p>L\u00e5t oss b\u00f6rja med att registrera en enkel slutpunkt;<\/p>\n<pre><code>add_action('rest_api_init', function() {\n    register_rest_route('awhitepixel\/v1', '\/mydata', [\n        'method' =&gt; 'GET',\n        'callback' =&gt; 'awhitepixel_rest_route_mydata'\n    ]);\n});<\/code><\/pre>\n<p>Mitt temas namnomr\u00e5de \u00e4r &#8217; <code>awhitepixel\/v1<\/code>&#8217; och jag registrerar en slutpunkt &#8217; <code>mydata<\/code>&#8217; inom detta namnomr\u00e5de. Det betyder att jag kan komma \u00e5t mitt anpassade REST API p\u00e5 <code>http:\/\/localhost\/wordpress\/wp-json\/awhitepixel\/v1\/mydata<\/code>.<\/p>\n<p>N\u00e4r du registrerar (eller \u00e4ndrar) REST API-rutter m\u00e5ste <strong>du spola dina permal\u00e4nkar<\/strong> f\u00f6r att det ska fungera. Du kan g\u00f6ra detta genom att g\u00e5 till Inst\u00e4llningar &gt; Permal\u00e4nkar och helt enkelt klicka p\u00e5 Spara.<\/p>\n<p>Ovanst\u00e5ende kod fungerar inte \u00e4n, eftersom jag inte har definierat funktionsupps\u00e4ttningen som callback: <code>awhitepixel_rest_route_mydata<\/code>. \u00c5teruppringningsfunktionen tar emot en parameter; en rad data med information och argument som skickas in fr\u00e5n beg\u00e4ran. Slutligen m\u00e5ste du noga \u00f6verv\u00e4ga \u00e5teruppringningsfunktionens \u00e5terkomst.<\/p>\n<p>F\u00f6r det f\u00f6rsta m\u00e5ste du alltid returnera n\u00e5got fr\u00e5n din slutpunktsuppringning. Alla returer kommer automatiskt att konverteras till JSON av WordPress. Det betyder att du kan returnera praktiskt taget alla former av data i din funktion; en str\u00e4ng, null, en array eller <code>[WP_Error](https:\/\/developer.wordpress.org\/reference\/classes\/wp_error\/)<\/code>instans. Du kan ocks\u00e5 v\u00e4lja att returnera ett <code>[WP_REST_Response](https:\/\/developer.wordpress.org\/reference\/classes\/wp_rest_response\/)<\/code>objekt f\u00f6r mer kontroll p\u00e5 t.ex. statuskod eller rubrikinformation. Jag rekommenderar att du lindar returen i funktionen <code>[rest_ensure_response](https:\/\/developer.wordpress.org\/reference\/functions\/rest_ensure_response\/)()<\/code>f\u00f6r att s\u00e4kerst\u00e4lla att ditt svar \u00e4r ett giltigt REST-svar.<\/p>\n<p>L\u00e5t oss definiera v\u00e5r callback-funktion och returnera en enkel str\u00e4ng som en b\u00f6rjan;<\/p>\n<pre><code>function awhitepixel_rest_route_mydata($data) {\n    $response = 'Hello there!';\n    return rest_ensure_response($response);\n}<\/code><\/pre>\n<p>Med ovanst\u00e5ende kod (och t\u00f6mda permal\u00e4nkar) kan jag nu g\u00e5 till URL:en <code>http:\/\/localhost\/wordpress\/wp-json\/awhitepixel\/v1\/mydata<\/code>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151531-61e4cc06da37f.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-151531-61e4cc06da37f.png\" alt=\"Skapa och h\u00e4mta anpassade REST-slutpunkter i Gutenberg-block\" ><\/a><\/p>\n<p>H\u00e4rifr\u00e5n kan vi l\u00e4gga till vilken typ av kod som helst i v\u00e5r \u00e5teruppringningsfunktion f\u00f6r att generera korrekt data att returnera. Du kan fr\u00e5ga WordPress-inneh\u00e5ll med t.ex. <code>[WP_Query](https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/)<\/code>g\u00f6ra fr\u00e5gor i databasen eller beg\u00e4ra extern data. Den h\u00e4r delen \u00e4r upp till dig.<\/p>\n<p>L\u00e5t oss nu g\u00e5 vidare till den motsatta sidan; hur man g\u00f6r f\u00f6rfr\u00e5gningarna.<\/p>\n<h2>G\u00f6r REST API-f\u00f6rfr\u00e5gningar i Javascript<\/h2>\n<p>Att utf\u00f6ra REST-beg\u00e4ran g\u00f6rs vanligtvis med hj\u00e4lp <code>[fetch](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Fetch_API)<\/code>av Javascript. WordPress tillhandah\u00e5ller sitt eget omslag <code>fetch<\/code>som f\u00f6renklar WordPress REST API-f\u00f6rfr\u00e5gningar; <code>[wp.apiFetch](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-api-fetch\/)<\/code>. Detta \u00e4r vad jag kommer att anv\u00e4nda i mitt anpassade Gutenberg-block. T\u00e4nk p\u00e5 att en <code>fetch<\/code>beg\u00e4ran returnerar ett &quot;l\u00f6fte&quot; &#8211; s\u00e5 vi m\u00e5ste kedja ett <code>.then()<\/code>f\u00f6r att kunna hantera den faktiska f\u00f6rfr\u00e5gningsreturen. Basanv\u00e4ndningen \u00e4r ungef\u00e4r s\u00e5 h\u00e4r;<\/p>\n<pre><code>wp.apiFetch({\n    path: '&lt;namespace and endpoint&gt;',\n}).then(data =&gt; {\n    console.log('response from apifetch: ', data);\n});<\/code><\/pre>\n<p><code>apiFetch<\/code>till\u00e5ter oss att tillhandah\u00e5lla en <code>path<\/code>egenskap ist\u00e4llet f\u00f6r att bygga hela webbadressen. Allt vi beh\u00f6ver tillhandah\u00e5lla \u00e4r namnutrymmet och slutpunkten, och <code>apiFetch<\/code>kommer att l\u00e4gga till detta till WordPress REST API rot-URL. Inuti <code>.then()<\/code>funktionen har vi tillg\u00e5ng till data som redan \u00e4r konverterad till JSON. Det \u00e4r h\u00e4r du skulle g\u00f6ra n\u00e5got med datan. Vanligtvis lagrar du returnerad data i t.ex. komponentens tillst\u00e5nd.<\/p>\n<p>Nedan \u00e4r ett exempel p\u00e5 ett anpassat Gutenberg-blocks <code>edit<\/code>komponent. Den \u00e4r klassbaserad f\u00f6r att kunna anv\u00e4ndas <code>state<\/code>f\u00f6r att lagra returnerad data fr\u00e5n REST API-beg\u00e4ran. Detta g\u00f6r att vi ocks\u00e5 kan k\u00f6ra f\u00f6rfr\u00e5gan <code>componentDidMount()<\/code>n\u00e4r den f\u00f6rst monteras (se <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html#adding-lifecycle-methods-to-a-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Reacts dokumentation om livscykelmetoder<\/a> ). Allt detta ger ett enkelt exempel f\u00f6r att du ska f\u00f6rst\u00e5 det grundl\u00e4ggande konceptet; inte som ett recept f\u00f6r att g\u00f6ra det exakt s\u00e5 h\u00e4r. Du kan \u00f6verv\u00e4ga att anv\u00e4nda <a href=\"https:\/\/reactjs.org\/docs\/hooks-intro.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React-krokar och funktionella komponenter<\/a> eller konstruera en <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">komponent av h\u00f6gre ordning<\/a> ist\u00e4llet.<\/p>\n<pre><code>const { Component } = wp.element;\nconst { Spinner } = wp.components;\n\u00a0\nclass BlockEdit extends Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            list: [],\n            loading: true\n        }\n    }\n\u00a0\n    componentDidMount() {\n        this.runApiFetch();\n    }\n\u00a0\n    runApiFetch() {\n        wp.apiFetch({\n            path: 'awhitepixel\/v1\/mydata',\n        }).then(data =&gt; {\n            this.setState({\n                list: data,\n                loading: false\n            });\n        });\n    }\n\u00a0\n    render() {\n        return(\n            &lt;div&gt;\n                {this.state.loading? (&lt;Spinner \/&gt;\n                ): (&lt;p&gt;Data is ready!&lt;\/p&gt;\n                )}\n            &lt;\/div&gt;\n        );\n\u00a0\n    }\n}\nexport default BlockEdit;<\/code><\/pre>\n<p>Exemplet ovan \u00e4r en klassbaserad komponent som levereras till blockets <code>edit<\/code>funktion i <code>registerBlockType()<\/code>. Den st\u00e4ller in ett tillst\u00e5ndsobjekt f\u00f6r en array f\u00f6r att h\u00e5lla data (detta beror s\u00e5 klart p\u00e5 vilken data du returnerar) och en status boolean f\u00f6r att veta n\u00e4r asynkbeg\u00e4ran har returnerats. N\u00e4r komponenten \u00e4r monterad (renderad f\u00f6r f\u00f6rsta g\u00e5ngen) k\u00f6r den funktionen f\u00f6r att utf\u00f6ra <code>apiFetch<\/code>beg\u00e4ran. Vi anger s\u00f6kv\u00e4gen till slutpunkten vi registrerade i PHP ovan. Metoden \u00e4r som standard GET s\u00e5 vi beh\u00f6ver inte specificera detta i <code>apiFetch<\/code>. Och innefunktion <code>.then()<\/code>n\u00e4r f\u00f6rfr\u00e5gan \u00e4r klar uppdaterar vi komponentens tillst\u00e5nd med returnerad data.<\/p>\n<p>Uppenbarligen skulle ditt blocks renderingsfunktion g\u00f6ra mer med den returnerade datan i sig. Du kanske vill tillhandah\u00e5lla data till anv\u00e4ndaren som p\u00e5 n\u00e5got s\u00e4tt presenterar en lista att kanske v\u00e4lja mellan. Allt beror p\u00e5 vilken typ av data det \u00e4r och vad du vill anv\u00e4nda den till.<\/p>\n<h2>\u00d6verf\u00f6r argument till slutpunkten<\/h2>\n<p>I vissa fall m\u00e5ste vi f\u00f6ra n\u00e5gra argument till slutpunkten. Vanliga anv\u00e4ndningsomr\u00e5den \u00e4r att skicka ett ID efter endpoint; skulle till exempel <code>http:\/\/localhost\/wordpress\/wp-json\/wp\/v2\/posts\/14<\/code>returnera post-ID 14.<\/p>\n<p>Detta \u00e4r ganska enkelt och g\u00f6rs genom att l\u00e4gga till ett regex-s\u00f6km\u00f6nster till slutpunkten n\u00e4r du registrerar det. Det kr\u00e4ver viss kunskap om regexes f\u00f6r att bygga komplexa m\u00f6nster, men nedan \u00e4r ett exempel som matchar ett nummer och tilldelar det namnet &#8217;id&#8217;. Att namnge matchningarna ger oss m\u00f6jlighet att komma \u00e5t variabeln i v\u00e5r callback-funktion. L\u00e5t mig visa dig vad jag menar.<\/p>\n<p>L\u00e5t oss registrera en ny slutpunktsrutt. Vi anv\u00e4nder samma slutpunkt som vi gjorde tidigare (&#8217; <code>awhitepixel\/v1\/mydata<\/code>&#8217;) men f\u00f6r denna rutt l\u00e4gger vi till en regexmatchning f\u00f6r ett nummer i slutet.<\/p>\n<pre><code>add_action('rest_api_init', function() {\n    register_rest_route('awhitepixel\/v1', '\/mydata', [\n        'method' =&gt; 'GET',\n        'callback' =&gt; 'awhitepixel_rest_route_mydata'\n    ]);\n\u00a0\n    register_rest_route('awhitepixel\/v1', '\/mydata\/(?P&lt;id&gt;[d]+)', [\n        'method' =&gt; 'GET',\n        'callback' =&gt; 'awhitepixel_rest_route_mydata'\n    ]);\n});<\/code><\/pre>\n<p>Regex-m\u00f6nstret <code>(?P&lt;id&gt;[d]+)<\/code>verkar kryptiskt, men kommer att vara ganska tydligt med en viss grundl\u00e4ggande f\u00f6rst\u00e5else f\u00f6r regex. Delen <code>[d]+<\/code>matchar valfritt nummer (0-9) 1 eller flera g\u00e5nger. Delarna <code>(?P&lt;id&gt;<\/code>och <code>)<\/code>\u00e4r f\u00f6r att matcha en namngiven grupp. Gruppnamnet \u00e4r i det h\u00e4r fallet <code>id<\/code>, men du kan namnge dina grupper vad du vill.<\/p>\n<p>Du kan v\u00e4lja att styra denna slutpunkt till en separat \u00e5teruppringningsfunktion, men jag har valt att anv\u00e4nda samma funktion f\u00f6r att hantera b\u00e5de <code>\/mydata<\/code>och <code>\/mydata\/&lt;ID&gt;<\/code>f\u00f6rfr\u00e5gningar. Det betyder att jag i min \u00e5teruppringningsfunktion kan g\u00f6ra:<\/p>\n<pre><code>function awhitepixel_rest_route_mydata($data) {\n    if ($data['id']) {\n        $response = 'Create return for ID: '. $data['id'];\n    } else {\n        $response = 'Create general return (no ID provided)';\n    }\n    return rest_ensure_response($response);\n}<\/code><\/pre>\n<p>Kom ih\u00e5g att parametern till callback-funktionen inneh\u00e5ller de returnerade argumenten. Eftersom jag d\u00f6pte min matchade grupp till &#8217; <code>id<\/code>&#8217; kommer det matchade v\u00e4rdet att vara tillg\u00e4ngligt i <code>$data['id']<\/code>. Och slutligen eftersom jag anv\u00e4nder samma funktion f\u00f6r att hantera f\u00f6rfr\u00e5gningar med och utan ID kan jag enkelt v\u00e4xla mellan de tv\u00e5 olika returerna.<\/p>\n<p>Med detta (och uppdaterade permal\u00e4nkar) kommer jag att f\u00e5 dessa svar f\u00f6r mina anpassade slutpunkter:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151531-61e4cc079c6de.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-151531-61e4cc079c6de.png\" alt=\"Skapa och h\u00e4mta anpassade REST-slutpunkter i Gutenberg-block\" ><\/a><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151531-61e4cc08646fc.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-151531-61e4cc08646fc.png\" alt=\"Skapa och h\u00e4mta anpassade REST-slutpunkter i Gutenberg-block\" ><\/a><\/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>En guide i hur du skapar anpassade WordPress REST API-slutpunkter och utf\u00f6r apiFetch-f\u00f6rfr\u00e5gningar f\u00f6r dem i ett anpassat Gutenberg-block.<\/p>\n","protected":false},"author":1,"featured_media":224922,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,838,942,942,848,901,922,1110,922,818,818,838,848,868,868],"tags":[1173],"class_list":{"0":"post-233918","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koda","8":"category-guide-foer-nyboerjare","9":"category-gutenberg-9","11":"category-handledningar","13":"category-oevrig","14":"category-n-a","16":"category-plugins-3","20":"category-wordpress-9","22":"tag-affiai-sv"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233918","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=233918"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233918\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/224922"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}