{"id":230846,"date":"2022-12-06T15:37:00","date_gmt":"2022-12-06T12:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230846"},"modified":"2022-12-06T15:37:29","modified_gmt":"2022-12-06T12:37:29","slug":"luettavien-wordpress-toimintojen-kirjoittamisesta","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/luettavien-wordpress-toimintojen-kirjoittamisesta\/","title":{"rendered":"Luettavien WordPress-toimintojen kirjoittamisesta"},"content":{"rendered":"\n<p>Yksi asia, jota pid\u00e4n jatkuvasti mielenkiintoisena (sek\u00e4 ohjelmoinnin ett\u00e4 WordPressin n\u00e4k\u00f6kulmasta), on t\u00e4m\u00e4:<\/p>\n<p>Pid\u00e4n koodin pit\u00e4misest\u00e4 erill\u00e4\u00e4n siten, ett\u00e4 WordPressin kanssa vuorovaikutuksesta vastaava koodi siirret\u00e4\u00e4n sen nimiavaruuteen, kun taas muu koodimme on nimiavaroitu asianmukaisesti muualle.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/yksinkertainen-opas-wordpress-keskeisten-kurssien-jaerjestaemiseen\/\" title=\"Mielest\u00e4ni t\u00e4m\u00e4 on\">Mielest\u00e4ni t\u00e4m\u00e4 on<\/a><\/strong> kuitenkin ilmeist\u00e4.<\/p>\n<p>Mit\u00e4 tulee koodin kirjoittamiseen, t\u00e4m\u00e4 ei kuitenkaan tarkoita, ett\u00e4 se on j\u00e4tett\u00e4v\u00e4 yksinkertaisesti siihen, miten kirjoitamme ja organisoimme ne. Ent\u00e4 asiat hieman yksityiskohtaisemmalla tasolla?<\/p>\n<p>Eli ent\u00e4 jos katsoisimme menetelmi\u00e4 osana suurempaa kokonaisuutta ja varmistaisimme, ett\u00e4 nekin tekev\u00e4t ty\u00f6ns\u00e4 hyvin? <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Toki Bob Martinin<\/a><\/strong> kaltaiset ihmiset ovat kirjoittaneet t\u00e4llaisista asioista suurimman osan urastaan \u200b\u200bja saarnaaneet sit\u00e4 kaltaisillemme ihmisille.<\/p>\n<p>Mutta n\u00e4m\u00e4 k\u00e4sitteet ovat jotain, mit\u00e4 vain alat tehd\u00e4 ja sitten soveltaa niit\u00e4 lopullisesti. Paradigmat muuttuvat, olemme t\u00e4n\u00e4\u00e4n parempia kuin eilen, ja voi olla useita tapoja saavuttaa samanlainen asia.<\/p>\n<p>Joten kun on kyse luettavien WordPress-toimintojen luomisesta tietylle verkkotunnukselle, milt\u00e4 se voisi n\u00e4ytt\u00e4\u00e4?<\/p>\n<h2>Luettavat WordPress-toiminnot<\/h2>\n<p>Niille, jotka tuntevat <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID<\/a> &#8211; periaatteet tai kaikki, mik\u00e4 puhuu hyv\u00e4n koodin kirjoittamisesta, yksi niist\u00e4 asioista, joista monet kirjoittavat, on menetelm\u00e4n pituus.<\/p>\n<p>Minulla on tapana ottaa ne s\u00e4\u00e4nt\u00f6in\u00e4 enk\u00e4 lakina, koska joskus menetelm\u00e4t eiv\u00e4t vain voi olla niin lyhyit\u00e4. Tarkoitan, ett\u00e4 he voisivat, mutta jossain vaiheessa se tuntuu koodin mikrohallinnolta, eik\u00f6?<\/p>\n<p>Ja tehd\u00e4 jotain tekemisen vuoksi on yksi asia, mutta tehd\u00e4 jotain mielekk\u00e4\u00e4n ohjelmoinnin vuoksi on toinen. Valitsen joka kerta my\u00f6hemmin.<\/p>\n<p>Joka tapauksessa, t\u00e4ss\u00e4 on esimerkki: Oletetaan, ett\u00e4 sinulla on jokin koodi, jota kutsutaan Ajaxin kautta, ja ennen kuin jatkat toimintoa, sinun on tiedett\u00e4v\u00e4, onko mukautettua viestityyppi\u00e4 olemassa.<\/p>\n<p>T\u00e4m\u00e4nkaltaisen tekemisen vaiheet voivat menn\u00e4 seuraavasti:<\/p>\n<ul>\n<li>aloittaa Ajax-puhelun,<\/li>\n<li>tarkista suojaus varmistaaksesi, ett\u00e4 se on kelvollinen pyynt\u00f6,<\/li>\n<li>tarkista, onko tietoja olemassa,<\/li>\n<li>jos on, palauta onnistumisviesti; jos ei, palauta virheilmoitus.<\/li>\n<\/ul>\n<p>Kaikki t\u00e4m\u00e4 voidaan tehd\u00e4 yhdess\u00e4 viestiss\u00e4, toki, mutta oletetaan, ett\u00e4 haluamme kirjoittaa t\u00e4m\u00e4n sarjassa helposti luettavia kutsuja, joissa koodi on jossain m\u00e4\u00e4rin itsedokumentoiva (t\u00e4m\u00e4 ei tarkoita sit\u00e4, ett\u00e4 Vastustan kommentteja \u2013 en ollenkaan, mutta se ei tarkoita, ett\u00e4 haluamme koodimme olevan ep\u00e4selv\u00e4, vai mit\u00e4?).<\/p>\n<p>Ensinn\u00e4kin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajax-puhelu<\/a><\/strong> :<\/p>\n<pre><code>$.get(ajaxurl, {\n    'action': 'getDetails',\n    'security': $('input[name=\"acme-security-nonce\"]').val()\n}, function(response) {\n    if (false === response.success) {\n        \/\/ Handle the case when the request wasn't successful.\n    }\n\n    \/\/ Work with the information that was returned in the response.data property.\n});<\/code><\/pre>\n<p>Sitten <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">meill\u00e4 on<\/a><\/strong> palvelinpuolella toiminto, jolla varmistetaan nimenomaisesti suojaus (t\u00e4m\u00e4 tietysti edellytt\u00e4\u00e4, ett\u00e4 olet m\u00e4\u00e4ritt\u00e4nyt sen oikein k\u00e4ytt\u00f6liittym\u00e4ss\u00e4):<\/p>\n<pre><code>&lt;?php\n\/**\n * @return bool true if we're able to make Ajax requests; otherwise, false\n *\/\nprivate function verifyRequest()\n{\n    return\n        isset($_GET['security']) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4n j\u00e4lkeen haluamme <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tarkistaa, onko tietoja olemassa:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return bool true if there are details; false, otherwise\n *\n * @access private\n *\/\nprivate function doDetailsExist()\n{\n    return (new WP_Query([\n        'post_type' =&gt; 'acme_post_type',\n        'post_status' =&gt; 'publish',\n    ]))-&gt;have_posts();\n}<\/code><\/pre>\n<p>T\u00e4st\u00e4 eteenp\u00e4in voimme ty\u00f6skennell\u00e4 Ajax-vastausobjektin kanssa arvioimalla sen onnistumisominaisuuden ja reagoimalla sen mukaisesti.<\/p>\n<h2>Askeleen pidemm\u00e4lle<\/h2>\n<p>Otetaan t\u00e4m\u00e4 kuitenkin askel pidemm\u00e4lle ja sanotaan, ett\u00e4 tuotteita on olemassa ja haluamme noutaa kaikki niiden viestitunnukset. T\u00e4m\u00e4n tekeminen WP_Queryn avulla on melko helppoa, mutta sanotaanpa, ett\u00e4 haluamme olla suoraan yhteydess\u00e4 tietokantaan.<\/p>\n<p>Huomaa, ett\u00e4 t\u00e4m\u00e4 on pikemminkin harjoitus, jossa n\u00e4ytet\u00e4\u00e4n tapa tehd\u00e4 jotain sen sijaan, ett\u00e4 v\u00e4ittelet <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a><\/strong> :n k\u00e4yt\u00f6st\u00e4 <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Queryn<\/a> kanssa. Siin\u00e4 sis\u00e4lt\u00f6\u00e4 aivan toiseen postaukseen.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.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-162675-61e7429944302.png\" alt=\"Luettavien WordPress-toimintojen kirjoittamisesta\"><\/a><\/p>\n<p>Joka tapauksessa olemme p\u00e4\u00e4tt\u00e4neet, ett\u00e4 dataa on olemassa. Tartutaan siis joukkoon kaikista viestitunnuksista ja palautetaan se tai tyhj\u00e4 taulukko. Ehk\u00e4 t\u00e4m\u00e4 n\u00e4ytt\u00e4isi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jotakuinkin t\u00e4lt\u00e4:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * @return array a numerically indexed array of all detail IDs\n*\/\nprivate function getDetailIds(): array\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\"\n        SELECT meta_value\n        FROM $wpdb-&gt;postmeta\n        WHERE meta_key = %s\n        ORDER BY meta_value ASC\n        \", 'acme_detail_number'),\n        ARRAY_N\n    );\n\n    $detailIds = [];\n    array_push($detailIds, array_map(function ($result) {\n        return $result[0];\n    }, $results));\n\n    return $detailIds[0] ?? $detailIds;\n}<\/code><\/pre>\n<p>Kun arvot on palautettu, voimme k\u00e4ytt\u00e4\u00e4 niit\u00e4 haluamallamme tavalla.<\/p>\n<h2>Mik\u00e4 on t\u00e4m\u00e4n kaiken tarkoitus?<\/h2>\n<p>Yleisesti ottaen sen tarkoituksena on auttaa meit\u00e4 ajattelemaan koodia siten, ett\u00e4 pystymme lukemaan sen melkein mahdollisimman l\u00e4hell\u00e4 kirjoitettua sanaa. Eli voimme osoittaa koodinp\u00e4tk\u00e4lle sanomalla:<\/p>\n<blockquote>\n<p>Ensin katsotaan, onko jotain olemassa. Jos ei, l\u00e4het\u00e4mme virheilmoituksen. muussa tapauksessa nappaamme tiedot ja k\u00e4sittelemme niit\u00e4.<\/p>\n<\/blockquote>\n<p>My\u00f6nnett\u00e4k\u00f6\u00f6n, ett\u00e4 puhun t\u00e4ss\u00e4 v\u00e4hemm\u00e4n konkreettisesti, mutta se johtuu siit\u00e4, etten v\u00e4ltt\u00e4m\u00e4tt\u00e4 tied\u00e4, mink\u00e4 kanssa ty\u00f6skentelet, sen enemp\u00e4\u00e4 kuin tied\u00e4t ty\u00f6st\u00e4ni. Mutta ymm\u00e4rr\u00e4t idean, eik\u00f6?<\/p>\n<p>Ja lis\u00e4ksi, jos haluat yksikk\u00f6testikoodin, joka on irrotettu WordPressist\u00e4, se voidaan tehd\u00e4 k\u00e4ytt\u00e4m\u00e4ll\u00e4 rajapintoja, jotka pilkkaavat toimintoja tai jopa suorittavat suoria kyselyit\u00e4 tietokannasta ilman, ett\u00e4 tarvitset k\u00e4ytt\u00e4\u00e4 WordPressi\u00e4.<\/p>\n<p>Mutta kuten joidenkin edell\u00e4 mainittujen seikkojen kohdalla, se on toisen postauksen aihe.<\/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>Mit\u00e4 luettavien WordPress-toimintojen kirjoittaminen oikeastaan \u200b\u200btarkoittaa? Ei ole olemassa yht\u00e4, t\u00e4ydellist\u00e4 ja tarkkaa oikeaa vastausta, mutta ehk\u00e4 t\u00e4m\u00e4 l\u00e4hestymistapa auttaa.<\/p>\n","protected":false},"author":1,"featured_media":236179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[864],"tags":[1166],"class_list":["post-230846","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\/230846","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=230846"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}