{"id":232134,"date":"2023-01-08T09:49:00","date_gmt":"2023-01-08T06:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232134"},"modified":"2023-01-08T09:56:50","modified_gmt":"2023-01-08T06:56:50","slug":"rekisterin-tilaajien-ja-palveluiden-kaeyttaeminen-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/rekisterin-tilaajien-ja-palveluiden-kaeyttaeminen-wordpressissae\/","title":{"rendered":"Rekisterin, tilaajien ja palveluiden k\u00e4ytt\u00e4minen WordPressiss\u00e4"},"content":{"rendered":"\n<p><strong>TL;DR:<\/strong> Pid\u00e4n rekisterin, tilaajien ja palveluiden k\u00e4ytt\u00e4mist\u00e4 eritt\u00e4in hy\u00f6dyllisen\u00e4, kun rakennetaan taustakeskeisi\u00e4 laajennuksia ja apuohjelmia WordPressille. T\u00e4m\u00e4 viesti opastaa kuinka se tehd\u00e4\u00e4n.<\/p>\n<hr \/>\n<p>Kun olet ty\u00f6skennellyt vuosien suunnittelumallien, olioohjelmoinnin ja WordPressin parissa, yleisi\u00e4 tapoja ratkaista ongelmia syntyy varmasti.<\/p>\n<p>N\u00e4in saimme alkuun oliopohjaiset suunnittelumallit, joten ehk\u00e4 t\u00e4m\u00e4 on WordPress-keskeinen muunnelma siit\u00e4.<\/p>\n<p>Vaikka olen kirjoittanut esimerkiksi rekisterist\u00e4 aiemmissa artikkeleissa (ja sellaisissa, jotka eiv\u00e4t edes <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/rekisterimallin-kaeyttaeminen-wordpressissae\/\" title=\"ole niin vanhoja\">ole niin vanhoja<\/a> ), ei ole koskaan huono idea palata samaan aiheeseen, varsinkin kun on jotain lis\u00e4tt\u00e4v\u00e4\u00e4 edelliseen osioon.<\/p>\n<h2>Rekisteri, tilaajat ja palvelut<\/h2>\n<p>Kaikki alla kuvattu on ymm\u00e4rrett\u00e4v\u00e4 WordPress-laajennuksen yhteydess\u00e4. Toisin sanoen t\u00e4t\u00e4 ei ole tarkoitus lukea tapana ty\u00f6skennell\u00e4 muiden kehysten, kielten, sovellusten kanssa tai k\u00e4ytett\u00e4ess\u00e4 sit\u00e4 muiden mallien kanssa.<\/p>\n<p>Muista t\u00e4m\u00e4 lukiessasi.<\/p>\n<hr \/>\n<p>Joka tapauksessa yleinen idea n\u00e4iden objektityyppien yhdistelm\u00e4n takana, jos seuraavat:<\/p>\n<ol>\n<li>Rekisteri k\u00e4sittelee kaikki tilaajat,<\/li>\n<li>Tilaajat kuuntelevat WordPressin koukkuja (olemassa olevia tai jopa mukautettuja koukkuja),<\/li>\n<li>Palvelut tekev\u00e4t varsinaisen ty\u00f6n aina, kun tilaaja l\u00e4hett\u00e4\u00e4 ne.<\/li>\n<\/ol>\n<p>Tarkoituksena on, ett\u00e4 ty\u00f6n l\u00e4hett\u00e4misest\u00e4 vastaavat luokat rekister\u00f6id\u00e4\u00e4n yhdess\u00e4 paikassa. Se siit\u00e4.<\/p>\n<p>Lis\u00e4ksi t\u00e4m\u00e4 helpottaa asioiden pit\u00e4mist\u00e4 erill\u00e4\u00e4n, joten jos haluat testata palveluitasi erill\u00e4\u00e4n, se on paljon helpompaa, koska ne eiv\u00e4t v\u00e4ltt\u00e4m\u00e4tt\u00e4 ole tiiviisti kytketty WordPressiin. Ja jos ne ovat, voit pilkata dataa, joka on siirrett\u00e4v\u00e4 tiettyyn funktioon, ja arvioida sitten tuloksen.<\/p>\n<p>T\u00e4m\u00e4 ei kuitenkaan ole artikkeli testaamisesta, joten takaisin varsinaisiin luokkiin.<\/p>\n<h3>Rekisteri<\/h3>\n<p>M\u00e4\u00e4ritelm\u00e4n mukaan rekisterin tarkoitus on pit\u00e4\u00e4 kirjaa asioista. Mit\u00e4 tulee t\u00e4m\u00e4n mallin toteuttamiseen WordPressiss\u00e4, ajatuksena on, ett\u00e4 rekisteri voi seurata tilaajia (jotka m\u00e4\u00e4rit\u00e4n my\u00f6hemmin t\u00e4ss\u00e4 artikkelissa).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.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-158242-61e6dacccb19c.png\" alt=\"Rekisterin, tilaajien ja palveluiden k\u00e4ytt\u00e4minen WordPressiss\u00e4\"><\/a><\/p>\n<p>Kuva <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny<\/a> <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">M\u00fcller<\/a> Unsplashista<a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<p>Lis\u00e4ksi ajatuksena on, ett\u00e4 kun sen aika tulee, mik\u00e4 on todenn\u00e4k\u00f6isesti erilainen laajennuksen rakenteesta riippuen, kaikki tilaajat ovat instantioita. Siihen asti haluat kuitenkin todenn\u00e4k\u00f6isesti tehd\u00e4 sen WordPressin elinkaaren varhaisessa vaiheessa.<\/p>\n<p>T\u00e4ss\u00e4 on kuitenkin esimerkki tilaajien rekister\u00f6innin koodista:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>Seuraavaksi t\u00e4ss\u00e4 on toiminto tilaajien instantoimiseksi.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>N\u00e4m\u00e4 lohkot voivat olla osa samaa toimintoa tai ne voivat olla erillisi\u00e4 tarpeidesi mukaan.<\/p>\n<h3>Tilaajat<\/h3>\n<p>Kuten mainittiin, tilaajat voivat:<\/p>\n<ol>\n<li>Kuuntele tietty\u00e4 koukkua WordPressiss\u00e4<\/li>\n<li>L\u00e4het\u00e4 palvelu suorittamaan kaikki ty\u00f6t, jotka on tarkoitettu kyseiselle koukkuun.<\/li>\n<\/ol>\n<p>Oletetaan siis hetkeksi, ett\u00e4 haluat tehd\u00e4 jotain aina, kun k\u00e4ytt\u00e4j\u00e4 poistetaan. Haluat luoda palvelun tilaajan kautta aina, kun t\u00e4m\u00e4 koukku tapahtuu.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.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-158242-61e6dad44a26f.png\" alt=\"Rekisterin, tilaajien ja palveluiden k\u00e4ytt\u00e4minen WordPressiss\u00e4\"><\/a><\/p>\n<p>Kuva: <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee<\/a> <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Campbell<\/a> Unsplashista<a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<p>Esimerkiksi:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Huomaa, ett\u00e4 tilaaja on tietoinen palvelusta (vaikka se ei olekaan riippuvainen siit\u00e4, koska se on vain v\u00e4litt\u00e4j\u00e4 WordPressin ja palvelun v\u00e4lill\u00e4) ja m\u00e4\u00e4ritt\u00e4\u00e4 koukun palveluun, jonka se luo.<\/p>\n<h3>Palvelut<\/h3>\n<p>Lopuksi palvelut ovat objekteja, jotka tekev\u00e4t kaiken laajennuksen raskaan noston. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 jos heid\u00e4n t\u00e4ytyy lukea tai kirjoittaa tietokantaan, tiedostoj\u00e4rjestelm\u00e4\u00e4n, verkkoon, k\u00e4sitell\u00e4 tietoja jne., kaikki tapahtuu heid\u00e4n kontekstissaan.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.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-158242-61e6dadba8851.png\" alt=\"Rekisterin, tilaajien ja palveluiden k\u00e4ytt\u00e4minen WordPressiss\u00e4\"><\/a><\/p>\n<p>Kuva <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erik<\/a> <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Mclean<\/a> Unsplashista<a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<p>He saattavat olla tietoisia muista luokista, he eiv\u00e4t ehk\u00e4 ole tietoisia. Ne voivat toteuttaa rajapinnan tai abstraktin luokan tai eiv\u00e4t. Se ei todellakaan kuulu t\u00e4m\u00e4n postauksen piiriin. Mutta pointti on, ett\u00e4 ylh\u00e4\u00e4lt\u00e4 koukkua esimerkkin\u00e4 k\u00e4ytt\u00e4en, jos haluat tehd\u00e4 jotain, kun k\u00e4ytt\u00e4j\u00e4 poistetaan, teet sen palvelun sis\u00e4ll\u00e4.<\/p>\n<p>Esimerkiksi:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>Ja siihen se loppuu. Kun palvelu on k\u00e4ynniss\u00e4, hallinta palautetaan WordPressille ja sovellus jatkaa suoritusta normaalisti.<\/p>\n<h3>Kaikki yhdess\u00e4 nyt<\/h3>\n<p>Olettaen, ett\u00e4 sinulla on laajennukselle bootstrap-tiedosto, jota useimmat tekev\u00e4t, koska vaadittu laajennus on m\u00e4\u00e4ritelty t\u00e4ss\u00e4, tarvitaan automaattinen lataus, ja itse laajennus toteutuu.<\/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>Rekisterin, tilaajien ja palvelujen k\u00e4ytt\u00e4minen on hy\u00f6dyllist\u00e4, kun rakennetaan taustakeskeisi\u00e4 laajennuksia ja apuohjelmia WordPressille. T\u00e4m\u00e4 viesti opastaa kuinka se tehd\u00e4\u00e4n.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,834,843,803,864],"tags":[1166],"class_list":["post-232134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opas-aloittelijoille","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232134","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=232134"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232134\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=232134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=232134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=232134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}