{"id":229482,"date":"2022-11-06T11:20:00","date_gmt":"2022-11-06T08:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229482"},"modified":"2022-11-09T07:16:58","modified_gmt":"2022-11-09T04:16:58","slug":"requetes-wordpress-avec-clauses-in-qui-savait","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/requetes-wordpress-avec-clauses-in-qui-savait\/","title":{"rendered":"Requ\u00eates WordPress avec clauses IN (qui savait)\u00a0?"},"content":{"rendered":"\n<p>Il y a un peu plus d&rsquo;un an, j&rsquo;ai \u00e9crit un article sur la fa\u00e7on d&rsquo;utiliser <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> chaque fois que vous avez <a href=\"https:\/\/tommcfarlin.com\/wp_query-and-multiple-meta-keys\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un ensemble de cl\u00e9s<\/a> que vous souhaitez utiliser pour vous aider \u00e0 extraire des informations de la base de donn\u00e9es.<\/p>\n<p>Qu&rsquo;en est-il du cas, cependant, lorsque vous avez un certain nombre de cl\u00e9s diff\u00e9rentes qui entra\u00eeneraient la cr\u00e9ation d&rsquo;un tr\u00e8s long tableau pour la classe <strong>WP_Meta_Query<\/strong>? Par exemple, que se passerait-il si vous deviez parcourir une collection de donn\u00e9es avant m\u00eame de configurer la requ\u00eate\u00a0?<\/p>\n<p>\u00c0 un certain niveau, il pourrait sembler que la chose naturelle \u00e0 faire serait de\u00a0:<\/p>\n<ol>\n<li>parcourir la collection de cl\u00e9s,<\/li>\n<li>construire dynamiquement les r\u00e9sultats,<\/li>\n<li>les combiner en un seul ensemble de r\u00e9sultats,<\/li>\n<li>puis travaillez avec tout ce qui vous est donn\u00e9.<\/li>\n<\/ol>\n<p>Mais cela ne semble-t-il pas un peu lourd (et encore moins lent)\u00a0?<\/p>\n<p>Quand il s&rsquo;agit d&rsquo;utiliser l&rsquo;API WordPress, je fais ce que je peux pour m&rsquo;y tenir avant de parler, disons, directement \u00e0 la base de donn\u00e9es, mais il y a aussi des moments o\u00f9 il est plus logique d&rsquo;\u00e9crire une requ\u00eate brute que d&rsquo;\u00e9crire un type de code intelligent juste pour que l&rsquo;API WordPress fonctionne.<\/p>\n<p>Avant d&rsquo;entrer dans les raisons pour lesquelles j&rsquo;ai fait les choses que j&rsquo;ai faites, je veux expliquer le probl\u00e8me et l&rsquo;approche. Cela \u00e9vitera probablement \u00e0 quelqu&rsquo;un de sauter dans les commentaires pr\u00e9matur\u00e9ment.<\/p>\n<p>Cette capture d&rsquo;\u00e9cran n&rsquo;a rien \u00e0 voir avec la requ\u00eate. Juste un coup de l&rsquo;IDE pour le plaisir.<\/p>\n<p>Alors allez-y :<\/p>\n<ul>\n<li>J&rsquo;ai un tableau standard de valeurs qui sont finalement utilis\u00e9es pour aider \u00e0 prendre des m\u00e9tadonn\u00e9es et \u00e0 en cr\u00e9er un type de publication personnalis\u00e9 (car elles ont \u00e9t\u00e9 import\u00e9es d&rsquo;une source tierce).<\/li>\n<li>Je suis un grand partisan du param\u00e9trage des requ\u00eates (et donc de l&rsquo;utilisation de <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>) pour m&rsquo;assurer que les donn\u00e9es sont correctement interrog\u00e9es dans la base de donn\u00e9es. Malheureusement, cela ne se produisait pas lors de la tentative d&rsquo;ex\u00e9cution de cette requ\u00eate. J&rsquo;expliquerai pourquoi plus tard dans ce post.<\/li>\n<li>Ainsi, prendre le tableau et le convertir en cha\u00eene est utile, mais cela ne r\u00e9sout toujours pas le probl\u00e8me de savoir pourquoi la\u00a0 fonction de <strong>pr\u00e9paration<\/strong> standard ne fonctionnait pas.<\/li>\n<\/ul>\n<p>Cela dit, je vais vous expliquer certaines choses :<\/p>\n<ol>\n<li>pourquoi j&rsquo;ai choisi d&rsquo;utiliser un tableau pour stocker les valeurs de m\u00e9tadonn\u00e9es,<\/li>\n<li>pourquoi j&rsquo;ai utilis\u00e9 <a href=\"https:\/\/php.net\/manual\/en\/function.implode.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implode<\/a> pour les convertir en cha\u00eene,<\/li>\n<li>pourquoi je n&rsquo;utilise pas <strong>prepare<\/strong> pour g\u00e9rer la requ\u00eate.<\/li>\n<\/ol>\n<h3>Sur les valeurs de m\u00e9tadonn\u00e9es<\/h3>\n<p>La raison de conserver les m\u00e9tadonn\u00e9es dans un tableau en tant que propri\u00e9t\u00e9 de la classe est que ce tableau peut changer au fil du temps.<\/p>\n<p>Autrement dit, nous devrons peut-\u00eatre importer des donn\u00e9es tierces suppl\u00e9mentaires, supprimer des donn\u00e9es tierces ou apporter des modifications \u00e0 tout ce qui est pr\u00e9sent.<\/p>\n<p>Lorsque ces donn\u00e9es sont conserv\u00e9es \u00e0 un seul endroit, cela facilite grandement leur gestion pour les futures versions du code.<\/p>\n<h3>Imploser le tableau<\/h3>\n<p>Chaque fois que vous ex\u00e9cutez une requ\u00eate sur la base de donn\u00e9es et que vous devez travailler avec un tableau de donn\u00e9es, vous pouvez utiliser <strong>WP_Meta_Query<\/strong> et utiliser chaque cl\u00e9 comme partie du tableau d&rsquo;arguments.<\/p>\n<p>Mais si vous avez un ensemble de donn\u00e9es relativement volumineux, vous devez d&rsquo;abord parcourir tout cela, puis vous devez cr\u00e9er la requ\u00eate, puis vous devez la traiter.<\/p>\n<p>Et une fois que vous avez fait tout cela, je ne suis pas convaincu que le code qui a \u00e9t\u00e9 \u00e9crit ne se soit pas fait au d\u00e9triment des performances. C&rsquo;est pourquoi, parfois, je choisis d&rsquo;utiliser <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wpdb<\/a>.<\/p>\n<h3>Ne pas utiliser la pr\u00e9paration<\/h3>\n<p>Maintenant, lors de l&rsquo;interface directe avec la base de donn\u00e9es, j&rsquo;essaie de m&rsquo;assurer que\u00a0:<\/p>\n<ol>\n<li>J&rsquo;ai une bonne raison de le faire,<\/li>\n<li>J&rsquo;utilise des requ\u00eates param\u00e9tr\u00e9es.<\/li>\n<\/ol>\n<p>Mais je travaille avec cet ensemble sp\u00e9cifique de donn\u00e9es depuis un petit moment en essayant d&rsquo;utiliser toutes les permutations de d\u00e9veloppement WordPress dont je suis conscient (y compris en parler \u00e0 plusieurs pairs \u00e0 ce sujet) pour essayer de faire fonctionner cela de la meilleure fa\u00e7on possible.<\/p>\n<p>Cela n&rsquo;arrivait pas, cependant. Et c&rsquo;est l\u00e0 que je suis tomb\u00e9 sur la page suivante <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/esc_sql\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">du Codex<\/a> :<\/p>\n<blockquote>\n<p>Dans 99% des cas, vous pouvez utiliser $wpdb-&gt;prepare() \u00e0 la place, et c&rsquo;est la m\u00e9thode recommand\u00e9e. Cette fonction est uniquement destin\u00e9e \u00e0 \u00eatre utilis\u00e9e dans les rares cas o\u00f9 vous ne pouvez pas utiliser facilement $wpdb-&gt;prepare(). Un exemple est la pr\u00e9paration d&rsquo;un tableau \u00e0 utiliser dans une clause IN.<\/p>\n<\/blockquote>\n<p>Et c&rsquo;est exactement ce que j&rsquo;essayais de faire\u00a0: je cherchais \u00e0 rechercher la m\u00e9ta-table de publication o\u00f9 les valeurs de cl\u00e9 m\u00e9ta \u00e9taient contenues dans un tableau.<\/p>\n<p>Voici donc comment j&rsquo;ai travaill\u00e9 sur tout cela.<\/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\">Tout<\/a> d&rsquo;abord, j&rsquo;ai cr\u00e9\u00e9 un tableau pour contenir les diff\u00e9rentes cl\u00e9s m\u00e9ta que je sais que j&rsquo;aurai \u00e9ventuellement besoin de mapper (bien que la valeur des cl\u00e9s n&rsquo;ait pas d&rsquo;importance dans le cadre de cet article):<\/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\">Ensuite,<\/a> je les ai convertis en une cha\u00eene pr\u00eate pour MySQL. Certes, ce n&rsquo;est pas une entr\u00e9e utilisateur et elle est utilis\u00e9e dans une clause <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/comparison-operators.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">IN, elle ne peut donc pas \u00eatre utilis\u00e9e dans une instruction<\/a> <strong>prepare<\/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\">Enfin<\/a>, j&rsquo;ai cr\u00e9\u00e9 la requ\u00eate et r\u00e9cup\u00e9r\u00e9 les r\u00e9sultats\u00a0:<\/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>Et c&rsquo;est ainsi que j&rsquo;ai fini par travailler avec les tableaux, la propri\u00e9t\u00e9 de classe et la configuration de ma requ\u00eate.<\/p>\n<p>Est-ce la meilleure fa\u00e7on de travailler avec des requ\u00eates WordPress avec des clauses IN\u00a0? Je ne suis pas s\u00fbr, mais compte tenu de mon exp\u00e9rience, de ce que j&rsquo;ai lu et de son fonctionnement, je suis satisfait du r\u00e9sultat final.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Travailler avec des requ\u00eates WordPress avec des clauses IN peut \u00eatre d\u00e9licat, surtout si vous avez affaire \u00e0 des m\u00e9ta-cl\u00e9s. Voici ce que j&rsquo;ai trouv\u00e9 pour fonctionner.<\/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":[915,717,801,862],"tags":[1167],"class_list":["post-229482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-developpeur","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=229482"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229482\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/166518"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}