{"id":228903,"date":"2022-11-06T11:06:00","date_gmt":"2022-11-06T08:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228903"},"modified":"2022-11-09T04:44:26","modified_gmt":"2022-11-09T01:44:26","slug":"wordpress-fraagor-med-in-klausuler-vem-visste","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-fraagor-med-in-klausuler-vem-visste\/","title":{"rendered":"WordPress-fr\u00e5gor med IN-klausuler (vem visste)?"},"content":{"rendered":"\n<p>F\u00f6r lite \u00f6ver ett \u00e5r sedan skrev jag ett inl\u00e4gg om hur man anv\u00e4nder <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a><\/strong> n\u00e4r du har <a href=\"https:\/\/tommcfarlin.com\/wp_query-and-multiple-meta-keys\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en upps\u00e4ttning nycklar som<\/a> du vill anv\u00e4nda f\u00f6r att hj\u00e4lpa till att dra tillbaka information fr\u00e5n databasen.<\/p>\n<p>Men hur \u00e4r det med fallet n\u00e4r du har ett antal olika nycklar som skulle resultera i att skapa en riktigt l\u00e5ng array f\u00f6r klassen <strong>WP_Meta_Query<\/strong>? Till exempel, vad h\u00e4nder om du var tvungen att g\u00e5 igenom en samling data innan du ens st\u00e4ller in fr\u00e5gan?<\/p>\n<p>P\u00e5 n\u00e5gon niv\u00e5 kan det k\u00e4nnas som att det naturliga \u00e4r att:<\/p>\n<ol>\n<li>iterera genom samlingen av nycklar,<\/li>\n<li>dynamiskt bygga upp resultaten,<\/li>\n<li>kombinera dem till en enda resultatupps\u00e4ttning,<\/li>\n<li>arbeta sedan med vad du \u00e4n f\u00e5r.<\/li>\n<\/ol>\n<p>Men l\u00e5ter inte det lite kr\u00e5ngligt (l\u00e5t vara l\u00e5ngsamt)?<\/p>\n<p>N\u00e4r det kommer till att anv\u00e4nda WordPress API g\u00f6r jag vad jag kan f\u00f6r att h\u00e5lla mig till det innan jag pratar, s\u00e4g direkt till databasen, men det finns ocks\u00e5 tillf\u00e4llen d\u00e5 det \u00e4r vettigt att skriva en r\u00e5 fr\u00e5ga \u00e4n att skriva n\u00e5gon typ av smart kod bara f\u00f6r att f\u00e5 WordPress API att fungera.<\/p>\n<p>Innan jag g\u00e5r in p\u00e5 motiveringen till varf\u00f6r jag har gjort de saker jag har, vill jag f\u00f6rklara problemet och tillv\u00e4gag\u00e5ngss\u00e4ttet. Detta kommer sannolikt att r\u00e4dda n\u00e5gon fr\u00e5n att hoppa in i kommentarerna i f\u00f6rtid.<\/p>\n<p>Den h\u00e4r sk\u00e4rmdumpen har inget med fr\u00e5gan att g\u00f6ra. Bara en bild av IDE f\u00f6r skojs skull.<\/p>\n<p>S\u00e5 h\u00e4r kommer:<\/p>\n<ul>\n<li>Jag har en standardupps\u00e4ttning av v\u00e4rden som s\u00e5 sm\u00e5ningom anv\u00e4nds f\u00f6r att hj\u00e4lpa till att ta metadata och skapa en anpassad inl\u00e4ggstyp fr\u00e5n dem (eftersom de har importerats fr\u00e5n en tredjepartsk\u00e4lla).<\/li>\n<li>Jag \u00e4r en stor f\u00f6respr\u00e5kare f\u00f6r att parametrera fr\u00e5gor (och d\u00e4rmed anv\u00e4nda <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Protect_Queries_Against_SQL_Injection_Attacks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prepare<\/a>) f\u00f6r att s\u00e4kerst\u00e4lla att data blir korrekt fr\u00e5gade mot databasen. Tyv\u00e4rr h\u00e4nde detta inte n\u00e4r du f\u00f6rs\u00f6kte k\u00f6ra den h\u00e4r fr\u00e5gan. Jag ska f\u00f6rklara varf\u00f6r senare i detta inl\u00e4gg.<\/li>\n<li>S\u00e5, ta arrayen och konvertera den till en str\u00e4ng \u00e4r till hj\u00e4lp, men det l\u00f6ser fortfarande inte problemet med att den vanliga <strong>prepareringsfunktionen<\/strong> inte fungerade.<\/li>\n<\/ul>\n<p>Med det sagt ska jag f\u00f6rklara n\u00e5gra saker:<\/p>\n<ol>\n<li>varf\u00f6r jag valde att anv\u00e4nda en array f\u00f6r att lagra metadatav\u00e4rden,<\/li>\n<li>varf\u00f6r jag har anv\u00e4nt <a href=\"https:\/\/php.net\/manual\/en\/function.implode.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implode<\/a> f\u00f6r att konvertera dem till en str\u00e4ng,<\/li>\n<li>varf\u00f6r jag inte anv\u00e4nder <strong>f\u00f6rbered<\/strong> f\u00f6r att hantera fr\u00e5gan.<\/li>\n<\/ol>\n<h3>Om metadatav\u00e4rden<\/h3>\n<p>Anledningen till att metadata beh\u00e5lls i en array som en egenskap f\u00f6r klassen \u00e4r att denna array kan f\u00f6r\u00e4ndras \u00f6ver tiden.<\/p>\n<p>Det vill s\u00e4ga, vi kan beh\u00f6va importera ytterligare data fr\u00e5n tredje part, skulle beh\u00f6va ta bort data fr\u00e5n tredje part, eller s\u00e5 kan vi beh\u00f6va g\u00f6ra vissa \u00e4ndringar av vad som \u00e4n finns.<\/p>\n<p>N\u00e4r dessa data f\u00f6rvaras p\u00e5 ett enda st\u00e4lle g\u00f6r det det mycket l\u00e4ttare att hantera f\u00f6r framtida versioner av koden.<\/p>\n<h3>Imploding The Array<\/h3>\n<p>N\u00e4rhelst du k\u00f6r en fr\u00e5ga mot databasen och du m\u00e5ste arbeta med en array av data, kan du anv\u00e4nda <strong>WP_Meta_Query<\/strong> och anv\u00e4nda varje nyckel som delar av argumentarrayen.<\/p>\n<p>Men om du har en relativt stor upps\u00e4ttning data m\u00e5ste du f\u00f6rst g\u00e5 igenom allt, sedan m\u00e5ste du skapa fr\u00e5gan, sedan m\u00e5ste du bearbeta den.<\/p>\n<p>Och n\u00e4r du v\u00e4l har gjort allt detta \u00e4r jag inte \u00f6vertygad om att koden som har skrivits inte har kommit p\u00e5 bekostnad av prestanda. Det \u00e4r d\u00e4rf\u00f6r jag ibland v\u00e4ljer att anv\u00e4nda <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wpdb<\/a>.<\/p>\n<h3>Anv\u00e4nder inte Prepare<\/h3>\n<p>Nu, n\u00e4r jag gr\u00e4nsar direkt med databasen, f\u00f6rs\u00f6ker jag se till:<\/p>\n<ol>\n<li>Jag har en bra anledning att g\u00f6ra det,<\/li>\n<li>Jag anv\u00e4nder parametriserade fr\u00e5gor.<\/li>\n<\/ol>\n<p>Men jag har arbetat med denna specifika upps\u00e4ttning data ett tag och f\u00f6rs\u00f6kt anv\u00e4nda varje permutation av WordPress-utveckling som jag \u00e4r medveten om (inklusive att prata med flera kamrater om det) f\u00f6r att f\u00f6rs\u00f6ka f\u00e5 det h\u00e4r att fungera p\u00e5 b\u00e4sta m\u00f6jliga s\u00e4tt.<\/p>\n<p>Det h\u00e4nde dock inte. Och det var d\u00e5 jag snubblade \u00f6ver f\u00f6ljande sida <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/esc_sql\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i Codex<\/a> :<\/p>\n<blockquote>\n<p>I 99% av fallen kan du anv\u00e4nda $wpdb-&gt;prepare() ist\u00e4llet, och det \u00e4r den rekommenderade metoden. Denna funktion \u00e4r endast f\u00f6r anv\u00e4ndning i de s\u00e4llsynta fall d\u00e4r du inte enkelt kan anv\u00e4nda $wpdb-&gt;prepare(). Ett exempel \u00e4r att f\u00f6rbereda en array f\u00f6r anv\u00e4ndning i en IN-sats.<\/p>\n<\/blockquote>\n<p>Och det var precis det jag f\u00f6rs\u00f6kte g\u00f6ra: jag letade efter att s\u00f6ka i post-metatabellen d\u00e4r meta-nyckelv\u00e4rdena fanns i en array.<\/p>\n<p>S\u00e5 h\u00e4r \u00e4r hur jag l\u00f6ste allt detta.<\/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\">F\u00f6rst<\/a> skapade jag en array f\u00f6r att h\u00e5lla de olika meta-nycklarna som jag vet att jag s\u00e5 sm\u00e5ningom kommer att beh\u00f6va kartl\u00e4gga (\u00e4ven om v\u00e4rdet p\u00e5 nycklarna inte spelar n\u00e5gon roll f\u00f6r detta inl\u00e4ggs syfte):<\/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\">Sedan<\/a> konverterade jag dem till en MySQL-klar str\u00e4ng. Visst, detta \u00e4r inte anv\u00e4ndarinmatning och det anv\u00e4nds i en <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; klausul, s\u00e5 det kan inte anv\u00e4ndas i en <strong>prepare-<\/strong> sats:<\/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\">Till slut<\/a> skapade jag fr\u00e5gan och h\u00e4mtade resultaten:<\/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>Och det var s\u00e5 det slutade med att jag arbetade med arrayerna, klassegenskapen och satte upp min fr\u00e5ga.<\/p>\n<p>\u00c4r detta det b\u00e4sta s\u00e4ttet att arbeta med WordPress-fr\u00e5gor med IN-klausuler? Jag \u00e4r inte s\u00e4ker, men med tanke p\u00e5 min erfarenhet, vad jag har l\u00e4st och hur det fungerar \u00e4r jag n\u00f6jd med slutresultatet.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Att arbeta med WordPress-fr\u00e5gor med IN-klausuler kan vara knepigt, s\u00e4rskilt om du har att g\u00f6ra med meta-nycklar. H\u00e4r \u00e4r vad jag tyckte fungerade.<\/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":[922,807,724,868],"tags":[1173],"class_list":["post-228903","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oevrig","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228903"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228903\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/166518"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}