{"id":229408,"date":"2022-11-01T13:52:00","date_gmt":"2022-11-01T10:52:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229408"},"modified":"2022-11-09T06:54:32","modified_gmt":"2022-11-09T03:54:32","slug":"viestin-sisaelloen-suodattaminen-oikein-ja-apply_filters","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/viestin-sisaelloen-suodattaminen-oikein-ja-apply_filters\/","title":{"rendered":"Viestin sis\u00e4ll\u00f6n suodattaminen oikein (ja apply_filters)"},"content":{"rendered":"\n<p>Aina silloin t\u00e4ll\u00f6in, kun ty\u00f6skentelen olemassa olevan l\u00e4hdekoodin parissa tai suoritan koodin tarkastusta, n\u00e4en muiden muokkaavan postausobjektin tekstin sis\u00e4lt\u00f6\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-00-my_content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraavasti<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = $my_content;\n<\/code><\/pre>\n<p>T\u00e4ss\u00e4 vaiheessa jotkut putoavat ja sanovat heti, ett\u00e4 teet sen v\u00e4\u00e4rin. Vihaan t\u00e4t\u00e4 lausetta (ja se on jopa t\u00e4ynn\u00e4 WordPress-koodikantaa, mutta poikkean siit\u00e4).<\/p>\n<p>On olemassa tapoja k\u00e4ytt\u00e4\u00e4 muita olemassa olevia WordPress API -toimintoja tietojen puhdistamiseen ennen kuin ne asetetaan yht\u00e4 suureksi kuin <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Post\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post_content-<\/a> attribuutin arvo. N\u00e4iden toimintojen k\u00e4ytt\u00e4minen ei ole paras tapa tehd\u00e4 se.<\/p>\n<p>Sen sijaan meid\u00e4n kaikkien pit\u00e4isi k\u00e4ytt\u00e4\u00e4 apply_filters -suodatinta. Ongelma? Jotkut eiv\u00e4t tied\u00e4, jotkut eiv\u00e4t tied\u00e4, miten se toimii, ja jotkut eiv\u00e4t osaa k\u00e4ytt\u00e4\u00e4 sit\u00e4. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 ei ole selv\u00e4\u00e4, miten viestien sis\u00e4lt\u00f6 suodatetaan oikein.<\/p>\n<p>WordPressin suodattama raakasis\u00e4lt\u00f6 kirjoitetaan sitten tietokantaan.<\/p>\n<p>Mutta niille, jotka saattavat kuulua johonkin yll\u00e4 olevista luokista, t\u00e4m\u00e4 voi ehk\u00e4 auttaa.<\/p>\n<h2>Viestin sis\u00e4ll\u00f6n suodatus oikein<\/h2>\n<p>T\u00e4ss\u00e4 vaiheessa oletan, ett\u00e4 tied\u00e4t <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Postista<\/a>, sen ominaisuuksista ja niiden muokkaamisesta erilaisten API-toimintojen avulla.<\/p>\n<p>Ensisijainen ongelma, josta puhun, on varmistaa, ett\u00e4 tietokantaan kirjoitettava sis\u00e4lt\u00f6 on muotoiltu samalla tavalla kuin WordPress tekisi sen, jos sinun pit\u00e4isi kirjoittaa tai p\u00e4ivitt\u00e4\u00e4 viesti\u00e4.<\/p>\n<p>Ja tapa, jolla se tapahtuu, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">on seuraava<\/a> (ja p\u00e4\u00e4semme pian yksityiskohtiin):<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Mutta kysymykset siit\u00e4, mit\u00e4 t\u00e4m\u00e4 toiminto tekee, miten se toimii ja milloin sit\u00e4 k\u00e4ytet\u00e4\u00e4n, ovat edelleen olemassa.<\/p>\n<h3>Mik\u00e4 on apply_filters?<\/h3>\n<p>Toki voit lukea kaiken t\u00e4st\u00e4 kehitt\u00e4j\u00e4resursseista, ja se antaa <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraavan m\u00e4\u00e4ritelm\u00e4n<\/a> :<\/p>\n<blockquote>\n<p>Kutsu suodatinkoukkuun lis\u00e4tyt toiminnot.<\/p>\n<\/blockquote>\n<p>Mutta se ei aina auta. Tarkoitan, ett\u00e4 voimme lukea asiakirjat ja silti k\u00e4vell\u00e4 pois h\u00e4mmentyneen\u00e4, eik\u00f6 niin?<\/p>\n<p>Ajattele asiaa n\u00e4in:<\/p>\n<ol>\n<li>Suodatin on toiminto, joka hyv\u00e4ksyy sy\u00f6tteen prosessiin.<\/li>\n<li>Sy\u00f6te k\u00e4sitell\u00e4\u00e4n funktion m\u00e4\u00e4ritelm\u00e4n perusteella.<\/li>\n<li>Funktio palauttaa sitten k\u00e4sitellyn arvon.<\/li>\n<\/ol>\n<p>Se, mit\u00e4 teet palautetulle arvolle, on sinun p\u00e4\u00e4tett\u00e4viss\u00e4si, mutta kun k\u00e4yt\u00e4t suodatinta tai kutsut <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">application_filters<\/a> -komentoa tiedolle, sanot WordPressille: &quot;Minulla on n\u00e4m\u00e4 tiedot, k\u00e4yt\u00e4 t\u00e4ll\u00e4 avaimella tunnistettua suodatinta ja anna tulos takaisin minulle.&quot;<\/p>\n<p>Ei paha, eik\u00f6?<\/p>\n<h3>Kuinka se toimii?<\/h3>\n<p>Mutta yksi osa yll\u00e4 olevasta johtaa kysymykseen. Mainitsen erityisesti, ett\u00e4 &quot;&#8230;ole hyv\u00e4 ja k\u00e4yt\u00e4 t\u00e4ll\u00e4 avaimella tunnistettua suodatinta&#8230;&quot; ja ajatus avaimesta voi olla h\u00e4mment\u00e4v\u00e4 erityisesti siksi, ett\u00e4 suodatin tai toiminto tai yleisemmin sanottuna koukku voidaan tunnistaa niin sanotusta tagista tai avain.<\/p>\n<p>Ne ovat synonyymej\u00e4. Joten kun n\u00e4et <strong>tunnisteen<\/strong> tai <strong>avaimen<\/strong> koukun yhteydess\u00e4, k\u00e4sittele niit\u00e4 sellaisina.<\/p>\n<p>N\u00e4in se toimii seuraavasti:<\/p>\n<ol>\n<li>Apply_filters-funktio hyv\u00e4ksyy kaksi argumenttia. Ensimm\u00e4inen on tunniste tai avain (riippuen siit\u00e4, miksi haluat sit\u00e4 kutsua), joka liittyy suodattimeen (lue: toimintoon), jota haluat k\u00e4ytt\u00e4\u00e4 ty\u00f6n k\u00e4sittelyyn, toinen on arvo, jota haluat k\u00e4sitell\u00e4 mainitussa funktiossa.<\/li>\n<li>Suodatin k\u00e4ynnistyy ja palauttaa tuloksen (tai muista m\u00e4\u00e4ritt\u00e4m\u00e4mme funktion).<\/li>\n<li>Otamme sitten palautetun arvon ja k\u00e4yt\u00e4mme sit\u00e4 mihin tahansa omaisuuteen, jota haluamme.<\/li>\n<\/ol>\n<p>Joten esimerkiksi todenn\u00e4k\u00f6isesti n\u00e4et jotain <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-01-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4llaista<\/a> jonkun muun koodikannassa (tai ehk\u00e4 jopa omassasi):<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = apply_filters( 'the_content', $my_content );\n<\/code><\/pre>\n<p>Ja nyt, kun sinulla on v\u00e4h\u00e4n kontekstia sen toimivuuteen, ymm\u00e4rr\u00e4t idean, eik\u00f6 niin?<\/p>\n<h3>Kuinka k\u00e4yt\u00e4mme sit\u00e4?<\/h3>\n<p>T\u00e4m\u00e4 tuo viestin t\u00e4yden ympyr\u00e4n alkuper\u00e4iseen kysymykseen siit\u00e4, kuinka voimme k\u00e4ytt\u00e4\u00e4 apply_filters -toimintoa post_content-arvoon aina, kun meid\u00e4n on lis\u00e4tt\u00e4v\u00e4 tai p\u00e4ivitett\u00e4v\u00e4 viesti.<\/p>\n<p>Oletetaan siis, ett\u00e4 sinulla on sis\u00e4lt\u00f6, jota haluat k\u00e4ytt\u00e4\u00e4 (tai liitt\u00e4\u00e4) viestin sis\u00e4ll\u00f6n arvoon. Voit tehd\u00e4 jotain <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-02-dont-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4in<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = $new_content;\n<\/code><\/pre>\n<p>Mutta se on huono muoto. Sen sijaan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">teet n\u00e4in<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Ja n\u00e4in WordPress tekee sen.<\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s<\/h2>\n<p>Joten ottaen huomioon kaikki yll\u00e4 olevat tiedot ja koodi, sinun tulee olla hyvin varusteltu varmistaaksesi, ett\u00e4 suodatat tietokantaan lis\u00e4tt\u00e4v\u00e4t tiedot oikein, vaan sinulla on tarvittavat tiedot suodattimiesi m\u00e4\u00e4ritt\u00e4miseen ja niiden k\u00e4ytt\u00e4miseen kaikki sopivaksi katsomasi tiedot.<\/p>\n<p>Mutta esimerkkej\u00e4 siit\u00e4 on sis\u00e4lt\u00f6\u00e4 toiseen viestiin.<\/p>\n<p>Sill\u00e4 v\u00e4lin, jos ty\u00f6skentelet viestisis\u00e4ll\u00f6n kanssa, varmista, ett\u00e4 suodatat tiedot oikein ennen kuin pudotat ne tietokantaan.<\/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>Jos lis\u00e4\u00e4t tai p\u00e4ivit\u00e4t viestej\u00e4 ohjelmallisesti, on t\u00e4rke\u00e4\u00e4 varmistaa, ett\u00e4 suodatat viestien sis\u00e4ll\u00f6n oikein.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,813,803,864],"tags":[1166],"class_list":["post-229408","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-laajennuksia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229408","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=229408"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229408\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}