{"id":230801,"date":"2022-12-05T13:40:00","date_gmt":"2022-12-05T10:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230801"},"modified":"2022-11-10T00:03:48","modified_gmt":"2022-11-09T21:03:48","slug":"wordpressin-toimintakoukkujen-perusteet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpressin-toimintakoukkujen-perusteet\/","title":{"rendered":"WordPressin toimintakoukkujen perusteet"},"content":{"rendered":"\n<p>Aina kun joskus alkaa p\u00e4\u00e4st\u00e4 edistyneemp\u00e4\u00e4n ohjelmointiin \u2013 olipa se sitten WordPressiss\u00e4 tai miss\u00e4 tahansa muussa viitekehyksess\u00e4, kirjastossa, perustassa tai ohjelmointikieless\u00e4 \u2013 on aikoja, jolloin uudet k\u00e4sitteet voivat usein olla vaikeampia ymm\u00e4rt\u00e4\u00e4 kuin toiset.<\/p>\n<p>Olen yleens\u00e4 havainnut t\u00e4m\u00e4n olevan totta aina, kun henkil\u00f6 on oppinut esimerkiksi olioohjelmoinnin perusteet, mutta ei ole altistunut tiettyjen asioiden, kuten suunnittelumallien, vivahteille.<\/p>\n<p>Esimerkkitapaus: Olen kirjoittanut <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tapahtumal\u00e4ht\u00f6isest\u00e4 suunnittelumallista<\/a><\/strong> (tai <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">julkaisu-tilauksesta<\/a><\/strong> tai Pub\/Subista, kuten jotkut haluavat viitata siihen) <strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">muissa viesteiss\u00e4.<\/a><\/strong><\/p>\n<p>Kyll\u00e4, jokaisessa on eroja, mutta yleinen ajatus on, ett\u00e4 jotain tapahtuu ja tapahtuma nostetaan ja kaikki, joka kuuntelee t\u00e4t\u00e4 tapahtumaa tai tilaa tapahtuman, reagoi.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7466947738.jpg\" 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-162881-61e7466947738.jpg\" alt=\"WordPressin toimintakoukkujen perusteet\" ><\/a><\/p>\n<p>Kuva: Claus Gr\u00fcnst\u00e4udl Unsplashista<\/p>\n<p>T\u00e4m\u00e4 on WordPressin ensisijainen malli, jonka avulla voimme kirjaimellisesti liitty\u00e4 tiettyihin suorituskohtiin. Voimme yleens\u00e4 k\u00e4sitt\u00e4\u00e4 n\u00e4m\u00e4 toimintakoukut WordPressiss\u00e4.<\/p>\n<p>Joka tapauksessa sovellus tarjoaa tiettyj\u00e4 kohtia, joiden avulla voimme lis\u00e4t\u00e4 omia toimintojamme. Kun t\u00e4m\u00e4 toiminto on rekister\u00f6ity, WordPress j\u00e4tt\u00e4\u00e4 niin sanotusti koodikantansa, hypp\u00e4\u00e4 omaan ja palaa sitten takaisin omaan.<\/p>\n<p>Se on tarpeeksi helppo ymm\u00e4rt\u00e4\u00e4, mutta ent\u00e4 jos haluat paljastaa koodissasi alueita, joiden avulla muut voivat tarttua koodiisi?<\/p>\n<h2>Toimintakoukut WordPressiss\u00e4<\/h2>\n<p>Ennen kuin tarkastellaan, kuinka WordPress toteuttaa n\u00e4m\u00e4 mallit, on t\u00e4rke\u00e4\u00e4 ymm\u00e4rt\u00e4\u00e4 t\u00e4m\u00e4n mallin perusteet. Vaikka t\u00e4m\u00e4 ei suinkaan ole kattava, sen tarkoituksena on antaa perustavanlaatuinen k\u00e4sitys mallista, jotta on mahdollista lukea ja kirjoittaa WordPress-keskeist\u00e4 koodia.<\/p>\n<p>Joten mik\u00e4 on hyv\u00e4 tapa ajatella Pub\/Sub-mallia? <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Wikipedia m\u00e4\u00e4rittelee sen seuraavasti:<\/a><\/strong><\/p>\n<blockquote>\n<p>Ohjelmistoarkkitehtuurissa publish-subscribe on viestimalli, jossa viestien l\u00e4hett\u00e4j\u00e4t, joita kutsutaan julkaisijoiksi, eiv\u00e4t ohjelmoi viestej\u00e4 l\u00e4hetett\u00e4v\u00e4ksi suoraan tietyille vastaanottajille, joita kutsutaan tilaajiksi, vaan luokittelevat julkaistut viestit luokkiin tiet\u00e4m\u00e4tt\u00e4, ketk\u00e4 tilaajat, jos sellaisia \u200b\u200bon., siell\u00e4 voi olla. Vastaavasti tilaajat ilmaisevat kiinnostuksensa yhteen tai useampaan luokkaan ja saavat vain kiinnostavia viestej\u00e4 tiet\u00e4m\u00e4tt\u00e4, mit\u00e4 julkaisijoita on olemassa.<\/p>\n<\/blockquote>\n<h3>Kuvion ymm\u00e4rt\u00e4minen<\/h3>\n<p>T\u00e4m\u00e4 saattaa olla aluksi paljon huomioitavaa. En tied\u00e4, mutta puretaan se:<\/p>\n<ol>\n<li>On olemassa palvelu, meid\u00e4n tapauksessamme WordPress, joka vastaa viestien julkaisemisesta tilaajalle (se ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 tied\u00e4 kuka kuuntelee).<\/li>\n<li>Kun tilaaja kuuntelee, se ryhtyy toimiin aina, kun se kuulee sen.<\/li>\n<li>Kun tilaajan koodi on suoritettu, ohjelma palaa takaisin alkuper\u00e4iseen suorituspisteeseen (johon julkaisija l\u00e4hetti viestin).<\/li>\n<\/ol>\n<p>T\u00e4ss\u00e4 on vivahteita, kuten asynkroninen toiminnallisuus ja muut asiat, mutta se on edistyneemp\u00e4\u00e4 kuin haluaisin t\u00e4ss\u00e4 viestiss\u00e4. Loppujen lopuksi t\u00e4m\u00e4n tarkoituksena on luoda pohja toiminnallisuuden ymm\u00e4rt\u00e4miselle ja toteuttamiselle.<\/p>\n<p>Asynkroninen toiminnallisuus voi p\u00e4\u00e4st\u00e4 ketjutukseen tai Ajaxiin ja ne ovat t\u00e4rkeit\u00e4 aiheita, t\u00e4m\u00e4 ei ole se viesti.<\/p>\n<h3>Milt\u00e4 t\u00e4m\u00e4 n\u00e4ytt\u00e4\u00e4 WordPressiss\u00e4?<\/h3>\n<p>Ehk\u00e4 helpoin tapa kuvata t\u00e4t\u00e4 tietty\u00e4 mallia WordPressiss\u00e4 on k\u00e4ytt\u00e4\u00e4 funktiokutsuja:<\/p>\n<ul>\n<li>do_action<\/li>\n<li>add_action<\/li>\n<\/ul>\n<p>Joskus nimikkeist\u00f6 voi olla h\u00e4mment\u00e4v\u00e4\u00e4, mutta yksinkertaisesti sanottuna <strong>do_action<\/strong> publishes ja tapahtuma ja <strong>add_action-<\/strong> tilaajat tapahtumaan. Tai ehk\u00e4 parempi tapa ajatella asiaa on<strong>:<\/strong><\/p>\n<p>do_action k\u00e4skee WordPressi\u00e4 suorittamaan kaikki lis\u00e4tyt toiminnot.<\/p>\n<p>Joskus on hy\u00f6dyllist\u00e4 muistaa yksinkertaiset lauseet, joilla asiat toimivat. En tied\u00e4, onko yll\u00e4 oleva ilmaus tarttuvin vai mieleenpainuvin, mutta se on jotain, eik\u00f6?<\/p>\n<p>Huomaa lis\u00e4ksi, ett\u00e4 <strong>do_action<\/strong> ja <strong>add_action<\/strong> ovat asioita, jotka ovat WordPressin ydin ja ovat my\u00f6s kehitysty\u00f6mme k\u00e4ytett\u00e4viss\u00e4. Ennen kuin jatkat, katsotaanpa, mit\u00e4 kukin tarkoittaa:<\/p>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">do_actionille<\/a>: _<\/p>\n<blockquote>\n<p>T\u00e4m\u00e4 toiminto k\u00e4ynnist\u00e4\u00e4 kaikki toimintakoukkuun liittyv\u00e4t toiminnot <code>$tag<\/code>. On mahdollista luoda uusia toimintakoukkuja yksinkertaisesti kutsumalla t\u00e4t\u00e4 funktiota ja m\u00e4\u00e4ritt\u00e4m\u00e4ll\u00e4 uuden koukun nimi <code>$tag<\/code>parametrilla.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7466d56bdd.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-162881-61e7466d56bdd.png\" alt=\"WordPressin toimintakoukkujen perusteet\" ><\/a><\/p>\n<p>Tai viel\u00e4 yksinkertaisemmin sanottuna:<\/p>\n<blockquote>\n<p>Suorita toimintoja, jotka on kiinnitetty tiettyyn toimintakoukkuun.<\/p>\n<\/blockquote>\n<p>Kun viitataan koukkuihin, ne voivat olla joko <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Hooks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPressin<\/a><\/strong> m\u00e4\u00e4ritt\u00e4mi\u00e4 koukkuja tai mukautettuja koukkuja, jotka m\u00e4\u00e4rit\u00e4t teemassasi tai laajennuksessasi.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7467368f0b.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-162881-61e7467368f0b.png\" alt=\"WordPressin toimintakoukkujen perusteet\" ><\/a><\/p>\n<p>Mit\u00e4 tulee <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">add_actioniin<\/a> :<\/p>\n<blockquote>\n<p>Toiminnot ovat koukkuja, jotka WordPress-ydin k\u00e4ynnist\u00e4\u00e4 tietyiss\u00e4 kohdissa suorituksen aikana tai kun tiettyj\u00e4 tapahtumia tapahtuu. Lis\u00e4osat voivat m\u00e4\u00e4ritt\u00e4\u00e4, ett\u00e4 yksi tai useampi PHP-toiminto suoritetaan n\u00e4iss\u00e4 kohdissa Action API:n avulla.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7467888f17.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-162881-61e7467888f17.png\" alt=\"WordPressin toimintakoukkujen perusteet\" ><\/a><\/p>\n<p>Ja vastaavasti yksinkertaisemmin sanottuna:<\/p>\n<blockquote>\n<p>Kytkee toiminnon tiettyyn toimintoon.<\/p>\n<\/blockquote>\n<p>K\u00e4yt\u00e4nn\u00f6ss\u00e4 t\u00e4m\u00e4n asettaminen on hieman erilainen, koska k\u00e4yt\u00e4mme yleens\u00e4 <strong>add_action<\/strong> -toimintoa lis\u00e4t\u00e4ksemme oman koodimme WordPressiin.<\/p>\n<h3>K\u00e4yt\u00e4nn\u00f6n esimerkki<\/h3>\n<p>Olet ehk\u00e4 esimerkiksi kirjoittanut jotain <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/035b213bd632d2ab9fc4a79acffa1342\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4llaista:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nadd_action('wp_insert_post_data', __NAMESPACE__. 'processPermalink');\n\/**\n * Processes the permalink so we can remove any characters that may cause a problem when communicating\n * with the API.\n *\n * @param  array $data The array of information about the post.\n * @return array $data The data without the malformed information in the post name for the URL.\n *\/\npublic function processPermalink($data)\n{\n    if (!in_array($data['post_status'], array('draft', 'pending', 'auto-draft'))) {\n        $data['post_name'] =\n            preg_replace(\n                '\/(%ef%b8%8f|\u2122|\u00ae|\u00a9|\u2122|\u00ae|\u00a9|\u2122|\u00ae|\u00a9)\/',\n                '',\n                $data['post_name']\n            );\n    }\n    return $data;\n}\n<\/code><\/pre>\n<p>T\u00e4ss\u00e4 tapauksessa jossain WordPress-koodikannassa on <strong>do_action<\/strong> &#8211; kutsu <strong>wp_insert_post_data<\/strong> -koukalle ja se hyv\u00e4ksyy funktion ja v\u00e4litt\u00e4\u00e4 sille ainakin yhden parametrin.<\/p>\n<h3>Omien koukkujen lis\u00e4\u00e4minen<\/h3>\n<p>Mutta ent\u00e4 jos haluat antaa muille kehitt\u00e4jille mahdollisuuden liitty\u00e4 laajennukseen tai teemaan? Siin\u00e4 tapauksessa sinun tulee k\u00e4ytt\u00e4\u00e4 do_action-toimintoa, ja aiemmin t\u00e4ss\u00e4 asiakirjassa linkitetty sivu tarjoaa kaiken, mit\u00e4 tarvitset t\u00e4m\u00e4n m\u00e4\u00e4ritt\u00e4miseen.<\/p>\n<p>Se on mielest\u00e4ni itse asiassa paljon yksinkertaisempaa kuin <strong>add_action<\/strong> -toiminnon k\u00e4ytt\u00e4minen, koska <strong>add_action<\/strong> edellytt\u00e4\u00e4, ett\u00e4 emme vain liity olemassa olevaan julkaisijaan, vaan lis\u00e4\u00e4mme oman mukautetun logiikkamme.<\/p>\n<p><strong>do_action<\/strong> toisaalta edellytt\u00e4\u00e4, ett\u00e4 annamme suoritettavan funktion nimen ja sitten listan argumenteista, jotka v\u00e4litet\u00e4\u00e4n suoritettavalle funktiolle.<\/p>\n<h2>Se siit\u00e4?<\/h2>\n<p>Suunnilleen niin yksinkertaisilla sanoilla kuin voin tehd\u00e4 sen, kyll\u00e4. Prioriteettiin, argumenttien m\u00e4\u00e4r\u00e4\u00e4n sek\u00e4 nimiavaruuksien ja olioohjelmoinnin kanssa ty\u00f6skentelemiseen liittyy joitain vivahteita. Mutta j\u00e4lleen kerran, se ei kuulu t\u00e4m\u00e4n postauksen soveltamisalaan. Ehk\u00e4 k\u00e4sittelen sit\u00e4 tarkemmin jossain toisessa postauksessa.<\/p>\n<p>Mutta toistaiseksi, jos et ole perehtynyt seuraaviin perusasioihin:<\/p>\n<ul>\n<li>Pub\/Sub-malli,<\/li>\n<li>do_action,<\/li>\n<li>ja add_action<\/li>\n<\/ul>\n<p>Olet nyt tarpeeksi mukava lukea k\u00e4sittelem\u00e4\u00e4si koodia, ymm\u00e4rt\u00e4\u00e4 koodin toimintaa ja jopa toteuttaa omia ratkaisujasi tarvittaessa.<\/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>WordPressin toimintakoukkujen perusteiden ymm\u00e4rt\u00e4minen on t\u00e4rke\u00e4\u00e4, mutta ennen sen tekemist\u00e4 on t\u00e4rke\u00e4\u00e4 tunnistaa taustalla oleva suunnittelumalli.<\/p>\n","protected":false},"author":1,"featured_media":162882,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[864],"tags":[1166],"class_list":["post-230801","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230801","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=230801"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230801\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/162882"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}