{"id":230296,"date":"2022-11-23T16:12:00","date_gmt":"2022-11-23T13:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230296"},"modified":"2022-11-09T21:00:16","modified_gmt":"2022-11-09T18:00:16","slug":"tyoeskentely-luokkien-mallien-ja-osien-kanssa-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/tyoeskentely-luokkien-mallien-ja-osien-kanssa-wordpressissae\/","title":{"rendered":"Ty\u00f6skentely luokkien, mallien ja osien kanssa WordPressiss\u00e4"},"content":{"rendered":"\n<p>Kun aloin aloittaa t\u00e4m\u00e4n postauksen, aioin kirjoittaa jotain paljon enemm\u00e4n mukana kuin mit\u00e4 aion jakaa. Aluksi halusin k\u00e4yd\u00e4 l\u00e4pi yhden kahdesta asiasta:<\/p>\n<ul>\n<li>T\u00e4ydellinen opas kehitysymp\u00e4rist\u00f6n luomiseen,<\/li>\n<li>Koodilaatuty\u00f6kalujen integrointi PhpStormiin<\/li>\n<\/ul>\n<p>Ensimm\u00e4inen olisi keskitty\u00e4 moniin muihin asioihin, joista olen puhunut, sitoa ne kaikki yhteen ja saada lopullinen viittaus. Mutta t\u00e4m\u00e4 on asia, jonka kokoamiseen haluan k\u00e4ytt\u00e4\u00e4 aikaa varmistaakseni, ett\u00e4 se tehd\u00e4\u00e4n oikein.<\/p>\n<p>Toinen on mielest\u00e4ni t\u00e4rke\u00e4, mutta olen hieman siirtym\u00e4vaiheessa joidenkin omien ty\u00f6kalujeni kanssa. Ennen kuin se on tehty, en mieluummin kirjoita siit\u00e4.<\/p>\n<p>Silti aina on jotain peitett\u00e4v\u00e4\u00e4, eik\u00f6 niin? Joten t\u00e4n\u00e4\u00e4n olen valinnut jotain yksinkertaisempaa: luokkien, mallien ja osien k\u00e4yt\u00f6n erittely WordPress-laajennuksissa yksinkertaisen esimerkin avulla.<\/p>\n<h2>Luokat, mallit ja osat WordPressiss\u00e4<\/h2>\n<p>T\u00e4m\u00e4n nimenomaisen aiheen kohdalla mieleen j\u00e4\u00e4v\u00e4 v\u00e4lit\u00f6n kysymys on yksinkertainen: Miksi vaivautua puhumaan t\u00e4st\u00e4?<\/p>\n<p>Koska on vuosi 2018 ja n\u00e4emme edelleen karkean yhdistelm\u00e4n PHP:t\u00e4, CSS:\u00e4\u00e4, merkint\u00f6j\u00e4 ja JavaScripti\u00e4 yhdess\u00e4 tiedostossa. T\u00e4m\u00e4 ei koske muita tekniikoita, jotka tekev\u00e4t t\u00e4m\u00e4n oletuksena (kuten React). Puhun erityisesti WordPress-laajennuksista ja yll\u00e4pidett\u00e4v\u00e4n koodin kirjoittamisesta siten, ett\u00e4 sit\u00e4 on [ilmeisesti] helppo yll\u00e4pit\u00e4\u00e4, kirjoittaa ja lukea.<\/p>\n<h3>K\u00e4yt\u00e4nn\u00f6n esimerkki<\/h3>\n<p>Oletetaan, ett\u00e4 ty\u00f6skentelet alivalikkosivulla jotain, joka tulee n\u00e4kyviin mukautetun valikon alle. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-00-addmenupage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rekister\u00f6i sivusi<\/a> WordPress API:lla:<\/p>\n<pre><code>&lt;?php\n\npublic function addMenuPage()\n{\n    add_menu_page(\n      'Acme Menu',\n      'Acme Menu',\n      'manage_options',\n      'acme-custom-menu',\n      array($this, 'display'),\n      'dashicons-dashboard',\n      30\n    );\n\n    add_submenu_page(\n      'acme-custom-menu',\n      'Acme Menu',\n      'Acme Menu',\n      'Acme Menu',\n      'acme-custom-menu',\n      array($this, 'display')\n    );\n}\n<\/code><\/pre>\n<p>Mutta kun asetat takaisinsoittotoiminnon sivun n\u00e4ytt\u00e4miseen, et <strong>k\u00e4yt\u00e4<\/strong> toimintoa kaikkien eri kielten sekoittamiseen. Sen sijaan k\u00e4yt\u00e4t sit\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-01-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tiedoston sis\u00e4llytt\u00e4miseen.<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function display()\n{\n    include_once $this-&gt;pluginPath. 'views\/acme-settings.php';\n}\n<\/code><\/pre>\n<p>Huomaa, ett\u00e4 yll\u00e4 olevassa tiedostossa viittaan ominaisuuteen <strong>$this-&gt;pluginPath<\/strong>. T\u00e4m\u00e4 on asetettu luokan rakentajaan, jotta voin helposti k\u00e4ytt\u00e4\u00e4 laajennuksen juurta.<\/p>\n<p>Joka tapauksessa, milt\u00e4 t\u00e4m\u00e4 tiedosto voi n\u00e4ytt\u00e4\u00e4?<\/p>\n<h3>Malli ja osittainen<\/h3>\n<p>T\u00e4ss\u00e4 tapauksessa oletan, ett\u00e4 mallisi on se, joka antaa tietoja k\u00e4ytt\u00e4j\u00e4lle ja pyyt\u00e4\u00e4 h\u00e4nen sy\u00f6tteit\u00e4\u00e4n. Osapuoli on vastuussa onnistumis-, virhe- tai varoitusviestin n\u00e4ytt\u00e4misest\u00e4 k\u00e4ytt\u00e4j\u00e4lle.<\/p>\n<h4>Malli<\/h4>\n<p>Yksinkertaisuuden vuoksi pid\u00e4n sek\u00e4 mallin ett\u00e4 osan mahdollisimman ohuena. T\u00e4ss\u00e4 tapauksessa oletetaan, ett\u00e4 aiomme hahmontaa sivun, pyyd\u00e4mme k\u00e4ytt\u00e4j\u00e4\u00e4 tallentamaan arvon, ja jos arvo tallentuu onnistuneesti (ja on siten <strong>wp_options<\/strong> &#8211; taulukossa), n\u00e4yt\u00e4mme onnistumisviestin.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa:<\/p>\n<ul>\n<li>mallissa n\u00e4kyy sivun otsikko, tiedot, sy\u00f6tt\u00f6 ja tallennuspainike,<\/li>\n<li>osa n\u00e4ytt\u00e4\u00e4 onnistumisviestin tarvittaessa.<\/li>\n<\/ul>\n<p>Katso <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-02-acme-settings-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">alla olevan mallin koodia:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the settings page for the plugin.\n *\/\n?&gt;\n&lt;div class=\"wrap\"&gt;\n    &lt;h1 class=\"wp-heading-inline\"&gt;&lt;?php echo get_admin_page_title(); ?&gt;&lt;\/h1&gt;\n    &lt;?php if ($this-&gt;showSuccessMessage()) { ?&gt;\n      &lt;?php include_once 'partials\/settings-saved.php'; ?&gt;\n    ?&gt;\n    &lt;div id=\"acme-settings-schedule\"&gt;\n        &lt;form id=\"acme-form\" method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n            &lt;!-- This is where your settings go. --&gt;\n            &lt;p&gt;\n                &lt;?php\n                submit_button(\n                    'Save',\n                    'primary',\n                    'acme-save-settings',\n                    false\n                );\n                wp_nonce_field(\n                    'acme-save',\n                    'acme-save-nonce'\n                );\n                ?&gt;\n            &lt;\/p&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Huomaa, ett\u00e4 kyll\u00e4, siin\u00e4 on sy\u00f6tt\u00f6, tallennuspainike ja ei mit\u00e4\u00e4n, jotka kaikki ovat t\u00e4rkeit\u00e4 (mutta t\u00e4m\u00e4n viestin ulkopuolella) tietojen tallentamiseksi.<\/p>\n<p>Mutta huomaa my\u00f6s, ett\u00e4 siin\u00e4 on aputoiminto, jonka avulla tarkistan onnistuneesti tallennettujen tietojen olemassaolon. T\u00e4m\u00e4 funktio sijaitsee samassa luokassa, joka vastaa mallin hahmontamisesta.<\/p>\n<h4>Osittainen<\/h4>\n<p>Se n\u00e4ytt\u00e4\u00e4 jotakuinkin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-03-showsuccessmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function showSuccessMessage()\n{\n  return (false !== get_option('acme_custom_setting'));\n}\n<\/code><\/pre>\n<p>Ja tuloksena oleva osa on <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-04-settings-saved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hyvin yksinkertainen:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the success message if the option has been properly saved.\n *\/\n?&gt;\n\n&lt;div class=\"notice-success notice is-dismissible\"&gt;\n    &lt;p&gt;Your settings have been successfully saved.&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Tietenkin toiminnon toteutus voi vaihdella. Tarkoituksena ei ole niink\u00e4\u00e4n n\u00e4ytt\u00e4\u00e4 kuinka toiminto toteutetaan, vaan kuinka hy\u00f6dynt\u00e4\u00e4 toimintoa tietojen tarkistamiseen osittaisen n\u00e4ytt\u00e4mist\u00e4 varten.<\/p>\n<h2>Siell\u00e4 on enemm\u00e4n (mutta ei t\u00e4\u00e4ll\u00e4)<\/h2>\n<p>Ehk\u00e4 t\u00e4m\u00e4 on jotain, joka pit\u00e4isi sijoittaa artikkelin alkuun.<\/p>\n<p>Ollakseni rehellinen, mielest\u00e4ni se on yksi niist\u00e4 asioista, joissa joidenkin voi olla hy\u00f6dyllisemp\u00e4\u00e4 n\u00e4hd\u00e4 se alusta alkaen (mutta sitten puuttuu koodin konteksti) ja toisten mielest\u00e4 se on hy\u00f6dyllisemp\u00e4\u00e4 lopussa, koska he n\u00e4kev\u00e4t, kuinka se kaikki sopii yhdess\u00e4.<\/p>\n<p>Siit\u00e4 huolimatta toivon, ett\u00e4 se antaa lopulta selvyyden siit\u00e4, kuinka t\u00e4m\u00e4 kaikki sopii yhteen.<\/p>\n<p>Lis\u00e4ksi paikoissa on paljon tilaa mukautetuille asioille, kuten:<\/p>\n<ul>\n<li>tarkistamalla, ett\u00e4 k\u00e4ytt\u00e4j\u00e4ll\u00e4 on tallennusoikeus,<\/li>\n<li>tarkistamalla nonce-arvon,<\/li>\n<li>tietojen desinfiointi ja validointi,<\/li>\n<li>m\u00e4\u00e4ritt\u00e4\u00e4 onnistumisen, varoitukset ja virheet.<\/li>\n<\/ul>\n<p>Mutta jos haluan kattaa kaikki edell\u00e4 mainitut, tarkastelemme poikkeuksellisen pitk\u00e4\u00e4 viesti\u00e4 tai pitk\u00e4\u00e4 viestisarjaa. En vastusta sit\u00e4, mutta se on my\u00f6s jotain, jota en nyt, on vaivan arvoinen t\u00e4ss\u00e4 vaiheessa.<\/p>\n<p>\u00c4l\u00e4 koskaan ep\u00e4r\u00f6i antaa palautetta. Mutta sill\u00e4 v\u00e4lin toivon, ett\u00e4 t\u00e4m\u00e4 kaikki auttaa antamaan sinulle perustan, jolle voit rakentaa seuraavan projektin parissa.<\/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>T\u00e4ss\u00e4 viestiss\u00e4 erittelen luokkien, mallien ja osien k\u00e4yt\u00f6n WordPress-laajennuksissa yksinkertaisella esimerkill\u00e4.<\/p>\n","protected":false},"author":1,"featured_media":164763,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,843,803,864],"tags":[1166],"class_list":["post-230296","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230296","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=230296"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230296\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164763"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}