{"id":231128,"date":"2022-12-13T13:10:00","date_gmt":"2022-12-13T10:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231128"},"modified":"2022-12-13T13:10:21","modified_gmt":"2022-12-13T10:10:21","slug":"wordpress-widgetit-oliolaehtoeinen-laehestymistapa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-oliolaehtoeinen-laehestymistapa\/","title":{"rendered":"WordPress-widgetit: oliol\u00e4ht\u00f6inen l\u00e4hestymistapa"},"content":{"rendered":"\n<p>Vuosia sitten loin <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplaten<\/a><\/strong>, jonka tavoitteena on olla seuraava:<\/p>\n<blockquote>\n<p>J\u00e4rjestetty, yll\u00e4pidett\u00e4v\u00e4 pohjalevy widgetien rakentamiseen WordPressin parhaiden k\u00e4yt\u00e4nt\u00f6jen avulla.<\/p>\n<\/blockquote>\n<p>Sen j\u00e4lkeen <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets-sovellusliittym\u00e4ss\u00e4<\/a><\/strong> (jota tarkastelemme my\u00f6hemmin t\u00e4ss\u00e4 viestiss\u00e4) ei ole juurikaan muuttunut, mutta se, mit\u00e4 pid\u00e4n &quot;parhaina k\u00e4yt\u00e4nt\u00f6in\u00e4&quot;, on muuttunut. Lis\u00e4ksi se, miss\u00e4 m\u00e4\u00e4rin t\u00e4m\u00e4 API on mielest\u00e4ni vakaa esimerkki johdanto olio-ohjelmointi WordPressiss\u00e4 on korkea.<\/p>\n<p>Se ei johdu siit\u00e4, ett\u00e4 se k\u00e4ytt\u00e4\u00e4 paljon oliopohjaisia \u200b\u200bperiaatteita, ei siksi, ett\u00e4 se k\u00e4ytt\u00e4\u00e4 nykyaikaisia \u200b\u200bstandardeja (ainakin nykyaikaisen PHP:n osalta), vaan siit\u00e4, ett\u00e4 se k\u00e4ytt\u00e4\u00e4 muutamia asioita, jotka auttavat meit\u00e4 tunnistamaan muutamia, esimerkiksi signaalit WordPressin olio-ohjelmoinnista.<\/p>\n<p>Ja t\u00e4t\u00e4 ei pid\u00e4 aliarvioida: Jos etsit esimerkkej\u00e4 olio-ohjelmoinnista WordPressiss\u00e4, etsi sit\u00e4 k\u00e4ytt\u00e4vi\u00e4 sovellusliittymi\u00e4.<\/p>\n<p>Lis\u00e4ksi, jos etsit tapoja mitata omaa tasosi koodinpalan arvioinnissa (puhumattakaan koodipohjasta) luokkien ja joidenkin OOP:n edistyneempien ominaisuuksien k\u00e4ytt\u00f6\u00e4 varten, miksi et hankkisi jonkinlaista lakmustestill\u00e4 n\u00e4hd\u00e4ksesi kuinka voit?<\/p>\n<\/p>\n<p>Ja Widgets API tekee juuri sen.<\/p>\n<h2>WordPress-widgetit: Johdanto<\/h2>\n<p>Joten pienemm\u00e4ss\u00e4 sarjassa kuin edellisess\u00e4, aion tarkastella Widgets API:a ja tehd\u00e4 muutamia asioita:<\/p>\n<ol>\n<li>n\u00e4ytt\u00e4\u00e4 sinulle widgetin perusrungon ja miksi se on oliosuuntautunut,<\/li>\n<li>keskustella siit\u00e4, mit\u00e4 asioita sinun pit\u00e4isi pysty\u00e4 huomaamaan ja miksi,<\/li>\n<li>p\u00e4ivit\u00e4 Widget Boilerplate ensin suoraan t\u00e4lle sivustolle ja siirr\u00e4 se sitten GitHubiin,<\/li>\n<li>rakentaa widget API:n avulla, jonka pohjana on ty\u00f6mme.<\/li>\n<\/ol>\n<p>Ja t\u00e4ss\u00e4 viestiss\u00e4 aloitamme ensimm\u00e4isest\u00e4 yll\u00e4 olevasta kohdasta.<\/p>\n<h3>Mutta ensin\u2026<\/h3>\n<p>Ennen kuin siirryt t\u00e4h\u00e4n postaukseen, suosittelen lukemaan seuraavat viestit:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"Kaksi olio-ohjelmoinnin pilaria: Osa 1\/2\">Kaksi olio-ohjelmoinnin pilaria: Osa 1\/2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/\" title=\"Olio-ohjelmoinnin kaksi pilaria: Osa 2\/2\">Olio-ohjelmoinnin kaksi pilaria: Osa 2\/2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/abstract-classes-osa-1-abstraktiokaeyttaeytyminen\/\" title=\"Abstract Classes, Osa 1 \u2013 Abstraktiok\u00e4ytt\u00e4ytyminen\">Abstract Classes, Osa 1 \u2013 Abstraktiok\u00e4ytt\u00e4ytyminen<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/abstraktit-luokat-osa-2-abstraktit-luokat-ja-kaeyttoeliittymaet\/\" title=\"Abstraktit luokat, osa 2 \u2013 Abstraktit luokat ja k\u00e4ytt\u00f6liittym\u00e4t\">Abstraktit luokat, osa 2 \u2013 Abstraktit luokat ja k\u00e4ytt\u00f6liittym\u00e4t<\/a><\/strong><\/li>\n<\/ol>\n<p>Kun olet valmis (tai jos sinusta tuntuu, ett\u00e4 sinulla on jo k\u00e4sitys aiheista), olemme valmiita l\u00e4htem\u00e4\u00e4n.<\/p>\n<p>[rajoita maksettua =&quot;true&quot;]<\/p>\n<h2>Widgets API:n perusteet<\/h2>\n<p>Jos luet Widgetien k\u00e4sikirjasivun, n\u00e4et paljon sis\u00e4lt\u00f6\u00e4. T\u00e4m\u00e4 on hyv\u00e4 asia, mutta se ei ole aina paras tapa, kun yrit\u00e4t tislata sis\u00e4lt\u00f6\u00e4 itsellesi kaltaiselle yleis\u00f6lle, kun etsit k\u00e4yt\u00e4nn\u00f6llisi\u00e4, olio-ohjeita.<\/p>\n<p>Joten aion poimia asiaankuuluvat osat API-dokumentaatiosta ja soveltaa niit\u00e4 sitten my\u00f6s toimittamiimme koodiin.<\/p>\n<h3>Mik\u00e4 on widget?<\/h3>\n<p>Luulen, ett\u00e4 useimmat meist\u00e4, jotka ty\u00f6skentelev\u00e4t WordPressin kanssa, tiet\u00e4v\u00e4t, mik\u00e4 widget on, mutta on t\u00e4rke\u00e4\u00e4 m\u00e4\u00e4ritell\u00e4 termi, jotta me kaikki ty\u00f6skentelemme saman idean pohjalta. <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">K\u00e4sikirjassa lukee:<\/a><\/strong><\/p>\n<blockquote>\n<p>Widget on PHP-objekti, joka tulostaa jonkin verran HTML-koodia. Samanlaista widgeti\u00e4 voidaan k\u00e4ytt\u00e4\u00e4 useita kertoja samalla sivulla (esim. Tekstiwidget). Widgetit voivat tallentaa tietoja tietokantaan (asetustaulukkoon).<\/p>\n<\/blockquote>\n<p>Kun t\u00e4m\u00e4 on paikallaan, katsotaanpa mukautetun widgetin koodia, ainakin osa siit\u00e4, ja katsotaan, mit\u00e4 voimme saada selville sen oliosuuntautuneisuudesta.<\/p>\n<h3>Widget-luokka<\/h3>\n<p>Ennen kuin edes katsomme koodia, tied\u00e4mme, ett\u00e4 siell\u00e4 on jonkin verran olio-ohjelmointia, koska dokumentaatio k\u00e4skee meit\u00e4 tekem\u00e4\u00e4n kolme asiaa:<\/p>\n<ol>\n<li>Luo widgetin luokka laajentamalla <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> -standardin luokkaa ja joitakin sen toimintoja.<\/li>\n<li>Rekister\u00f6i widgettisi, jotta se on k\u00e4ytett\u00e4viss\u00e4 <strong>Widgetit<\/strong> &#8211; n\u00e4yt\u00f6ss\u00e4.<\/li>\n<li>Varmista, ett\u00e4 teemassasi on v\u00e4hint\u00e4\u00e4n yksi <strong><a href=\"https:\/\/make.wordpress.org\/docs\/theme-developer-handbook\/theme-functionality\/sidebars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">widget-alue<\/a><\/strong>, johon voit lis\u00e4t\u00e4 widgetej\u00e4.<\/li>\n<\/ol>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 aion keskitty\u00e4 ensimm\u00e4iseen kohtaan (tosin lopulta p\u00e4\u00e4semme siihen, kuinka esittelemme widgetimme teemaan ennen sarjan p\u00e4\u00e4ttymist\u00e4).<\/p>\n<p>Laitetaan siis <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koodi<\/a><\/strong> sellaisena kuin se on esitetty dokumentaatiossa ja puhutaan siit\u00e4, mit\u00e4 voimme oppia siit\u00e4:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Ensinn\u00e4kin huomaamme, ett\u00e4 vaikka m\u00e4\u00e4rittelimme luokan (jolle voimme nimet\u00e4 mit\u00e4 haluamme, minun tavallani), sen on laajennettava <strong>WP_Widget<\/strong>. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 WordPress-ytimess\u00e4 on <strong>WP_Widget-<\/strong> luokka. Voit tarkastella l\u00e4hdekoodin hyvin organisoitua erittely\u00e4 <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-widget.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4ll\u00e4 sivulla.<\/a><\/strong><\/p>\n<p>Toiseksi avainsana <strong>laajenee<\/strong> osoittaa, ett\u00e4 k\u00e4yt\u00e4mme <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP<\/a><\/strong> -perint\u00f6\u00e4, joka on olioohjelmoinnin peruspilari.<\/p>\n<p>Kolmanneksi meid\u00e4n on toteutettava nelj\u00e4 funktiota, joista kaksi vaatii argumentteja. Toiminnot, jotka meid\u00e4n on toteutettava, ovat seuraavat:<\/p>\n<ul>\n<li><strong>__construct()<\/strong>, joka on perusluokan rakentaja. T\u00e4ss\u00e4 meid\u00e4n on varmistettava, ett\u00e4 emoluokan rakentaja kutsutaan, jos sellainen on, ja sitten alustetaan kaikki ominaisuudet, joita katsomme tarpeellisiksi widgetillemme. Tarkastellaan t\u00e4t\u00e4 my\u00f6hemmin sarjassa.<\/li>\n<li><strong>widget()<\/strong> vastaa k\u00e4ytt\u00e4j\u00e4n antaman widgetin sis\u00e4ll\u00f6n tulostamisesta hallinta-alueen k\u00e4ytt\u00f6liittym\u00e4ll\u00e4. Se hyv\u00e4ksyy kaksi parametria &#8211; <strong>$args<\/strong> ja <strong>$instance.<\/strong> <strong>$args<\/strong> &#8211; parametri on tiedot, jotka render\u00f6id\u00e4\u00e4n sivulla, ja <strong>$instance<\/strong> on viittaus widgetin esiintym\u00e4\u00e4n (koska sivulla voidaan hahmontaa useita widgetej\u00e4).<\/li>\n<li><strong>form()<\/strong> n\u00e4ytt\u00e4\u00e4 hallinnollisen k\u00e4ytt\u00f6liittym\u00e4n, jonka kanssa k\u00e4ytt\u00e4j\u00e4 on vuorovaikutuksessa ohjatakseen sivuston k\u00e4ytt\u00f6liittym\u00e4n tulosteita. Se vaatii my\u00f6s argumentin <strong>$instance<\/strong>, jotta annetut tiedot koskevat todellista widgeti\u00e4, jonka kanssa k\u00e4ytt\u00e4j\u00e4 ty\u00f6skentelee (verrattuna kaikkiin widgetin esiintymiin).<\/li>\n<li><strong>update()<\/strong> -funktiota k\u00e4ytet\u00e4\u00e4n arvojen tallentamiseen widgetin nykyiseen esiintym\u00e4\u00e4n. Se hyv\u00e4ksyy kaksi argumenttia. Ensimm\u00e4inen on widgetin uusi ilmentym\u00e4 k\u00e4ytt\u00e4j\u00e4n antamilla p\u00e4ivitysarvoilla (ajattele aktiivisen tekstiwidgetin arvon p\u00e4ivitt\u00e4mist\u00e4) ja toinen argumentti on widgetin vanhan esiintym\u00e4n tai ehk\u00e4 edellisen esiintym\u00e4n tai kenties &quot; tapaus, jolla oli aikaisemmat arvot.&quot;<\/li>\n<\/ul>\n<p>N\u00e4m\u00e4 nelj\u00e4 toimintoa on otettava k\u00e4ytt\u00f6\u00f6n osana widget-sovellusliittym\u00e4\u00e4, osana toimintojen perimist\u00e4 laajennetusta k\u00e4ytt\u00f6liittym\u00e4st\u00e4 ja tuottamaan widgetin perustoiminnot.<\/p>\n<p>T\u00e4m\u00e4 ei tarkoita, etteik\u00f6 lis\u00e4\u00e4 voisi lis\u00e4t\u00e4, mutta hyv\u00e4ll\u00e4 oliopohjaisella tavalla olisi todenn\u00e4k\u00f6isesti parasta siirt\u00e4\u00e4 t\u00e4m\u00e4 k\u00e4ytt\u00e4ytyminen muihin luokkiin. Mutta tarkastelemme sit\u00e4 my\u00f6hemmin sarjassa, kun luomme omaa widgeti\u00e4.<\/p>\n<h3>Mitk\u00e4 ovat t\u00e4rkeimm\u00e4t takeawayt?<\/h3>\n<p>Varmistaakseni, ett\u00e4 ymm\u00e4rr\u00e4n selv\u00e4sti, mit\u00e4 t\u00e4st\u00e4 viestist\u00e4 ymm\u00e4rret\u00e4\u00e4n, se on seuraava:<\/p>\n<ul>\n<li>Widgets API on oliosuuntautunut. Se ei ole vain oliosuuntautunut, koska se k\u00e4ytt\u00e4\u00e4 luokkaa (vaikka se on varmasti hyv\u00e4 l\u00e4ht\u00f6kohta), vaan my\u00f6s siksi, ett\u00e4 se perii toiminnallisuuden, joka on rakennettu jo olemassa olevaan perusluokkaan.<\/li>\n<li>Aina kun perimme k\u00e4ytt\u00e4ytymisen perusluokalta tai yl\u00e4luokalta, saamme valmiiksi kehitettyj\u00e4 toimintoja ilmaiseksi. Se on todella hieno asia olio-ohjelmoinnissa, koska sen avulla voimme keskitty\u00e4 erityisesti ohjelmointilogiikkaan, jota haluamme toteuttaa.<\/li>\n<\/ul>\n<p>Kuvittele hetkeksi, ett\u00e4 haluat kehitt\u00e4\u00e4 widgetin, mutta joka kerta, kun teet sen, sinun on kirjoitettava kaikki toiminnot koukkuihin WordPressiin, jotta voit tehd\u00e4 kaikki samat toistuvat lis\u00e4ykset.<\/p>\n<p>T\u00e4ss\u00e4 tulee esiin perinn\u00f6llisyys ja olio-ohjelmointi. Toistuva koodi abstrahoidaan perusluokkaan, joten se kirjoitetaan vain kerran ja sitten koodi, johon haluamme keskitty\u00e4, j\u00e4tet\u00e4\u00e4n meid\u00e4n toteutettavaksi.<\/p>\n<p>Kaikki edell\u00e4 mainitut asiat on ymm\u00e4rrett\u00e4v\u00e4, kun luetaan t\u00e4m\u00e4 WordPressin oliopohjaisen perussovellusliittym\u00e4n l\u00e4hdekoodin ensimm\u00e4inen passi.<\/p>\n<h2>Mit\u00e4 seuraavaksi?<\/h2>\n<p>T\u00e4m\u00e4n sarjan seuraavassa viestiss\u00e4 tarkastelemme Widgets API:n oliol\u00e4ht\u00f6ist\u00e4 luonnetta ja sit\u00e4, mit\u00e4 asioita sinun pit\u00e4isi pysty\u00e4 havaitsemaan v\u00e4litt\u00f6m\u00e4sti lukemalla koodi.<\/p>\n<p>T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 on t\u00e4rke\u00e4\u00e4 tunnistaa tietyt olioperiaatteet k\u00e4yt\u00e4nn\u00f6ss\u00e4, ja t\u00e4m\u00e4 on hyv\u00e4 tapa arvioida, pystytk\u00f6 siihen vai et. Jos olet, hienoa! Sitten se auttaa edelleen kehitt\u00e4m\u00e4\u00e4n lihaksia. Jos ei, ei h\u00e4t\u00e4\u00e4 \u2013 se silti auttaa sinua kehitt\u00e4m\u00e4\u00e4n lihaksia.<\/p>\n<p>Ja se palvelee sinua hyvin, kun siirrymme yh\u00e4 enemm\u00e4n oliol\u00e4ht\u00f6iseen WordPress-kehitykseen k\u00e4yt\u00e4nn\u00f6n keinoin.<\/p>\n<p>Tarvittava teoria on k\u00e4sitelty. Joten aloitetaan sen toteuttaminen k\u00e4yt\u00e4nn\u00f6ss\u00e4.<\/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>WordPress Widgets API auttaa tarjoamaan vankan lakmustestin ja esimerkin siit\u00e4, kuinka p\u00e4\u00e4set alkuun olio-ohjelmoinnin kanssa WordPressiss\u00e4.<\/p>\n","protected":false},"author":1,"featured_media":236133,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,803,864],"tags":[1166],"class_list":["post-231128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231128","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=231128"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231128\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236133"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}