{"id":230247,"date":"2022-12-06T13:16:00","date_gmt":"2022-12-06T10:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230247"},"modified":"2022-11-09T20:47:06","modified_gmt":"2022-11-09T17:47:06","slug":"en-enkel-guide-foer-att-organisera-wordpress-centrerade-klasser","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/en-enkel-guide-foer-att-organisera-wordpress-centrerade-klasser\/","title":{"rendered":"En enkel guide f\u00f6r att organisera WordPress-centrerade klasser"},"content":{"rendered":"\n<p>En av de saker som jag har gjort en mycket mer samlad anstr\u00e4ngning, troligen mer \u00e4n jag n\u00e5gonsin har gjort tidigare, \u00e4r att hantera separationen av problem mellan klasserna som ansvarar f\u00f6r gr\u00e4nssnittet med WordPress och de som \u00e4r ansvariga f\u00f6r att arbeta med problemdom\u00e4nen.<\/p>\n<p>L\u00e5t oss till exempel s\u00e4ga att du arbetar med ett plugin och att det kommer att kommunicera med ett tredje parts API. Dessutom kommer detta plugin ocks\u00e5 att erbjuda menyer, inl\u00e4ggstyper, taxonomier och s\u00e5 vidare inom WordPress administrationsomr\u00e5det.<\/p>\n<p>H\u00e4r finns tv\u00e5 ansvarsomr\u00e5den:<\/p>\n<ol>\n<li>det omr\u00e5de som ansvarar f\u00f6r att generellt l\u00f6sa problemet,<\/li>\n<li>omr\u00e5det som ansvarar f\u00f6r gr\u00e4nssnittet med WordPress.<\/li>\n<\/ol>\n<p>Du kan h\u00e4vda att det \u00e4r viktigt att enhetstesta omr\u00e5den som kommunicerar med WordPress, men jag vet ocks\u00e5 att dessa \u00e4r bepr\u00f6vade API:er som har sina egna tester.<\/p>\n<p>Ist\u00e4llet borde vi fokusera p\u00e5 enhetstestning och separera v\u00e5r aff\u00e4rslogik fr\u00e5n WordPress.<\/p>\n<p>Men det \u00e4r inte meningen med det h\u00e4r inl\u00e4gget. Ist\u00e4llet handlar det mer om ett s\u00e4tt att eventuellt l\u00e4gga upp ett projekt n\u00e4r en del av det kommer att ha gr\u00e4nssnitt med WordPress.<\/p>\n<p>Jag har pratat om vikten och f\u00f6rdelarna med namnutrymmen i tidigare inl\u00e4gg s\u00e5 att jag inte ska g\u00e5 f\u00f6r djupt in i den diskussionen h\u00e4r.<\/p>\n<p>Ist\u00e4llet \u00e4r jag intresserad av att prata om att organisera filer p\u00e5 filsystemniv\u00e5 och namnomr\u00e5desniv\u00e5, s\u00e5 att de \u00e4r renodlade i sina specialiseringsomr\u00e5den och s\u00e5 att vi kan se till att vi, s\u00e4g, fokuserar v\u00e5ra enhetstester (och andra testning) p\u00e5 omr\u00e5den som \u00e4r mest kritiska.<\/p>\n<h3>Abstrahera metaboxar<\/h3>\n<p>Jag vill se till att min katalog och filstruktur speglar mina namnomr\u00e5den. Visst, det hj\u00e4lper med filorganisation, men ocks\u00e5 med en konceptuell organisation.<\/p>\n<p>Det vill s\u00e4ga, om jag ska arbeta med metaboxar, d\u00e5 vet jag att jag sannolikt kan hitta metaboxfilerna i en katalog kapslad med den \u00f6verordnade <strong>WordPress-<\/strong> katalogen och sedan i en <strong>Admin-<\/strong> underkatalog f\u00f6ljt av en <strong>MetaBox-<\/strong> katalog.<\/p>\n<p>F\u00f6r det \u00e4ndam\u00e5let, hur kan en upps\u00e4ttning klasser som \u00e4r designade f\u00f6r att arbeta med metaboxar se ut om vi ska skriva kod f\u00f6r dem p\u00e5 ett \u00e5teranv\u00e4ndbart s\u00e4tt? Med tanke p\u00e5 vad vi vet om metaboxar vet vi att vi sannolikt kommer att beh\u00f6va f\u00f6ljande:<\/p>\n<ul>\n<li>en abstrakt klass som definierar inl\u00e4ggstypen som varje metabox kommer att vara bunden till,<\/li>\n<li>tv\u00e5 funktioner f\u00f6r metaboxen \u2013 en f\u00f6r att registrera den, en f\u00f6r att visa inneh\u00e5llet,<\/li>\n<li>en katalog som inneh\u00e5ller vyn eller presentationen av metaboxen,<\/li>\n<li>en fil som kommer att fungera som n\u00e4mnda vy.<\/li>\n<\/ul>\n<p>Med tanke p\u00e5 ovanst\u00e5ende punkter kanske katalogstrukturen skulle se ut s\u00e5 h\u00e4r:<\/p>\n<\/p>\n<p>D\u00e4refter har vi kod som speglar denna struktur. Det vill s\u00e4ga, i v\u00e5r <strong>WordPress-<\/strong> katalog skulle vi ha underkatalogen <strong>Admin<\/strong> eftersom metarutan visas inom administrationsomr\u00e5det f\u00f6r WordPress, och vi skulle ha underkatalogen <strong>Visa<\/strong> som skulle inneh\u00e5lla filen som \u00e4r ansvarig f\u00f6r att visa informationen.<\/p>\n<p>Detta g\u00f6r att vi beh\u00f6ver skapa n\u00e5gra klasser enligt listan ovan. Kanske skulle den abstrakta basklassen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-00-abstract-metabox-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se ut s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeWordPressAdminMetaBox;\n\nabstract class AbstractMetaBox\n{\n    protected $postType;\n\n    public function __construct()\n    {\n        $this-&gt;postType = 'acme_post_type';\n    }\n\n    abstract public function render();\n    abstract public function display();\n}\n<\/code><\/pre>\n<p>Sedan skulle en konkret implementering ut\u00f6ka klassen, och den skulle <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se ut s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeWordPressAdminMetaBox;\n\nclass AcmeMetaBox extends AbstractMetaBox\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function render()\n    {\n        add_meta_box(\n            'acme-product-image',\n            'Product Image',\n            [$this, 'display'],\n            $this-&gt;postType,\n            'side',\n            'default'\n        );\n    }\n\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function display()\n    {\n        include_once plugin_dir_path(__FILE__).'Views\/acme-product-image.php';\n    }\n}\n<\/code><\/pre>\n<p>Och slutligen skulle vyn f\u00f6r klassen inneh\u00e5lla valfri uppm\u00e4rkning och mallkod <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-02-acme-product-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r att rendera information<\/a><\/strong> :<\/p>\n<pre><code>&lt;div class=\"product-image-metabox\"&gt;\n    &lt;p&gt;\n        &lt;img src=\"&lt;?= esc_html(get_post_meta(get_the_ID(), 'product_image', true)); ?&gt;\" alt=\"&lt;?= esc_attr(get_the_title()); ?&gt;\" \/&gt;\n        &lt;input type=\"text\" value=\"&lt;?= esc_html(get_post_meta(get_the_ID(), 'product_image', true)); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Detta ger oss precis vad vi beh\u00f6ver p\u00e5 ett v\u00e4lorganiserat, \u00e5teranv\u00e4ndbart s\u00e4tt f\u00f6r att arbeta med metaboxar. Det kan ocks\u00e5 upprepas f\u00f6r saker som menyer, inl\u00e4ggstyper, taxonomier och s\u00e5 vidare.<\/p>\n<p>Men jag avviker.<\/p>\n<h3>Ett ord om enhetstestning (med PHPUnit)<\/h3>\n<p>Som jag n\u00e4mnde tidigare i inl\u00e4gget tror jag att enhetstestningsklasser som l\u00f6ser problem som \u00e4r unika f\u00f6r v\u00e5rt problemutrymme \u00e4r viktiga. Detta inneb\u00e4r att du m\u00e5ste tala om f\u00f6r din PHPUnit-konfigurationsfil att utesluta dina WordPress-centrerade filer.<\/p>\n<p>F\u00f6rdelen med det jag har lagt upp ovan \u00e4r att detta blir trivialt enkelt. Enkelt uttryckt kan du <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-03-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4gga till detta<\/a><\/strong> till din <strong>phpunit.xml<\/strong> -fil:<\/p>\n<pre><code>&lt;testsuites&gt;\n  &lt;testsuite name=\"Plugin\"&gt;\n    &lt;directory&gt;.\/tests&lt;\/directory&gt;\n    &lt;exclude&gt;.\/tests\/phpunit&lt;\/exclude&gt;\n    &lt;exclude&gt;.\/src\/WordPress&lt;\/exclude&gt;\n  &lt;\/testsuite&gt;\n&lt;\/testsuites&gt;<\/code><\/pre>\n<p>Detta ger dig m\u00f6jligheten att fokusera p\u00e5 att skriva tester specifikt f\u00f6r ditt problemutrymme samtidigt som du ser till att du skriver skalbar, underh\u00e5llbar och \u00e5teranv\u00e4ndbar WordPress-baserad kod.<\/p>\n<p>Jag h\u00e5ller f\u00f6r n\u00e4rvarande p\u00e5 att skriva en e-bok (tillsammans med en m\u00e4ngd annat premiuminneh\u00e5ll). Om du \u00e4r intresserad, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kolla in vad du f\u00e5r<\/a>.<\/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>Att organisera kod f\u00f6r WordPress-centrerade klasser hj\u00e4lper oss att fokusera mer p\u00e5 v\u00e5r dom\u00e4n b\u00e5de n\u00e4r det g\u00e4ller att l\u00f6sa problemet och n\u00e4r det g\u00e4ller att skriva enhetstester.<\/p>\n","protected":false},"author":1,"featured_media":236089,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[724],"tags":[1173],"class_list":["post-230247","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\/230247","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=230247"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230247\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236089"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}