{"id":229600,"date":"2022-11-06T11:09:00","date_gmt":"2022-11-06T08:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229600"},"modified":"2022-11-09T08:38:47","modified_gmt":"2022-11-09T05:38:47","slug":"wordpress-kyselyt-in-lauseilla-kuka-tiesi","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-kyselyt-in-lauseilla-kuka-tiesi\/","title":{"rendered":"WordPress-kyselyt IN-lauseilla (kuka tiesi)?"},"content":{"rendered":"\n<p>Hieman yli vuosi sitten kirjoitin viestin <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Queryn<\/a><\/strong> k\u00e4ytt\u00e4misest\u00e4 aina, kun sinulla on <a href=\"https:\/\/tommcfarlin.com\/wp_query-and-multiple-meta-keys\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">avaimia<\/a>, joita haluat k\u00e4ytt\u00e4\u00e4 tietojen hakemiseen tietokannasta.<\/p>\n<p>Ent\u00e4 jos sinulla on useita erilaisia \u200b\u200bavaimia, jotka johtaisivat todella pitk\u00e4n taulukon luomiseen <strong>WP_Meta_Query-<\/strong> luokassa? Ent\u00e4 jos sinun pit\u00e4isi esimerkiksi k\u00e4yd\u00e4 l\u00e4pi tietokokoelma ennen kyselyn m\u00e4\u00e4ritt\u00e4mist\u00e4?<\/p>\n<p>Jollain tasolla saattaa tuntua, ett\u00e4 luonnollinen asia olisi:<\/p>\n<ol>\n<li>iteroida l\u00e4pi avainkokoelman,<\/li>\n<li>rakentaa tuloksia dynaamisesti,<\/li>\n<li>yhdist\u00e4 ne yhdeksi tulossarjaksi,<\/li>\n<li>sitten ty\u00f6skentele sen kanssa, mit\u00e4 sinulle annetaan.<\/li>\n<\/ol>\n<p>Mutta eik\u00f6 se kuulosta hieman hankalalta (puhumattakaan hitaalta)?<\/p>\n<p>Mit\u00e4 tulee WordPress API:n k\u00e4ytt\u00f6\u00f6n, teen kaikkeni pysy\u00e4kseni siin\u00e4 ennen kuin puhun esimerkiksi suoraan tietokantaan, mutta joskus on my\u00f6s j\u00e4rkev\u00e4\u00e4 kirjoittaa raakakysely kuin kirjoittaa jonkinlainen \u00e4lyk\u00e4s koodi. jotta WordPress API toimisi.<\/p>\n<p>Ennen kuin aloitan perustelut sille, miksi olen tehnyt asioita, jotka minulla on, haluan selitt\u00e4\u00e4 ongelman ja l\u00e4hestymistavan. T\u00e4m\u00e4 todenn\u00e4k\u00f6isesti s\u00e4\u00e4st\u00e4\u00e4 jonkun hypp\u00e4\u00e4m\u00e4st\u00e4 kommentteihin ennenaikaisesti.<\/p>\n<p>T\u00e4ll\u00e4 kuvakaappauksella ei ole mit\u00e4\u00e4n tekemist\u00e4 kyselyn kanssa. Vain kuva IDE:st\u00e4 huvin vuoksi.<\/p>\n<p>Joten t\u00e4ss\u00e4:<\/p>\n<ul>\n<li>Minulla on vakioarvoja, joita k\u00e4ytet\u00e4\u00e4n lopulta metatietojen ottamiseen ja mukautetun viestityypin luomiseen niist\u00e4 (koska ne on tuotu kolmannen osapuolen l\u00e4hteest\u00e4).<\/li>\n<li>Olen suuri kannattaja kyselyiden parametroinnissa (ja siten <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Protect_Queries_Against_SQL_Injection_Attacks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valmistelun<\/a> k\u00e4ytt\u00e4misess\u00e4) varmistaakseni, ett\u00e4 tiedot ovat oikein kyselyit\u00e4 tietokantaa vastaan. Valitettavasti n\u00e4in ei tapahtunut, kun yritettiin suorittaa t\u00e4t\u00e4 kysely\u00e4. Selit\u00e4n miksi my\u00f6hemmin t\u00e4ss\u00e4 viestiss\u00e4.<\/li>\n<li>Joten ota taulukko ja sen muuntaminen merkkijonoksi on hy\u00f6dyllist\u00e4, mutta se ei silti ratkaise ongelmaa, miksi tavallinen <strong>valmistelutoiminto<\/strong> ei toiminut.<\/li>\n<\/ul>\n<p>T\u00e4m\u00e4n sanottuani aion selitt\u00e4\u00e4 muutaman asian:<\/p>\n<ol>\n<li>miksi p\u00e4\u00e4tin k\u00e4ytt\u00e4\u00e4 taulukkoa metatietoarvojen tallentamiseen,<\/li>\n<li>miksi olen k\u00e4ytt\u00e4nyt <a href=\"https:\/\/php.net\/manual\/en\/function.implode.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implodea<\/a> muuntamaan ne merkkijonoksi,<\/li>\n<li>miksi en k\u00e4yt\u00e4 <strong>valmistelua<\/strong> kyselyn k\u00e4sittelemiseen.<\/li>\n<\/ol>\n<h3>Metatietoarvoista<\/h3>\n<p>Syy metatietojen pit\u00e4miseen taulukossa luokan ominaisuutena johtuu siit\u00e4, ett\u00e4 t\u00e4m\u00e4 taulukko voi muuttua ajan my\u00f6t\u00e4.<\/p>\n<p>Toisin sanoen saatamme joutua tuomaan lis\u00e4\u00e4 kolmannen osapuolen tietoja, meid\u00e4n on poistettava kolmannen osapuolen tietoja tai meid\u00e4n on ehk\u00e4 teht\u00e4v\u00e4 joitain muutoksia olemassa oleviin tietoihin.<\/p>\n<p>Kun n\u00e4m\u00e4 tiedot s\u00e4ilytet\u00e4\u00e4n yhdess\u00e4 paikassa, koodin tulevien versioiden hallinta on paljon helpompaa.<\/p>\n<h3>Imploding The Array<\/h3>\n<p>Aina kun suoritat kysely\u00e4 tietokantaa vastaan \u200b\u200bja sinun on ty\u00f6skennelt\u00e4v\u00e4 datajoukon kanssa, voit k\u00e4ytt\u00e4\u00e4 <strong>WP_Meta_Query\u00e4<\/strong> ja k\u00e4ytt\u00e4\u00e4 jokaista avainta argumenttitaulukon osana.<\/p>\n<p>Mutta jos sinulla on suhteellisen suuri joukko tietoja, sinun t\u00e4ytyy ensin k\u00e4yd\u00e4 l\u00e4pi kaikki, sitten sinun on luotava kysely ja sitten sinun on k\u00e4sitelt\u00e4v\u00e4 se.<\/p>\n<p>Ja kun olet tehnyt kaiken t\u00e4m\u00e4n, en ole vakuuttunut siit\u00e4, ett\u00e4 kirjoitettu koodi ei ole tapahtunut suorituskyvyn kustannuksella. T\u00e4st\u00e4 syyst\u00e4 p\u00e4\u00e4t\u00e4n joskus 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 .<\/p>\n<h3>Ei k\u00e4yt\u00e4 Preparea<\/h3>\n<p>Nyt kun olen yhteydess\u00e4 suoraan tietokantaan, yrit\u00e4n varmistaa:<\/p>\n<ol>\n<li>Minulla on hyv\u00e4 syy tehd\u00e4 niin,<\/li>\n<li>K\u00e4yt\u00e4n parametroituja kyselyit\u00e4.<\/li>\n<\/ol>\n<p>Mutta olen ty\u00f6skennellyt t\u00e4m\u00e4n tietyn tietojoukon kanssa jonkin aikaa yritt\u00e4ess\u00e4ni k\u00e4ytt\u00e4\u00e4 kaikkia WordPress-kehityksen permutaatioita, joista olen tietoinen (mukaan lukien useiden kollegoiden kanssa puhuminen siit\u00e4), jotta t\u00e4m\u00e4 toimisi parhaalla mahdollisella tavalla.<\/p>\n<p>Se ei kuitenkaan tapahtunut. Ja silloin t\u00f6rm\u00e4sin seuraavaan <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/esc_sql\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Codexin<\/a> sivuun :<\/p>\n<blockquote>\n<p>99 %:ssa tapauksista voit k\u00e4ytt\u00e4\u00e4 sen sijaan $wpdb-&gt;prepare():t\u00e4, ja se on suositeltava tapa. T\u00e4m\u00e4 toiminto on tarkoitettu k\u00e4ytett\u00e4v\u00e4ksi vain niiss\u00e4 harvoissa tapauksissa, joissa et voi helposti k\u00e4ytt\u00e4\u00e4 $wpdb-&gt;prepare() -toimintoa. Yksi esimerkki on taulukon valmisteleminen k\u00e4ytett\u00e4v\u00e4ksi IN-lauseessa.<\/p>\n<\/blockquote>\n<p>Ja juuri sit\u00e4 yritin tehd\u00e4: Etsin post-metataulukosta, jossa meta-avainarvot sis\u00e4ltyiv\u00e4t taulukkoon.<\/p>\n<p>Joten t\u00e4ss\u00e4 on, kuinka selvitin t\u00e4m\u00e4n kaiken.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d482b2383363558f5647f578e62d25c3#file-00-keys-to-map-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ensin<\/a> loin taulukon eri meta-avainten s\u00e4ilytt\u00e4miseksi, jotka minun on lopulta kartoitettava (vaikka avainten arvolla ei ole v\u00e4li\u00e4 t\u00e4m\u00e4n viestin kannalta):<\/p>\n<pre><code>&lt;?php\n\n\/\/ This is used to maintain a map of data should we need to add more.\n$data_types = [\n    'data_item_one',\n    'data_item_two',\n    '...'\n    'data_item_ten,\n];\n<\/code><\/pre>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d482b2383363558f5647f578e62d25c3#file-01-mysql-ready-string-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Sitten<\/a> muunsin ne MySQL-valmiiksi merkkijonoiksi. My\u00f6nnet\u00e4\u00e4n, ett\u00e4 t\u00e4m\u00e4 ei ole k\u00e4ytt\u00e4j\u00e4n sy\u00f6te, ja sit\u00e4 k\u00e4ytet\u00e4\u00e4n <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/comparison-operators.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">IN<\/a> &#8211; lauseessa, joten sit\u00e4 ei voi k\u00e4ytt\u00e4\u00e4 <strong>valmistelulauseessa<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Converts the incoming array into a comma-delimited string with\n * quotes wrapped around each key.\n *\n * @access private\n *\n * @param  array $arr The array to convert to a string.\n * @return string     The string representation of the array delimited by quotes and commas.\n *\/\nprivate function convert_to_sql_ready_string( $arr) {\n  return '\"'. implode( $arr, '\",\"' ). '\"';\n}\n<\/code><\/pre>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d482b2383363558f5647f578e62d25c3#file-02-the-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lopulta<\/a> loin kyselyn ja hain tulokset:<\/p>\n<pre><code>&lt;?php\n\npublic function get_data_values() {\n\n  global $wpdb;\n  $query = \"\n    SELECT post_id, meta_key, meta_value \n    FROM $wpdb-&gt;postmeta WHERE\n    meta_key in ($this-&gt;data_types) AND \n    meta_value &lt;&gt; '';\n  \";\n\n  $results = $wpdb-&gt;get_results( $query );\n\n  return $results;\n}\n<\/code><\/pre>\n<p>Ja n\u00e4in p\u00e4\u00e4dyin ty\u00f6skentelem\u00e4\u00e4n taulukoiden, luokkaominaisuuden kanssa ja m\u00e4\u00e4ritt\u00e4m\u00e4\u00e4n kyselyni.<\/p>\n<p>Onko t\u00e4m\u00e4 paras tapa ty\u00f6skennell\u00e4 WordPress-kyselyjen kanssa IN-lausekkeilla? En ole varma, mutta kokemukseni, lukemani ja sen toimivuuden perusteella olen tyytyv\u00e4inen lopputulokseen.<\/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>IN-lauseiden kanssa ty\u00f6skentely WordPress-kyselyiden kanssa voi olla hankalaa, varsinkin jos k\u00e4sittelet meta-avaimia. T\u00e4ss\u00e4 on mit\u00e4 l\u00f6ysin toimivaksi.<\/p>\n","protected":false},"author":1,"featured_media":166518,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,917,803,864],"tags":[1166],"class_list":["post-229600","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-muut","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229600","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=229600"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229600\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/166518"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}