{"id":228845,"date":"2022-11-03T12:25:00","date_gmt":"2022-11-03T09:25:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228845"},"modified":"2022-11-09T04:33:21","modified_gmt":"2022-11-09T01:33:21","slug":"rapid-prototyping-prototype-to-code-del-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-prototype-to-code-del-1\/","title":{"rendered":"Rapid Prototyping: Prototype To Code, del 1"},"content":{"rendered":"\n<p>N\u00e4r det g\u00e4ller snabba prototyper och WordPress har vi hittills gjort tv\u00e5 saker:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/snabb-prototyping-med-wordpress-fraan-koncept-till-plugin\/\" title=\"planerade plugin\" >planerade plugin<\/a> ,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/snabb-prototyping-med-wordpress-konceptanalys\/\" title=\"skissade upp ett diagram f\u00f6r hur koden kan organiseras\" >skissade upp ett diagram f\u00f6r hur koden kan organiseras<\/a><\/li>\n<\/ol>\n<p>Vid det h\u00e4r laget har vi gjort tillr\u00e4ckligt mycket arbete f\u00f6r att motivera att vi b\u00f6rjar omstrukturera v\u00e5r kod. Det vill s\u00e4ga, vi ska b\u00f6rja konvertera prototypen till kod. Men det h\u00e4r \u00e4r n\u00e5got som kommer att beh\u00f6va g\u00f6ras i tv\u00e5 faser.<\/p>\n<p>F\u00f6rst kommer vi helt enkelt att introducera klasser som representerar diagrammen fr\u00e5n f\u00f6reg\u00e5ende inl\u00e4gg och som kapslar in ansvaret f\u00f6r varje projekt.<\/p>\n<p>Efter det kommer vi att titta p\u00e5 att organisera koden i namnutrymmen och paket. Innan vi kan g\u00f6ra det m\u00e5ste vi dock se till att koden \u00e4r objektorienterad och f\u00f6rblir funktionell. S\u00e5 det \u00e4r vad som kommer att h\u00e4nda i det h\u00e4r inl\u00e4gget.<\/p>\n<h2>Prototyp till kod<\/h2>\n<p>Om du har l\u00e4st de tidigare inl\u00e4ggen, notera att jag planerar att f\u00f6lja organisationen som jag skissade p\u00e5 i f\u00f6rra inl\u00e4gget. Du beh\u00f6ver naturligtvis inte f\u00f6lja den h\u00e4r designen.<\/p>\n<h3>Ett ord om k\u00e4llkontroll<\/h3>\n<p>Om du anv\u00e4nder k\u00e4llkontroll, \u00e4r det h\u00e4r jag rekommenderar att du skapar en <a href=\"https:\/\/git-scm.com\/book\/en\/v1\/Git-Branching\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6rgrening<\/a> av huvudgrenen (om du anv\u00e4nder Git) s\u00e5 att du kan g\u00f6ra ditt arbete utan att f\u00f6rsv\u00e5ra den stabila versionen av koden.<\/p>\n<p>Detta \u00e4r lite utanf\u00f6r seriens omfattning, s\u00e5 om du inte anv\u00e4nder k\u00e4llkontroll, oroa dig inte. Om du \u00e4r det v\u00e4ljer jag att g\u00e5 med <strong>utveckla<\/strong> som namnet p\u00e5 denna gren. Jag sl\u00e5r ihop den tillbaka till <strong>master\u00a0<\/strong> n\u00e4r jag \u00e4r s\u00e4ker p\u00e5 att den fungerar.<\/p>\n<h3>Att skriva kod<\/h3>\n<p>Enligt arbetet som skissades ig\u00e5r kommer jag att skapa tv\u00e5 klasser:<\/p>\n<ol>\n<li>metabox-klassen,<\/li>\n<li>metabox-visningsklassen.<\/li>\n<\/ol>\n<p>Det kommer att finnas en viss \u00e5teranv\u00e4ndning av kod fr\u00e5n det vi redan har sett som du kommer att se i f\u00f6ljande kod.<\/p>\n<h4>Koden<\/h4>\n<p>F\u00f6rst <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-00-class-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e5r metabox<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Registers the Meta Box with WordPress.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Registers the Meta Box with WordPress. Defines the ID, title, display function,\n * and the post type on which it will live.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Meta_Box_Display\n     *\/\n    private $meta_box_display;\n\n    \/**\n     * Instantiates the class by setting its property equal to a reference to its display.\n     *\/\n    public function __construct() {\n        $this-&gt;meta_box_display = new Meta_Box_Display();\n    }\n\n    \/**\n     * The function responsible for hooking into the WordPress API.\n     *\/\n    public function init() {\n\n        add_meta_box(\n            'three-recent-posts',\n            'Three Recent Posts',\n            array( $this-&gt;meta_box_display, 'display' ),\n            'post',\n            'side'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Och n\u00e4sta, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-01-class-meta-box-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e5r display<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Defines the display for the meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Defines the display for the meta box that will render the content in the\n * context of its meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box_Display {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Post_Messenger\n     *\/\n    private $messenger;\n\n    \/**\n     * Instantiates the object by setting a property equal to that of the class\n     * responsible for rendering the messages from the post query.\n     *\/\n    public function __construct() {\n        $this-&gt;messenger = new Post_Messenger( $this );\n    }\n\n    \/**\n     * If there are posts to display, renders them in the metabox. Otherwise, displays\n     * a note that there are no posts to display.\n     *\/\n    public function display( $message) {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>Att i metaboxkoden, i metaboxkoden instansierar vi uttryckligen displayen s\u00e5 att vi kan kalla dens displaymetod n\u00e4r det beh\u00f6vs.<\/p>\n<p>Ett annat alternativ skulle vara att instansiera de tv\u00e5 objekten separat och sedan injicera displayen i metaboxen via konstruktorinjektion eller n\u00e5got liknande. Detta skulle beh\u00f6va g\u00f6ras i en tredje parts klass.<\/p>\n<p>F\u00f6rdelarna med detta kommer fr\u00e5n att koppla de tv\u00e5 klasserna lite mer. Vi kanske ska granska hur man g\u00f6r detta i n\u00e4sta inl\u00e4gg.<\/p>\n<p>Efter det m\u00e5ste vi g\u00e5 vidare och definiera klassen som \u00e4r ansvarig f\u00f6r att visa meddelanden inom ramen f\u00f6r Meta Box Display. Det h\u00e4r \u00e4r vad vi kommer att kalla <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-02-class-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messenger<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Display content for the meta box when requested.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Retrieves information from the class responsible for querying the database and\n * renders it in the context of our meta box when called via the Meta Box Display.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Messenger {\n\n    \/**\n     * A reference to the query resonsible for retrieving post information from\n     * the database.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * A reference to the message that's displayed in the view of the\n     * meta box.\n     *\n     * @access private\n     *\/\n    private $message;\n\n    \/**\n     * Instantiates the class by setting a reference to the query.\n     *\/\n    public function __construct() {\n        $this-&gt;query = new Post_Query();\n    }\n\n    \/**\n     * Retrieves the content to be displayed in the meta box.\n     *\/\n    public function get_message() {\n\n        $this-&gt;get_description();\n\n        if ($this-&gt;query-&gt;has_posts()) {\n            $this-&gt;get_post_message();\n        } else {\n            $this-&gt;get_no_posts_message();\n        }\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_post_message() {\n        include_once 'post-list.php';\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_description() {\n        include_once 'message-description.php';\n    }\n\n    \/**\n     * Displays a message of there are no recent posts.\n     *\n     * @access private\n     *\/\n    private function get_no_posts_message() {\n        include_once 'no-post-list.php';\n    }\n}\n<\/code><\/pre>\n<p>Observera h\u00e4r att Post Messenger ocks\u00e5 refererar till <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post-fr\u00e5gan<\/a>. Det h\u00e4r \u00e4r klassen d\u00e4r kommunikationen till databasen sker. Jag har ocks\u00e5 inkluderat n\u00e5gra hj\u00e4lpfunktioner f\u00f6r att g\u00f6ra visningskoden lite enklare som vi kommer att se ett \u00f6gonblick.<\/p>\n<pre><code>&lt;?php\n\/**\n * Queries the database for three most recent posts.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Queries the database for three most recent posts. Returns the query to the\n * caller so that it can be interrogates for posts or not.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Query {\n\n    \/**\n     * A reference to the WP_Query this class wraps.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * Instantiates the class by preparing instance data and executing the\n     * query so the display can render the contents.\n     *\/\n    public function __construct() {\n\n        $this-&gt;query = null;\n        $this-&gt;get_posts();\n    }\n\n    \/**\n     * Executes the query for returning the post recent posts ordered by date.\n     *\n     * @access private\n     *\/\n    private function get_posts() {\n\n        $args = array(\n            'post_type'   =&gt; 'post',\n            'post_status' =&gt; 'publish',\n            'orderby'     =&gt; 'date',\n            'order'       =&gt; 'desc',\n        );\n        $this-&gt;query = new WP_Query( $args );\n\n        return $this-&gt;query;\n    }\n\n    \/**\n     * A helper function to determine if the query has any posts.\n     *\/\n    public function has_posts() {\n        return! $this-&gt;query-&gt;have_posts();\n    }\n\n    \/**\n     * A helper function for retrieving the next post in the list of\n     * posts\n     *\/\n    public function the_post() {\n        return $this-&gt;query-&gt;the_post();\n    }\n}\n<\/code><\/pre>\n<p>Och det \u00e4r det f\u00f6r k\u00e4rnklasserna. Naturligtvis beh\u00f6ver vi fortfarande prata om synpunkterna.<\/p>\n<h4>Utsikterna<\/h4>\n<p>Vyerna \u00e4r ansvariga f\u00f6r att rendera HTML i kontexten av metaboxen. Jag gillar inte att skriva HTML inom PHP-sammanhang (och jag gillar inte heller att blanda PHP i HTML-sammanhang, men detta \u00e4r oundvikligt i det h\u00e4r projektet).<\/p>\n<p>Det finns n\u00e5gra bra mallprojekt f\u00f6r att g\u00f6ra det h\u00e4r enklare, men jag avviker. Hur som helst, du kommer att m\u00e4rka att det i <strong>post-list.php-<\/strong> filen finns referenser till hj\u00e4lpfunktioner i klassen Post Query. Detta f\u00f6r att se till att jag inte exponerar f\u00f6r m\u00e5nga egenskaper och bryter mot Demeterlagen.<\/p>\n<p>L\u00e5t oss ta en titt p\u00e5 den filen f\u00f6rst eftersom <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-04-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den \u00e4r den mest komplicerade<\/a> :<\/p>\n<pre><code>&lt;ol&gt;\n    &lt;?php while ($this-&gt;query-&gt;has_posts()) {  ?&gt;\n        &lt;?php $this-&gt;query-&gt;the_post(); ?&gt;\n        &lt;li&gt;\n            &lt;a href=\"&lt;?php get_the_permalink(); ?&gt;\" target=\"_blank\"&gt;\n                &lt;?php echo get_the_title(); ?&gt;\n            &lt;\/a&gt;\n        &lt;\/li&gt;\n    &lt;?php } ?&gt;\n&lt;\/ol&gt;<\/code><\/pre>\n<p>Det ser ut som den d\u00e4r vanliga WordPress-koden, men kom ih\u00e5g att eftersom den h\u00e4r filen anropas i <strong>Post Messenger<\/strong> kommer den att h\u00e4nvisa till fr\u00e5gan som den fr\u00e5ga som lindas av den klassen.<\/p>\n<p>De tv\u00e5 sista filerna \u00e4r ganska okomplicerade. En av dem ger <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-06-message-description-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en beskrivning<\/a> :<\/p>\n<pre><code>&lt;p&gt;\n    &lt;span class=\"description\"&gt;\n        Displays up to the three most recent posts.\n    &lt;\/span&gt;&lt;!-- .description --&gt;\n&lt;\/p&gt;<\/code><\/pre>\n<p>Den andra ger ett meddelande n\u00e4r det inte finns <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-07-no-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e5gra inl\u00e4gg<\/a> :<\/p>\n<pre><code>&lt;p&gt;There are no recent posts.&lt;\/p&gt;<\/code><\/pre>\n<p>Annat \u00e4n det \u00e4r den grundl\u00e4ggande funktionaliteten klar.<\/p>\n<h3>Bootstrapping Plugin<\/h3>\n<p>Det sista vi beh\u00f6ver g\u00f6ra \u00e4r att starta insticksprogrammet. F\u00f6r att g\u00f6ra detta \u00e4ndrar vi koden i huvudpluginfilen s\u00e5 att den ser <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-08-three-recent-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Three Recent Posts\n *\n * @package     TRP\n * @author      Tom McFarlin\n * @copyright   2017 Tom McFarlin\n * @license     MIT\n *\n * @wordpress-plugin\n * Plugin Name: Three Recent Posts\n * Plugin URI:  https:\/\/tommcfarlin.com\/three-recent-posts\/\n * Description: Displays the three mot recent posts in your post editor screen.\n * Version:     0.2.0\n * Author:      Tom McFarlin\n * Author URI:  https:\/\/tommcfarlin.com\n * Text Domain: three-recent-posts\n * License:     GPL\n * License URI: http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n *\/\n\ninclude 'class-meta-box.php';\ninclude 'class-meta-box-display.php';\ninclude 'class-post-messenger.php';\ninclude 'class-post-query.php';\n\nadd_action( 'add_meta_boxes', 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box();\n    $meta_box-&gt;init();\n}\n<\/code><\/pre>\n<p>Det kommer att ansluta till WordPress, instansiera v\u00e5rt plugin och sedan s\u00e4tta ig\u00e5ng det. N\u00e4r du k\u00f6r det i din installation av WordPress b\u00f6r det se ut precis som det gjorde under den f\u00f6rsta versionen.<\/p>\n<p>Den enda skillnaden \u00e4r att vi nu har saker organiserade i klasser snarare \u00e4n individuella funktioner.<\/p>\n<h2>Anteckningar<\/h2>\n<p>F\u00f6r det f\u00f6rsta finns det m\u00f6jligheter till refaktorisering h\u00e4r som skulle minska frikopplingen ytterligare (som olika typer av <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">beroendeinjektion<\/a>, etc.) men syftet med den h\u00e4r serien \u00e4r inte att t\u00e4cka det.<\/p>\n<p>Ist\u00e4llet \u00e4r det att ta tanken p\u00e5 att se plugins skrivna av m\u00e5nga procedurfunktioner och sedan dela upp dem i mer konceptuella klasser som kapslar in deras ansvar.<\/p>\n<p>F\u00f6r det andra, om du granskar k\u00e4llkoden i arkivet f\u00f6r den h\u00e4r versionen av projektet, kommer du att se att jag ocks\u00e5 introducerade composer.json. Detta f\u00f6r att jag ska kunna dra nytta av <a href=\"https:\/\/tommcfarlin.com\/php-codesniffer-with-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP CodeSniffer<\/a> och <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Coding Standards<\/a> n\u00e4r jag skriver kod.<\/p>\n<p>I den sista delen av serien g\u00e5r vi igenom <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/namnutrymmen-och-autoladdning-i-wordpress\/\" title=\"namnavst\u00e5nd\">namnavst\u00e5nd<\/a> och omorganiserar filerna. Om tiden till\u00e5ter kommer vi att inkludera en autoloader s\u00e5 att vi inte beh\u00f6ver inkludera filer manuellt \u00f6verst i v\u00e5r plugin-fil.<\/p>\n<p>Slutligen har jag slagit ihop den h\u00e4r koden <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\/tree\/0.2.1\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">till master och taggat den som 0.2.1<\/a> (eftersom jag var tvungen att g\u00f6ra en liten snabbkorrigering) eftersom det fortfarande \u00e4r ett mycket p\u00e5g\u00e5ende arbete.<\/p>\n<h2>Serie inl\u00e4gg<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/snabb-prototyping-med-wordpress-fraan-koncept-till-plugin\/\" title=\"Snabb prototyping med WordPress: fr\u00e5n koncept till plugin\">Snabb prototyping med WordPress: fr\u00e5n koncept till plugin<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/snabb-prototyping-med-wordpress-konceptanalys\/\" title=\"Snabb prototyping med WordPress: konceptanalys\">Snabb prototyping med WordPress: konceptanalys<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rapid Prototyping: Prototype To Code, del 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-prototype-to-code-del-2\/\" title=\"Rapid Prototyping: Prototype To Code, del 2\">Rapid Prototyping: Prototype To Code, del 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/rapid-prototyping-introduktion-av-autoloading\/\" title=\"Rapid Prototyping: Introduktion av Autoloading\">Rapid Prototyping: Introduktion av Autoloading<\/a><\/li>\n<\/ol>\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 \u00e4r h\u00e4r vi b\u00f6rjar konvertera v\u00e5r prototyp till kod. Det b\u00f6r visa varf\u00f6r det \u00e4r bra att t\u00e4nka efter i ett projekt.<\/p>\n","protected":false},"author":1,"featured_media":223902,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,922,724],"tags":[1173],"class_list":["post-228845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-oevrig","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228845","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=228845"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228845\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223902"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}