{"id":230684,"date":"2022-12-17T14:47:00","date_gmt":"2022-12-17T11:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230684"},"modified":"2022-12-17T14:49:29","modified_gmt":"2022-12-17T11:49:29","slug":"wordpress-widgets-refactoring-del-3","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-3\/","title":{"rendered":"WordPress-widgets: Refactoring, del 3"},"content":{"rendered":"\n<p>N\u00e4r det g\u00e4ller att uppdatera WordPress Widget Boilerplate (som alla sp\u00e5ras i <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utvecklingsgrenen<\/a>) har vi kommit l\u00e5ngt n\u00e4r det g\u00e4ller att omstrukturera hur den \u00e4r organiserad.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e5eea22f.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-161272-61e71e5eea22f.png\" alt=\"WordPress-widgets: Refactoring, del 3\"><\/a><\/p>\n<p>Hittills har vi:<\/p>\n<ul>\n<li>tittat p\u00e5 hur <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-ett-objektorienterat-tillvaegagaangssaett\/\" title=\"WordPress Widget API ger ett exempel\">WordPress Widget API ger ett exempel<\/a> p\u00e5 objektorienterad programmering,<\/li>\n<li>hur vi kan anv\u00e4nda detta API <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-upptaeck-objektorienterad-programmering\/\" title=\"f\u00f6r att best\u00e4mma objektorienterad programmering\">f\u00f6r att best\u00e4mma objektorienterad programmering<\/a> i andra delar av WordPress,<\/li>\n<li>installerade <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-boerjar-med-standarder\/\" title=\"verktyg f\u00f6r att hj\u00e4lpa oss att utv\u00e4rdera\">verktyg f\u00f6r att hj\u00e4lpa oss att utv\u00e4rdera<\/a> kodens kvalitet,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-1\/\" title=\"hittade fel som f\u00f6r n\u00e4rvarande finns i koden\">hittade fel som f\u00f6r n\u00e4rvarande finns i koden<\/a> n\u00e4r det g\u00e4ller moderna programmeringsstandarder,<\/li>\n<li>och b\u00f6rjade omorganisera kodbasen s\u00e5 att den passar med <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-widgets-refactoring-del-2\/\" title=\"mer modern praxis\">mer modern praxis<\/a>.<\/li>\n<\/ul>\n<p>Nu \u00e4r vi redo att b\u00f6rja omfaktorisera den h\u00e4r koden p\u00e5 ett mycket mer objektorienterat s\u00e4tt.<\/p>\n<p>S\u00e5 om du \u00e4nnu inte har hunnit ikapp de tidigare inl\u00e4ggen (n\u00e5gra av dem, verkligen), rekommenderar jag att du g\u00f6r det eftersom det kommer att ta lite tid att uppdatera detta. Det finns mycket kod f\u00f6r att skriva en f\u00f6rklara.<\/p>\n<p>L\u00e5t oss b\u00f6rja.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring, del 3<\/h2>\n<p>Det st\u00f6rsta problemet med Boilerplate \u00e4r utan tvekan att allt \u00e4r inkapslat i en enda klass.<\/p>\n<p>Visst, det finns n\u00e5gra trevliga saker som att h\u00e5lla v\u00e5ra \u00e5sikter \u00e5tskilda fr\u00e5n logiken p\u00e5 serversidan, men det \u00e4r ungef\u00e4r s\u00e5 l\u00e5ngt det g\u00e5r.<\/p>\n<p>Andra problem som uppst\u00e5r bara fr\u00e5n att titta p\u00e5 koden inkluderar:<\/p>\n<ul>\n<li>l\u00e4gga till \u00e5tg\u00e4rder och filter i konstruktorn,<\/li>\n<li>att ha metoder som g\u00f6r mer \u00e4n en sak,<\/li>\n<li>inte ha klasser ansvariga f\u00f6r att implementera saker som att registrera beroenden,<\/li>\n<li>och s\u00e5 vidare.<\/li>\n<\/ul>\n<p>I det h\u00e4r inl\u00e4gget kommer vi att b\u00f6rja processen att skapa abstraktioner som vi s\u00e5 sm\u00e5ningom kommer att implementera f\u00f6r att bryta upp den gudaklassliknande karakt\u00e4ren hos Boilerplate som den ser ut.<\/p>\n<p>Det h\u00e4r kommer att delas upp i flera inl\u00e4gg s\u00e5 att jag kan ge en solid f\u00f6rklaring till varf\u00f6r vi g\u00f6r vissa saker som vi g\u00f6r samt f\u00f6rklara exemplen bakom det.<\/p>\n<p>Om jag g\u00f6r det p\u00e5 n\u00e5got annat s\u00e4tt, utel\u00e4mnar serien f\u00f6r mycket v\u00e4rdefull information som \u00e4r till\u00e4mplig p\u00e5 andra objektorienterade programmeringsmetoder.<\/p>\n<h3>Vad \u00e4r en prenumerant?<\/h3>\n<p>WordPress hook-systemet \u2013 det vill s\u00e4ga de \u00e5tg\u00e4rder och filter vi har tillg\u00e4ngliga \u2013 bygger p\u00e5 ett h\u00e4ndelsedrivet designm\u00f6nster. Detta betyder att n\u00e4r n\u00e5got h\u00e4nder, en h\u00e4ndelse, kommer WordPress att avfyra all annan kod som har prenumererat p\u00e5 h\u00e4ndelsen.<\/p>\n<p><strong>S\u00e5 n\u00e4r vi registrerar en funktion med en hook, prenumererar<\/strong> vi p\u00e5 <strong>eventet<\/strong>. F\u00f6r det \u00e4ndam\u00e5let \u00e4r jag ett fan av att skapa prenumeranter f\u00f6r varje given hook som vi kommer att beh\u00f6va.<\/p>\n<p>Ut\u00f6ver det f\u00f6ljer prenumeranter i allm\u00e4nhet ett konsekvent format. Det betyder att det \u00e4r v\u00e4ldigt enkelt att skapa en abstrakt klass som implementerar en del av den konsekventa funktionaliteten och sedan l\u00e5ter klassen som implementerar den abstrakta klassen fokusera enbart p\u00e5 aff\u00e4rslogik.<\/p>\n<p>Ett av de enklaste s\u00e4tten att visa detta \u00e4r genom att prenumerera p\u00e5 CSS-filer och JavaScript-filer eftersom de \u00e4r tv\u00e5 av de vanligaste sakerna som vi anv\u00e4nder n\u00e4r vi bygger plugins.<\/p>\n<h3>Skapa en abstrakt klass<\/h3>\n<p>Innan vi implementerar den abstrakta klassen, l\u00e5t oss l\u00e4gga ut exakt vad det \u00e4r vi ska g\u00f6ra f\u00f6r att skapa detta.<\/p>\n<ol>\n<li>Vi beh\u00f6ver en fastighet som representerar evenemanget som vi prenumererar p\u00e5.<\/li>\n<li>Vi beh\u00f6ver en funktion f\u00f6r att avfyra n\u00e4r kroken avfyras av WordPress. Ett annat s\u00e4tt att t\u00e4nka p\u00e5 detta \u00e4r att vi beh\u00f6ver en funktion att implementera n\u00e4rhelst en given \u00e5tg\u00e4rd eller filter avfyras av WordPress.<\/li>\n<li>Vi beh\u00f6ver klasser f\u00f6r att implementera abstraktionen.<\/li>\n<\/ol>\n<p>L\u00e5t oss f\u00f6rst definiera abstrakta klasser. <a href=\"https:\/\/secure.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Direkt fr\u00e5n PHP-manualen<\/a> l\u00e4ser vi:<\/p>\n<blockquote>\n<p>Klasser som definieras som abstrakt f\u00e5r inte instansieras, och varje klass som inneh\u00e5ller minst en abstrakt metod m\u00e5ste ocks\u00e5 vara abstrakt. Metoder som definieras som abstrakt deklarerar helt enkelt metodens signatur \u2013 de kan inte definiera implementeringen.<\/p>\n<\/blockquote>\n<p>Kort sagt betyder detta att vi faktiskt inte kan skapa en instans av en abstrakt klass. Vi kan bara instansiera klasser som definierar implementeringen.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e62f02d2.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-161272-61e71e62f02d2.png\" alt=\"WordPress-widgets: Refactoring, del 3\"><\/a><\/p>\n<p>Detta betyder dock inte att den abstrakta klassen inte kan implementera konkreta saker (som definitionen av en krok). Men det betyder att det finns vissa metoder som inte har n\u00e5gon implementering.<\/p>\n<p>Annars har vi bara en grundklass kvar.<\/p>\n<p>Vettigt? L\u00e5t oss ta en titt.<\/p>\n<h3>Skapa en abstrakt klass<\/h3>\n<p>F\u00f6r det h\u00e4r inl\u00e4gget kommer vi att skapa en abstrakt klass specifikt f\u00f6r CSS-filer och JavaScript.<\/p>\n<p>Kom ih\u00e5g, eftersom detta \u00e4r en abstrakt klass, kan de konkreta prenumeranterna kallas n\u00e5got som identifierar vad de g\u00f6r (det vill s\u00e4ga de kan kalla sig vad som helst som representerar deras syfte). Och det ska vi komma till.<\/p>\n<p>Men f\u00f6rst <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-00-abstract-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den abstrakta klassen.<\/a> Jag delar koden och f\u00f6rklarar sedan exakt vad som h\u00e4nder med den:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * An abstract implementation of a subscriber that requires a hook and the ability to\n * start the class.\n *\/\nabstract class AbstractSubscriber\n{\n    \/**\n     * @var string a reference to the hook to which the subscriber should be registered\n     *\/\n    protected $hook;\n\n    \/**\n     * @param string $hook the hook to which the subscriber is registered\n     *\/\n    public function __construct(string $hook)\n    {\n        $this-&gt;hook = $hook;\n    }\n\n    \/**\n     * @return string the hook to which the subscriber is registered\n     *\/\n    public function getHook(): string\n    {\n        return $this-&gt;hook;\n    }\n\n    \/**\n     * Implements the domain logic for the concrete class implementating this subcriber.\n     *\/\n    abstract public function load();\n}\n<\/code><\/pre>\n<ol>\n<li>Observera att egendomen vi har skapat \u00e4r <strong>skyddad<\/strong>. Detta \u00e4r s\u00e5 att implementerande klasser kan komma \u00e5t det, men allt utanf\u00f6r det kan inte.<\/li>\n<li>Jag har skapat en funktion f\u00f6r att h\u00e4mta kroken som kommer att visa sig senare. Vanligtvis hatar jag att implementera funktionalitet som inte \u00e4r direkt uppenbar, men det h\u00e4r \u00e4r n\u00e5got som \u00e4r viktigt med tanke p\u00e5 vart vi \u00e4r p\u00e5 v\u00e4g.<\/li>\n<li>Det finns en abstrakt funktion som kallas <strong>load<\/strong>. Det \u00e4r h\u00e4r varje klass som implementerar den h\u00e4r funktionen kommer att hysa sin aff\u00e4rslogik, som vi kommer att se f\u00f6r en stund.<\/li>\n<li>Jag gillar att dokumentera syftet med funktionerna n\u00e4r det beh\u00f6vs s\u00e5 att de finns p\u00e5 ett st\u00e4lle och l\u00e5ter sedan de implementerande klasserna tillhandah\u00e5lla den dokumentation de beh\u00f6ver tillhandah\u00e5lla i sin implementering. Du kommer att se detta f\u00f6r en stund ocks\u00e5.<\/li>\n<\/ol>\n<p>Nu n\u00e4r vi har f\u00e5tt den abstrakta klassen p\u00e5 plats \u00e4r det sista vi beh\u00f6ver g\u00f6ra att se till att den \u00e4r placerad i r\u00e4tt katalog och med namnavst\u00e5nd. Om du har f\u00f6ljt med fr\u00e5n och med f\u00f6reg\u00e5ende inl\u00e4gg har du troligen kunnat gissa var den kommer att ligga baserat p\u00e5 namnutrymmet i koden.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e66e7d4a.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-161272-61e71e66e7d4a.png\" alt=\"WordPress-widgets: Refactoring, del 3\"><\/a><\/p>\n<p>Och om inte, oroa dig inte. Att ta reda p\u00e5 namnrymder och vad som inte kan ta lite tid. S\u00e5 genom dessa medlemsinl\u00e4gg och dessa exempel \u00e4r det min f\u00f6rhoppning att det blir tydligt med tiden.<\/p>\n<h3>Skapa betongklasser<\/h3>\n<p>L\u00e5t oss nu implementera denna speciella klass f\u00f6r att l\u00e4gga till b\u00e5de stilmallarna och JavaScript-k\u00e4llorna vi har. Vad du dock kommer att m\u00e4rka \u00e4r att de \u00e4r v\u00e4ldigt lika.<\/p>\n<p>Det enda som skiljer sig \u00e4r implementeringen av <strong>laddningsfunktionaliteten<\/strong> vilket \u00e4r exakt hur detta ska fungera.<\/p>\n<h5>Stilmallar<\/h5>\n<p>Med tanke p\u00e5 den abstrakta klassen ovan m\u00e5ste vi nu skapa en klass f\u00f6r att registrera stilmallar. Eftersom vi har tv\u00e5 stilmallar kommer vi att skapa tv\u00e5 klasser:<\/p>\n<ol>\n<li>den f\u00f6rsta klassen kommer att ansvara f\u00f6r att registrera stilarket f\u00f6r instrumentpanelen och specifikt f\u00f6r WordPress-widgetens sida,<\/li>\n<li>den andra klassen kommer att ansvara f\u00f6r att registrera plugin f\u00f6r den faktiska bloggen.<\/li>\n<\/ol>\n<p>L\u00e5t oss kalla var och en av dessa <strong>AdminStylesheetSubscriber<\/strong> respektive <strong>PublicStylesheetSubscriber<\/strong>.<\/p>\n<p>F\u00f6rst, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-03-admin-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">admin stylesheet-prenumeranten<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com?\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the Widget administration page.\n *\/\nclass AdminStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative stylesheet to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/admin.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>L\u00e4gg m\u00e4rke till att detta anv\u00e4nder <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/get_current_screen\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funktionen get_current_screen()<\/a> som jag har anv\u00e4nt i tidigare inl\u00e4gg f\u00f6r att se till att vi bara l\u00e4gger till beroenden d\u00e4r det \u00e4r n\u00f6dv\u00e4ndigt.<\/p>\n<p>Nu, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-05-public-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den offentliga JavaScript-prenumeranten<\/a>. Detta anv\u00e4nder <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_admin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funktionen is_admin()<\/a> f\u00f6r att se till att vi inte \u00e4r i det administrativa omr\u00e5det f\u00f6r WordPress.<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the blog.\n *\/\nclass PublicStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the stylesheet to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/widget.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Uppenbarligen har vi \u00e4nnu inte instansierat dessa klasser. Det kommer senare i serien.<\/p>\n<h5>JavaScript<\/h5>\n<p>JavaScript-prenumeranterna \u00e4r inte mycket annorlunda, som du kanske har gissat. Vi kommer att separera dem baserat p\u00e5 det omr\u00e5de av applikationen som de fokuserar p\u00e5 och vi kommer att namnge dem p\u00e5 l\u00e4mpligt s\u00e4tt.<\/p>\n<p>F\u00f6rst, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-02-admin-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">admin JavaScript-prenumeranten<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the Widget's adminsitration page.\n *\/\nclass AdminScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative JavaScript to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/admin.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Och <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-04-public-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den offentliga JavaScript-prenumeranten:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the blog.\n *\/\nclass PublicScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the JavaScript to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/widget.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>\u00c5terigen, dessa klasser kan \u00e4nnu inte instansieras men vi kommer att fokusera p\u00e5 det i ett kommande inl\u00e4gg.<\/p>\n<h2>Abstraktioner och gr\u00e4nssnitt<\/h2>\n<p>Kom ih\u00e5g att abstraktioner och gr\u00e4nssnitt \u00e4r olika men \u00e4r l\u00e4tta att f\u00f6rv\u00e4xla. Gr\u00e4nssnitt inneh\u00e5ller absolut noll implementering. Ist\u00e4llet ger de en garanti f\u00f6r att alla klasser som implementerar gr\u00e4nssnittet kommer att implementera alla metoder.<\/p>\n<p>Abstrakta klasser, \u00e5 andra sidan, kan ha viss funktionalitet implementerad i den abstrakta klassen samtidigt som den dom\u00e4nspecifika koden \u2013 som laddning av stilmallar och JavaScript \u2013 l\u00e4mnas till l\u00e4mplig metod.<\/p>\n<p>Detta kommer att bli uppenbart, om det inte redan har gjort det, ju l\u00e4ngre vi kommer in i den h\u00e4r serien. Under tiden \u2013 och som vanligt \u2013 gl\u00f6m inte att kolla in <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utveckla<\/a> grenen f\u00f6r att se var vi st\u00e5r med koden.<\/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 st\u00f6rsta problemet med Boilerplate \u00e4r utan tvekan att allt \u00e4r inkapslat i en enda klass. S\u00e5 l\u00e5t oss \u00e4ndra det med abstrakta klasser.<\/p>\n","protected":false},"author":1,"featured_media":235804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[838,807,724,868],"tags":[1173],"class_list":["post-230684","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230684","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=230684"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230684\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/235804"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}