{"id":230739,"date":"2022-12-18T14:33:00","date_gmt":"2022-12-18T11:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230739"},"modified":"2022-12-18T14:34:11","modified_gmt":"2022-12-18T11:34:11","slug":"wordpress-widgets-refactoring-del-6","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-6\/","title":{"rendered":"WordPress-widgets: Refactoring, del 6"},"content":{"rendered":"\n<p>Du b\u00f6r vara v\u00e4l insatt i den omstrukturering vi g\u00f6r ang\u00e5ende WordPress Widget Boilerplate. Om inte, rekommenderar jag att du kommer ikapp serien hittills genom att:<\/p>\n<ul>\n<li>l\u00e4ser <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-5\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6rra inl\u00e4gget<\/a> ,<\/li>\n<li>eller l\u00e4ser <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress-widgets-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hela serien<\/a> fram till denna punkt,<\/li>\n<li>och tittar p\u00e5 <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utvecklingsgrenen av projektet<\/a> p\u00e5 GitHub.<\/li>\n<\/ul>\n<p>N\u00e4r det g\u00e4ller kodbasen \u00e4r vi p\u00e5 en bra plats just nu. Vi har b\u00f6rjat omstrukturera mycket av koden till mindre, mer fokuserade klasser. Och vi har precis satt upp ett register s\u00e5 att vi kan b\u00f6rja arbeta med instanser av objekt i hela plugin-programmet utan att beh\u00f6va f\u00f6r mycket koppling.<\/p>\n<p>Men det finns fortfarande ett problem vi st\u00e5r inf\u00f6r och det handlar om namnutrymmen och automatisk laddning. Jag har pratat lite om detta <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/namnutrymmen-och-autoladdning-i-wordpress\/\" title=\"f\u00f6r ett par \u00e5r sedan\">f\u00f6r ett par \u00e5r sedan<\/a> men inte n\u00e4r det g\u00e4ller Composer.<\/p>\n<p>Och det \u00e4r vad vi ska titta p\u00e5 i det h\u00e4r inl\u00e4gget.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring, del 6<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-2\/\" title=\"I det andra inl\u00e4gget i den h\u00e4r serien\">I det andra inl\u00e4gget i den h\u00e4r serien<\/a> b\u00f6rjade vi prata om komposit\u00f6r. Om du fr\u00e5gar de flesta PHP-utvecklare (inklusive de som arbetar med WordPress), kommer du sannolikt att h\u00f6ra att Composer \u00e4r en pakethanterare eller en beroendehanterare.<\/p>\n<p>Kort sagt, det \u00e4r ett s\u00e4tt f\u00f6r oss att ta med tredje parts bibliotek i v\u00e5rt projekt och sedan anv\u00e4nda deras funktioner (s\u00e5 att vi inte beh\u00f6ver skriva v\u00e5r egen kod f\u00f6r att g\u00f6ra det).<\/p>\n<p>Men det finns en annan funktion som Composer erbjuder som \u00e4r enormt anv\u00e4ndbar, speciellt n\u00e4r du anv\u00e4nder m\u00e5nga klasser och <strong>inte<\/strong> vill anv\u00e4nda require_once-satser i hela din kodbas.<\/p>\n<p>Och det \u00e4r autoloadern.<\/p>\n<h3>Autoloader Defined<\/h3>\n<p>Direkt fr\u00e5n <a href=\"https:\/\/getcomposer.org\/doc\/01-basic-usage.md#autoloading\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manualen:<\/a><\/p>\n<blockquote>\n<p>F\u00f6r bibliotek som anger autoload-information genererar Composer en <code>vendor\/autoload.php<\/code>fil. Du kan helt enkelt inkludera den h\u00e4r filen och b\u00f6rja anv\u00e4nda klasserna som dessa bibliotek tillhandah\u00e5ller utan extra arbete:<\/p>\n<\/blockquote>\n<p>Om du har f\u00f6ljt med koden hittills, kommer du att se att vi faktiskt redan anv\u00e4nder autoloader som genereras av Composer.<\/p>\n<p>F\u00f6rst definierade vi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den n\u00f6dv\u00e4ndiga konfigurationen<\/a> :<\/p>\n<pre><code>{\n    \"name\": \"wordpress-widget-boilerplate\/wordpress-widget-boilerplate\",\n    \"description\": \"An organized, maintainable boilerplate for building widgets using WordPress best practices.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"homepage\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@pressware.co\",\n        \"homepage\": \"https:\/\/pressware.co\"\n      }\n    ],\n    \"support\": {\n      \"issues\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/issues\"\n    },\n    \"config\": {\n      \"preferred-install\": \"dist\",\n      \"platform\": {\n          \"php\": \"7.1\"\n      }\n    },\n    \"repositories\": [\n      {\n        \"type\": \"composer\",\n        \"url\": \"https:\/\/wpackagist.org\"\n      }\n    ],\n    \"require\": {\n      \"php\": \"7.1\",\n      \"composer\/installers\": \"^1.4\"\n    },\n    \"require-dev\": {\n        \"friendsofphp\/php-cs-fixer\": \"^2.13.1\",\n        \"jakub-onderka\/php-parallel-lint\": \"^1.0.0\",\n        \"phpmd\/phpmd\": \"^v2.6.0\",\n        \"nikic\/php-parser\": \"^4.0\",\n        \"ocramius\/proxy-manager\": \"^2.0.0\",\n        \"phpro\/grumphp\": \"^0.13.1\"\n    },\n    \"scripts\": {\n      \"test\": [\n        \".\/vendor\/bin\/grumphp run\"\n      ]\n    },\n    \"minimum-stability\": \"stable\"\n  }<\/code><\/pre>\n<p>Sedan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-01-plugin-boostrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">b\u00f6rjade vi inkludera det i pluginets bootstrap<\/a> (som vi kommer att slutf\u00f6ra idag):<\/p>\n<pre><code>&lt;?php\n\n\/\/ Include the autoloader.\n\/\/ TODO: Note this has not yet been defined.\nrequire_once __DIR__. '\/inc\/autoload.php';\n<\/code><\/pre>\n<p>Men det finns ett problem h\u00e4r: Hur laddar vi bara de klasser vi beh\u00f6ver f\u00f6r distribution?<\/p>\n<p>F\u00f6r att uttrycka det p\u00e5 ett annat s\u00e4tt: Det finns m\u00e5nga bibliotek vi anv\u00e4nder under utveckling f\u00f6r att s\u00e4kerst\u00e4lla att vi skriver h\u00f6gkvalitativ, standardkompatibel kod. Men vi vill inte distribuera 10 MB data till de som anv\u00e4nder v\u00e5rt projekt.<\/p>\n<p>Ist\u00e4llet beh\u00f6ver vi bara inkludera de filer som kr\u00e4vs, eller hur? Och f\u00f6r att g\u00f6ra det m\u00e5ste vi se till att vi genererar en autoloader som vi kan inkludera som g\u00f6r just det.<\/p>\n<p>F\u00f6rst ska jag visa dig <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-02-composer-distribution-command-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kommandot<\/a> och f\u00f6rklara sedan vad det g\u00f6r:<\/p>\n<pre><code>$ composer install --no-dev --no-ansi --no-interaction --optimize-autoloader --no-progress --prefer-dist<\/code><\/pre>\n<p>Detta kommer att generera precis vad vi beh\u00f6ver f\u00f6r att v\u00e5rt projekt ska fungera i en produktionsmilj\u00f6. S\u00e5 h\u00e4r g\u00f6r varje flagga:<\/p>\n<ul>\n<li><strong>komposit\u00f6r installera<\/strong>. Detta installerar helt enkelt alla beroenden. Om du redan har ett antal av dem i din leverant\u00f6rskatalog kommer detta att ta bort alla utom de som kr\u00e4vs.<\/li>\n<li><strong>no-dev<\/strong>. Detta kommer att f\u00f6rhindra Composer fr\u00e5n att installera paketen i sektionen <strong>require-dev<\/strong> i dess konfigurationsfiler (n\u00e4mligen beroenden som vi anv\u00e4nder med GrumPHP).<\/li>\n<li><strong>no-ansi.<\/strong> Detta f\u00f6rhindrar att n\u00e5gon ANSI-utg\u00e5ng uppst\u00e5r. Du kanske inte bryr dig om att k\u00f6ra detta eller inte. Om du v\u00e4ljer att g\u00f6ra n\u00e5gon typ av automatisk distribution, anv\u00e4nd den d\u00e5; annars kan det utel\u00e4mnas fr\u00e5n kommandot.<\/li>\n<li><strong>ingen interaktion<\/strong>. Det h\u00e4r \u00e4r en annan flagga som anv\u00e4nds specifikt f\u00f6r milj\u00f6er d\u00e4r du vill bygga projektet automatiskt och inte beh\u00f6ver engagera dig i n\u00e5gra fr\u00e5gor, utdata och s\u00e5dana saker.<\/li>\n<li><strong>optimize-autoloader<\/strong>. Kort sagt, detta genererar en snabbare autoloader. Det kan ta lite tid att k\u00f6ra beroende p\u00e5 storleken p\u00e5 ditt projekt men det l\u00f6nar sig n\u00e4r du startar ditt arbete.<\/li>\n<li><strong>inga framsteg<\/strong>. Detta d\u00f6ljer f\u00f6rloppsindikatorn fr\u00e5n att visas i terminalen. Du kanske faktiskt vill se detta och i s\u00e5 fall \u00e4r det j\u00e4ttebra; dock kanske vissa milj\u00f6er inte hanterar vissa tecken (som backsteg) bra.<\/li>\n<li><strong>f\u00f6redra-dist<\/strong>. Detta kommer att se till att paketen som installeras g\u00f6rs med distributionsversionen (mot n\u00e5got som \u00e4r mindre stabilt).<\/li>\n<\/ul>\n<h4>Fortfarande intresserad?<\/h4>\n<p>Om du verkligen \u00e4r nyfiken p\u00e5 att optimera autoloadern f\u00f6r projekt utanf\u00f6r detta inl\u00e4gg rekommenderar jag att du l\u00e4ser <a href=\"https:\/\/getcomposer.org\/doc\/articles\/autoloader-optimization.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den h\u00e4r sidan<\/a> i Composer-dokumentationen. Det ligger utanf\u00f6r ramarna f\u00f6r vad vi g\u00f6r h\u00e4r men det kan komma v\u00e4l till pass med annat arbete som du har nu eller som du g\u00f6r i framtiden.<\/p>\n<h2>Hur ser det h\u00e4r ut i Boilerplate?<\/h2>\n<p>Om du arbetar med Boilerplate p\u00e5 din lokala maskin kan du se n\u00e5got i stil med detta:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161015-61e719e23bf2d.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-161015-61e719e23bf2d.png\" alt=\"WordPress-widgets: Refactoring, del 6\"><\/a><\/p>\n<p>Men om du k\u00f6r kommandot som ing\u00e5r ovan kommer du att se n\u00e5got s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161015-61e719e5afd5a.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-161015-61e719e5afd5a.png\" alt=\"WordPress-widgets: Refactoring, del 6\"><\/a><\/p>\n<p>Det \u00e4r en stor skillnad och det h\u00e4r \u00e4r ett litet projekt. F\u00f6rest\u00e4ll dig att g\u00f6ra n\u00e5got mycket st\u00f6rre som kommer att k\u00f6ras i produktion.<\/p>\n<p>P\u00e5 tal av erfarenhet kan jag ber\u00e4tta att projekt snabbt kan n\u00e5 20 MB eller mer av beroenden om du anv\u00e4nder en m\u00e4ngd olika tredjepartsbibliotek f\u00f6r saker som loggning, HTTP-f\u00f6rfr\u00e5gningar och kodkvalitetsverktyg.<\/p>\n<h2>Kommer vi att inkludera i v\u00e5r leverant\u00f6rskatalog?<\/h2>\n<p>Folk kommer ofta att s\u00e4ga att du inte b\u00f6r inkludera leverant\u00f6rskatalogen i k\u00e4llkontroll och med goda sk\u00e4l: det kan vara enormt.<\/p>\n<p>Till och med komposit\u00f6rens dokumentation <a href=\"https:\/\/getcomposer.org\/doc\/faqs\/should-i-commit-the-dependencies-in-my-vendor-directory.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">talar om detta:<\/a><\/p>\n<blockquote>\n<p>Det b\u00e4sta \u00e4r att sedan l\u00e5ta alla utvecklare anv\u00e4nda Composer f\u00f6r att installera beroenden. P\u00e5 samma s\u00e4tt b\u00f6r byggservern, CI, distributionsverktyg etc anpassas f\u00f6r att k\u00f6ra Composer som en del av deras projektstart.<\/p>\n<\/blockquote>\n<p>S\u00e5 vad ska vi g\u00f6ra? Vi beh\u00f6ver autoloadern och vi beh\u00f6ver vissa beroenden eftersom v\u00e5ra anv\u00e4ndare inte vet att k\u00f6ra (inte heller ska de beh\u00f6va k\u00f6ra!) Composer n\u00e4r de laddar ner v\u00e5rt arbete.<\/p>\n<p>P\u00e5 grund av WordPresss natur och det arbete vi g\u00f6r, kommer vi att beh\u00f6va best\u00e4mma leverant\u00f6rskatalogen men bara med mycket vissa krav.<\/p>\n<ol>\n<li>Vi kommer att skapa en gren som kommer att anv\u00e4ndas f\u00f6r release (vi kommer kreativt att kalla det <strong>release<\/strong> och vi kan sl\u00e5 samman <strong>utvecklas<\/strong> till det n\u00e4r det beh\u00f6vs).<\/li>\n<li>Vi kommer att se till att leverant\u00f6rskatalogen inte \u00e4r en del av gitignore-filen; vi kommer dock att se till att .git-katalogerna i leverant\u00f6rskatalogen ignoreras (som fortfarande kan ta upp mycket utrymme).<\/li>\n<\/ol>\n<p>S\u00e5 l\u00e5t oss g\u00f6ra varje steg och se hur det ser ut n\u00e4r vi \u00e4r klara.<\/p>\n<h3>Skapar utgivningsgrenen<\/h3>\n<p>F\u00f6r att skapa en ny gren fr\u00e5n terminalen, skriv <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-03-create-a-branch-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">in f\u00f6ljande kommando<\/a> :<\/p>\n<pre><code>$ git checkout -b release<\/code><\/pre>\n<p>Detta tar all kod som vi arbetar med och skapar sedan en ny gren med den. Eftersom detta kommer att vara den gren vi anv\u00e4nder f\u00f6r att fungera som vad v\u00e5ra anv\u00e4ndare kommer att anv\u00e4nda (vi kommer att prata om <strong>master<\/strong> i ett framtida inl\u00e4gg).<\/p>\n<p>Granska f\u00f6rst din composer.json-fil och se till att den inneh\u00e5ller f\u00f6ljande:<\/p>\n<pre><code>\"autoload\": {\n    \"psr-4\": {\n        \"WordPressWidgetBoilerplate\": \"src\/\",\n        \"WordPressWidgetBoilerplateSubscriber\": \"src\/Subscriber\/\",\n        \"WordPressWidgetBoilerplateUtilities\": \"src\/Utilities\/\",\n        \"WordPressWidgetBoilerplateViews\": \"src\/Views\/\"\n    }\n},<\/code><\/pre>\n<p>Nu m\u00e5ste vi se till att vi k\u00f6r ovanst\u00e5ende Composer-kommando f\u00f6r att se till att inget annat \u00e4n det vi beh\u00f6ver finns i <strong>leverant\u00f6rskatalogen<\/strong>.<\/p>\n<pre><code>$ composer install --no-dev --no-ansi --no-interaction --optimize-autoloader --no-progress --prefer-dist<\/code><\/pre>\n<p>Nu m\u00e5ste vi uppdatera gitignore.<\/p>\n<h3>Uppdatera vad vi ignorerar<\/h3>\n<p>Och om du har f\u00f6ljt b\u00e5de med serien och inl\u00e4gget s\u00e5 h\u00e4r l\u00e5ngt, s\u00e5 vet du att det kommer att se ut ungef\u00e4r s\u00e5 h\u00e4r (det kan inneh\u00e5lla mer eller mindre men b\u00f6r inneh\u00e5lla \u00e5tminstone detta).<\/p>\n<p>F\u00f6r mig ser det ut <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-05-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">som f\u00f6ljande<\/a> :<\/p>\n<pre><code>*.DS_Store\n*.log\nwp-config.php\nwp-content\/advanced-cache.php\nwp-content\/backup-db\/\nwp-content\/backups\/\nwp-content\/blogs.dir\/\nwp-content\/cache\/\nwp-content\/upgrade\/\nwp-content\/uploads\/\nwp-content\/mu-plugins\/\nwp-content\/wp-cache-config.php\nwp-content\/plugins\/hello.php\n\n\/.htaccess\n\/license.txt\n\/readme.html\n\/sitemap.xml\n\/sitemap.xml.gz\n\n\/vendor\/**\/.git\n\/vendor\/bin\ncomposer.lock\n<\/code><\/pre>\n<p>Beroende p\u00e5 om du anv\u00e4nder en terminal eller en klient, kommer du att se att det finns nya filer att commit (fr\u00e5n leverant\u00f6rskatalogen, specifikt). S\u00e5 l\u00e4gg till dem i din filial.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/94d1c4d9f22431f12102051cff4300ab#file-06-pushing-a-new-branch-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">G\u00f6r sedan dina \u00e4ndringar<\/a>. Du kan beh\u00f6va ange f\u00f6ljande om du arbetar i terminalen:<\/p>\n<pre><code>$ git push --set-upstream origin release<\/code><\/pre>\n<p>Och med det borde din kod fungera och vara tillg\u00e4nglig p\u00e5 GitHub (eller vilken k\u00e4llkontrolltj\u00e4nst du \u00e4n anv\u00e4nder). Du kan se vad jag har tillg\u00e4ngligt <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/release\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r<\/a>.<\/p>\n<h2>L\u00e4gger till funktionalitet<\/h2>\n<p>Nu n\u00e4r vi har alla n\u00f6dv\u00e4ndiga delar p\u00e5 plats \u00e4r det dags att b\u00f6rja anv\u00e4nda Composer, autoloadern, v\u00e5ra abstrakta klasser och v\u00e5rt register f\u00f6r att b\u00f6rja l\u00e4gga till n\u00e5gra grundl\u00e4ggande funktioner till WordPress Widget Boilerplate s\u00e5 att vi har n\u00e5got att visa f\u00f6r v\u00e5rt arbete .<\/p>\n<p>F\u00f6r den som \u00e4r nyfiken planerar jag just nu att h\u00e5lla grenarna organiserade som s\u00e5dana:<\/p>\n<ul>\n<li><strong>master<\/strong> kommer att vara det som \u00e4r tillg\u00e4ngligt f\u00f6r alla och alla som vill bygga en WordPress-widget,<\/li>\n<li><strong>utveckla<\/strong> \u00e4r strikt f\u00f6r utvecklare, inklusive de som vet hur man anv\u00e4nder Composer och de \u00e4mnen som diskuteras i det h\u00e4r inl\u00e4gget,<\/li>\n<li><strong>release<\/strong> \u00e4r vad som kommer att anv\u00e4ndas f\u00f6r att tillhandah\u00e5lla en fungerande demo.<\/li>\n<\/ul>\n<p>F\u00f6r nu, dock, granska vad som tas upp i det h\u00e4r inl\u00e4gget s\u00e5 \u00e5terupptar vi detta i n\u00e4sta inl\u00e4gg.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det finns ett problem vi st\u00e5r inf\u00f6r med namnutrymmen och autoloading och det \u00e4r vad vi kommer att titta p\u00e5 i det h\u00e4r inl\u00e4gget.<\/p>\n","protected":false},"author":1,"featured_media":223641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[724],"tags":[1173],"class_list":["post-230739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230739","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=230739"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230739\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223641"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}