{"id":231701,"date":"2022-12-27T11:59:00","date_gmt":"2022-12-27T08:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231701"},"modified":"2022-12-25T22:34:56","modified_gmt":"2022-12-25T19:34:56","slug":"tietokantakyselyt-tietojen-nopeaan-paeivittaemiseen-osa-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/tietokantakyselyt-tietojen-nopeaan-paeivittaemiseen-osa-1\/","title":{"rendered":"Tietokantakyselyt tietojen nopeaan p\u00e4ivitt\u00e4miseen, osa 1"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 ei ole ensimm\u00e4inen kerta, kun mainitsen t\u00e4m\u00e4n, mutta yksi haasteista, jotka liittyv\u00e4t suorien tietokantakyselyjen kirjoittamiseen WordPress-tietokannan tietojen p\u00e4ivitt\u00e4miseen, on se, ett\u00e4 j\u00e4t\u00e4t itsesi avoimeksi jollekin seuraavista:<\/p>\n<blockquote>\n<p>Joo, mutta siell\u00e4 on API, jolla voi tehd\u00e4 jotain juuri tuollaista.<\/p>\n<\/blockquote>\n<p>Ja monissa tapauksissa se on oikein. Olen my\u00f6s niiden k\u00e4yt\u00f6n suuri fani. Mutta on aikoja, jolloin suorat, parametroidut tietokantakyselyt voivat olla optimaalisempi valinta.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159831-61e6fe995df5b.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-159831-61e6fe995df5b.jpg\" alt=\"Tietokantakyselyt tietojen nopeaan p\u00e4ivitt\u00e4miseen, osa 1\" ><\/a><\/p>\n<p>Ei, se ei ole tietokanta, mutta eik\u00f6 olisikin mahtavaa, jos ne n\u00e4ytt\u00e4isiv\u00e4t t\u00e4lt\u00e4? Kuva: Tobias Fischer Unsplashissa<\/p>\n<p>T\u00e4m\u00e4 riippuu tietysti ymp\u00e4rist\u00f6st\u00e4, jossa ty\u00f6skentelet projektisi vaatimusten mukaisesti.<\/p>\n<p>Joten t\u00e4m\u00e4 on j\u00e4lleen yksi viesti, joka havainnollistaa, kuinka k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> :t\u00e4 tietojen nopeaan p\u00e4ivitt\u00e4miseen metatietojen perusteella (ilman <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Queryn<\/a> tai <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Queryn kaltaisten<\/a> tietojen k\u00e4sittely\u00e4).<\/p>\n<h2>Tietokantakyselyt tietojen nopeaan p\u00e4ivitt\u00e4miseen, osa 1<\/h2>\n<p>Aion jakaa t\u00e4m\u00e4n kahteen osaan, koska ensimm\u00e4inen toiminto, jonka aion n\u00e4ytt\u00e4\u00e4 sinulle, tekee useamman kuin yhden asian.<\/p>\n<p>En ole sen fani.<\/p>\n<p>Toiseksi, se on my\u00f6s mahdollisuus suunnitella toimintoja uudelleen toimimaan enemm\u00e4n oliokeskeisemm\u00e4ll\u00e4 tavalla (josta <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">olen fani<\/a> ja jota <a href=\"https:\/\/tommcfarlin.com\/object-oriented-programming-using-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">olen aina iloinen voidessani edist\u00e4\u00e4<\/a> ).<\/p>\n<p>Sallikaa minun kuitenkin toistaiseksi esitell\u00e4 k\u00e4sill\u00e4 oleva ongelma<\/p>\n<ol>\n<li>Tuon v\u00e4h\u00e4n tietoa kolmannen osapuolen API:sta.<\/li>\n<li>Tiedot kartoitetaan wp_posts-taulukkoon sek\u00e4 wp_postmeta-taulukkoon.<\/li>\n<li>Tietyt metatiedot ovat kriteereit\u00e4 viestin tilan m\u00e4\u00e4r\u00e4\u00e4miselle. Tai suoremmin, jos metatiedon pala on olemassa, viestin julkaisutilaksi tulee asettaa luonnos, jotta se ei n\u00e4y p\u00e4\u00e4kyselyss\u00e4.<\/li>\n<\/ol>\n<p>T\u00e4m\u00e4n ratkaisemiseksi on tapahduttava kaksi asiaa:<\/p>\n<ol>\n<li>Tarvitsemme viestien tunnukset,<\/li>\n<li>Ja meid\u00e4n on muutettava viestien tilaa.<\/li>\n<\/ol>\n<p>Ennen kuin m\u00e4\u00e4rit\u00e4mme kyselyt ja muun koodin, oletetaan, ett\u00e4 k\u00e4ytt\u00e4m\u00e4\u00e4mme metaavainta kutsutaan luovasti nimell\u00e4 <strong>acme-status<\/strong>. Ja sill\u00e4 aloitetaan.<\/p>\n<h3>1 Tartu viestitunnukseen liittyv\u00e4ll\u00e4 metaavaimella<\/h3>\n<p>Ensin luodaan funktio nimelt\u00e4 <strong>setInactivePosts.<\/strong> T\u00e4m\u00e4 on yleisemp\u00e4\u00e4 kuin jos ty\u00f6skentelet tietyll\u00e4 toimialueella, mutta ymm\u00e4rr\u00e4t asian.<\/p>\n<p>Sitten aiomme m\u00e4\u00e4ritt\u00e4\u00e4 kyselyn, joka <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-00-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hakee kaikki viestitunnukset, joilla on kyseinen meta-avain<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            'acme-status') );\n\n  \/\/ More to come...\n<\/code><\/pre>\n<p>T\u00e4ss\u00e4 meill\u00e4 on joukko tuloksia. Mutta ennen kuin teemme mit\u00e4\u00e4n, meid\u00e4n on varmistettava, ett\u00e4 meill\u00e4 on tietoja, joita voimme k\u00e4ytt\u00e4\u00e4.<\/p>\n<h3>2 Poistutko aikaisin?<\/h3>\n<p>Ennen kuin jatkamme tietojen p\u00e4ivitt\u00e4mist\u00e4, meid\u00e4n pit\u00e4isi kuitenkin tarkistaa, onko tuloksia. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-01-return-early-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ja jos niit\u00e4 ei ole?<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ If there aren't any results, there's nothing to do.\nif (0 === count($results)) {\n    return;\n}\n\n\/\/ More to come...<\/code><\/pre>\n<p>Sitten voimme hyp\u00e4t\u00e4 ulos.<\/p>\n<h3>3 P\u00e4ivit\u00e4 viestien tila<\/h3>\n<p>Mutta jos tuloksia on, meid\u00e4n pit\u00e4isi iteroida niit\u00e4 ja p\u00e4ivitt\u00e4\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-02-update-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">niiden viestien tila<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\nforeach ($results as $result) {\n    $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            UPDATE $wpdb-&gt;posts\n            SET post_status = %s\n            WHERE ID = %d\n            \",\n            'draft',\n            (int) ($result-&gt;post_id)) );\n}<\/code><\/pre>\n<p>Milt\u00e4 se sitten n\u00e4ytt\u00e4\u00e4 kaikki yhdess\u00e4?<\/p>\n<h3>4 Kaikki yhdess\u00e4<\/h3>\n<p>Kun yhdist\u00e4mme t\u00e4m\u00e4n tarpeellista suuremman funktion, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-03-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4et t\u00e4m\u00e4n<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            'acme-status') );\n\n    \/\/ If there aren't any results, there's nothing to do.\n    if (0 === count($results)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    foreach ($results as $result) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($result-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Mutta seuraavassa viestiss\u00e4 j\u00e4rjest\u00e4mme t\u00e4m\u00e4n hieman uudelleen, jotta siit\u00e4 tulee enemm\u00e4n oliosuuntautunut.<\/p>\n<h3>Huomautus tietokannan yll\u00e4pit\u00e4jille<\/h3>\n<p>Niille teist\u00e4, jotka tuntevat SQL-fun hyvin, tied\u00e4tte, ett\u00e4 t\u00e4m\u00e4 voidaan todenn\u00e4k\u00f6isesti ratkaista yhdell\u00e4 kyselyll\u00e4; T\u00e4m\u00e4n postauksen ja sen j\u00e4lkeisen postauksen tarkoitus on kuitenkin kaksijakoinen:<\/p>\n<ol>\n<li>Osoittaaksesi, kuinka $wpdb:n avulla saavutetaan jotain nopeasti,<\/li>\n<li>Osoittaa, kuinka proseduuraalinen menetelm\u00e4 tehd\u00e4 jotain jaetaan objektiorientoituneeksi tekomenetelm\u00e4ksi.<\/li>\n<\/ol>\n<p>T\u00e4m\u00e4n j\u00e4lkeen kiitos kaikista kyselyist\u00e4. \ud83d\udc4d\ud83c\udffb<\/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>T\u00e4m\u00e4 on j\u00e4lleen yksi viesti, joka havainnollistaa kuinka k\u00e4ytt\u00e4\u00e4 $wpdb:t\u00e4 tietojen nopeaan p\u00e4ivitt\u00e4miseen suorilla tietokantakyselyill\u00e4.<\/p>\n","protected":false},"author":1,"featured_media":237054,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,917,834,843,864],"tags":[1166],"class_list":["post-231701","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-muut","category-opas-aloittelijoille","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231701","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=231701"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231701\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/237054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}