{"id":230837,"date":"2022-12-06T12:54:00","date_gmt":"2022-12-06T09:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230837"},"modified":"2022-11-10T00:13:44","modified_gmt":"2022-11-09T21:13:44","slug":"yksinkertainen-opas-wordpress-keskeisten-kurssien-jaerjestaemiseen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/yksinkertainen-opas-wordpress-keskeisten-kurssien-jaerjestaemiseen\/","title":{"rendered":"Yksinkertainen opas WordPress-keskeisten kurssien j\u00e4rjest\u00e4miseen"},"content":{"rendered":"\n<p>Yksi asioista, joita olen ponnistellut paljon yhten\u00e4isemmin, todenn\u00e4k\u00f6isesti enemm\u00e4n kuin koskaan ennen, on huolenaiheiden erottaminen WordPressin ja ongelma-alueen kanssa ty\u00f6skentelyst\u00e4 vastaavien luokkien v\u00e4lill\u00e4.<\/p>\n<p>Oletetaan esimerkiksi, ett\u00e4 ty\u00f6skentelet laajennuksen parissa ja se kommunikoi kolmannen osapuolen API:n kanssa. Lis\u00e4ksi t\u00e4m\u00e4 laajennus tarjoaa my\u00f6s valikoita, viestityyppej\u00e4, taksonomioita ja niin edelleen WordPressin hallinta-alueella.<\/p>\n<p>T\u00e4ss\u00e4 on kaksi vastuualuetta:<\/p>\n<ol>\n<li>alue, joka vastaa ongelman yleisest\u00e4 ratkaisemisesta,<\/li>\n<li>alue, joka vastaa WordPressin k\u00e4ytt\u00f6liittym\u00e4st\u00e4.<\/li>\n<\/ol>\n<p>Voit todeta, ett\u00e4 WordPressin kanssa kommunikoivien testialueiden yhdist\u00e4minen on t\u00e4rke\u00e4\u00e4, mutta tied\u00e4n my\u00f6s, ett\u00e4 n\u00e4m\u00e4 ovat kokeiltuja ja oikeita API-liittymi\u00e4, joilla on omat testins\u00e4.<\/p>\n<p>Sen sijaan meid\u00e4n pit\u00e4isi keskitty\u00e4 yksikk\u00f6testaukseen ja erottaa liiketoimintalogiikkamme WordPressist\u00e4.<\/p>\n<p>Mutta se ei ole t\u00e4m\u00e4n postauksen tarkoitus. Sen sijaan kyse on tavasta mahdollisesti laatia projekti, kun osa siit\u00e4 on vuorovaikutuksessa WordPressin kanssa.<\/p>\n<p>Olen puhunut nimiavaruuksien t\u00e4rkeydest\u00e4 ja eduista aikaisemmissa viesteiss\u00e4ni, jotta en sukeltaa liian syv\u00e4lle t\u00e4h\u00e4n keskusteluun t\u00e4\u00e4ll\u00e4.<\/p>\n<p>Sen sijaan olen kiinnostunut keskustelemaan tiedostojen j\u00e4rjest\u00e4misest\u00e4 tiedostoj\u00e4rjestelm\u00e4tasolla ja nimiavaruuden tasolla, jotta ne erotettaisiin selke\u00e4sti erikoisaloihinsa ja jotta voimme varmistaa, ett\u00e4 esimerkiksi keskit\u00e4mme yksikk\u00f6testej\u00e4mme (ja muita testaus) kriittisimmill\u00e4 alueilla.<\/p>\n<h3>Tiivistelev\u00e4t metalaatikot<\/h3>\n<p>Haluan varmistaa, ett\u00e4 hakemistoni ja tiedostorakenteeni heijastavat nimiavaruuksieni rakennetta. Toki se auttaa tiedostojen j\u00e4rjest\u00e4misess\u00e4, mutta my\u00f6s k\u00e4sitteellisess\u00e4 organisoinnissa.<\/p>\n<p>Eli jos aion ty\u00f6skennell\u00e4 metalaatikoiden kanssa, tied\u00e4n, ett\u00e4 l\u00f6yd\u00e4n todenn\u00e4k\u00f6isesti metalaatikkotiedostot hakemistosta, joka on sis\u00e4kk\u00e4inen <strong>WordPress<\/strong> -emohakemiston kanssa ja sitten <strong>Admin<\/strong> &#8211; alihakemistosta, jota seuraa <strong>MetaBox-<\/strong> hakemisto.<\/p>\n<p>Milt\u00e4 sit\u00e4 varten luokkien joukko, joka on suunniteltu ty\u00f6skentelem\u00e4\u00e4n metalaatikoiden kanssa, voisi n\u00e4ytt\u00e4\u00e4, jos meid\u00e4n pit\u00e4isi kirjoittaa niille koodi uudelleen k\u00e4ytett\u00e4v\u00e4ll\u00e4 tavalla? Koska tied\u00e4mme metalaatikoista, tied\u00e4mme, ett\u00e4 tarvitsemme todenn\u00e4k\u00f6isesti seuraavan:<\/p>\n<ul>\n<li>abstrakti luokka, joka m\u00e4\u00e4ritt\u00e4\u00e4 viestityypin, johon kukin metalaatikko sidotaan,<\/li>\n<li>kaksi toimintoa metalaatikolle \u2013 yksi sen rekister\u00f6inti\u00e4, yksi sis\u00e4ll\u00f6n n\u00e4ytt\u00e4mist\u00e4 varten,<\/li>\n<li>hakemisto, joka sis\u00e4lt\u00e4\u00e4 metalaatikon n\u00e4kym\u00e4n tai esityksen,<\/li>\n<li>tiedosto, joka toimii mainittuna n\u00e4kym\u00e4n\u00e4.<\/li>\n<\/ul>\n<p>Yll\u00e4 olevat seikat huomioon ottaen hakemistorakenne voisi ehk\u00e4 n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/p>\n<\/p>\n<p>Seuraavaksi meill\u00e4 on koodi, joka heijastaa t\u00e4t\u00e4 rakennetta. Eli <strong>WordPress<\/strong> -hakemistossamme olisi <strong>Admin<\/strong> &#8211; alihakemisto, koska metaruutu n\u00e4kyy WordPressin hallinta-alueella, ja meill\u00e4 olisi <strong>N\u00e4yt\u00e4<\/strong> &#8211; alihakemisto, joka sis\u00e4lt\u00e4\u00e4 tietojen n\u00e4ytt\u00e4misest\u00e4 vastaavan tiedoston.<\/p>\n<p>T\u00e4m\u00e4n vuoksi meid\u00e4n on luotava muutama yll\u00e4 lueteltu luokka. Ehk\u00e4 abstrakti perusluokka n\u00e4ytt\u00e4isi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-00-abstract-metabox-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4:<\/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>Sitten konkreettinen toteutus laajentaisi luokkaa, ja se n\u00e4ytt\u00e4isi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4:<\/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>Ja lopuksi, luokan n\u00e4kym\u00e4 sis\u00e4lt\u00e4isi merkint\u00e4- ja mallikoodin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-02-acme-product-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tietojen render\u00f6inti\u00e4 varten<\/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>T\u00e4m\u00e4 antaa meille juuri sen, mit\u00e4 tarvitsemme hyvin organisoidussa, uudelleenk\u00e4ytett\u00e4v\u00e4ss\u00e4 ty\u00f6skentelyss\u00e4 metalaatikoiden kanssa. Se voidaan my\u00f6s toistaa esimerkiksi valikoissa, viestityypeiss\u00e4, taksonomioissa ja niin edelleen.<\/p>\n<p>Mutta poikkean.<\/p>\n<h3>Sana yksikk\u00f6testauksesta (PHPUnitilla)<\/h3>\n<p>Kuten aiemmin postauksessa mainitsin, uskon, ett\u00e4 yksikk\u00f6testausluokat, jotka ratkaisevat ongelmatilanteemme ainutlaatuisia ongelmia, ovat t\u00e4rkeit\u00e4. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 sinun on kerrottava PHPUnit-m\u00e4\u00e4ritystiedostollesi j\u00e4tt\u00e4m\u00e4\u00e4n WordPress-keskeiset tiedostosi pois.<\/p>\n<p>Edell\u00e4 esitt\u00e4m\u00e4ni etuna on, ett\u00e4 t\u00e4st\u00e4 tulee triviaalisen helppoa. Yksinkertaisesti sanottuna voit <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-03-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lis\u00e4t\u00e4 t\u00e4m\u00e4n<\/a><\/strong> phpunit.xml <strong>&#8211;<\/strong> tiedostoosi:<\/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>T\u00e4m\u00e4 antaa sinulle mahdollisuuden keskitty\u00e4 testien kirjoittamiseen erityisesti ongelmatilanteeseesi ja samalla varmistaa, ett\u00e4 kirjoitat skaalautuvaa, yll\u00e4pidett\u00e4v\u00e4\u00e4 ja uudelleen k\u00e4ytett\u00e4v\u00e4\u00e4 WordPress-pohjaista koodia.<\/p>\n<p>Kirjoitan t\u00e4ll\u00e4 hetkell\u00e4 e-kirjaa (monenlaisen muun premium-sis\u00e4ll\u00f6n ohella). Jos olet kiinnostunut, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">katso mit\u00e4 saat<\/a>.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Koodin j\u00e4rjest\u00e4minen WordPress-keskeisille tunneille auttaa meit\u00e4 keskittym\u00e4\u00e4n enemm\u00e4n toimialueeseemme sek\u00e4 ongelman ratkaisemisen ett\u00e4 yksikk\u00f6testien kirjoittamisen kannalta.<\/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":[719],"tags":[1166],"class_list":["post-230837","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230837"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230837\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236089"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}