Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Requêtes WordPress avec clauses IN (qui savait) ?

21

Il y a un peu plus d’un an, j’ai écrit un article sur la façon d’utiliser WP_Meta_Query chaque fois que vous avez un ensemble de clés que vous souhaitez utiliser pour vous aider à extraire des informations de la base de données.

Qu’en est-il du cas, cependant, lorsque vous avez un certain nombre de clés différentes qui entraîneraient la création d’un très long tableau pour la classe WP_Meta_Query? Par exemple, que se passerait-il si vous deviez parcourir une collection de données avant même de configurer la requête ?

À un certain niveau, il pourrait sembler que la chose naturelle à faire serait de :

  1. parcourir la collection de clés,
  2. construire dynamiquement les résultats,
  3. les combiner en un seul ensemble de résultats,
  4. puis travaillez avec tout ce qui vous est donné.

Mais cela ne semble-t-il pas un peu lourd (et encore moins lent) ?

Quand il s’agit d’utiliser l’API WordPress, je fais ce que je peux pour m’y tenir avant de parler, disons, directement à la base de données, mais il y a aussi des moments où il est plus logique d’écrire une requête brute que d’écrire un type de code intelligent juste pour que l’API WordPress fonctionne.

Avant d’entrer dans les raisons pour lesquelles j’ai fait les choses que j’ai faites, je veux expliquer le problème et l’approche. Cela évitera probablement à quelqu’un de sauter dans les commentaires prématurément.

Cette capture d’écran n’a rien à voir avec la requête. Juste un coup de l’IDE pour le plaisir.

Alors allez-y :

  • J’ai un tableau standard de valeurs qui sont finalement utilisées pour aider à prendre des métadonnées et à en créer un type de publication personnalisé (car elles ont été importées d’une source tierce).
  • Je suis un grand partisan du paramétrage des requêtes (et donc de l’utilisation de prepare) pour m’assurer que les données sont correctement interrogées dans la base de données. Malheureusement, cela ne se produisait pas lors de la tentative d’exécution de cette requête. J’expliquerai pourquoi plus tard dans ce post.
  • Ainsi, prendre le tableau et le convertir en chaîne est utile, mais cela ne résout toujours pas le problème de savoir pourquoi la  fonction de préparation standard ne fonctionnait pas.

Cela dit, je vais vous expliquer certaines choses :

  1. pourquoi j’ai choisi d’utiliser un tableau pour stocker les valeurs de métadonnées,
  2. pourquoi j’ai utilisé implode pour les convertir en chaîne,
  3. pourquoi je n’utilise pas prepare pour gérer la requête.

Sur les valeurs de métadonnées

La raison de conserver les métadonnées dans un tableau en tant que propriété de la classe est que ce tableau peut changer au fil du temps.

Autrement dit, nous devrons peut-être importer des données tierces supplémentaires, supprimer des données tierces ou apporter des modifications à tout ce qui est présent.

Lorsque ces données sont conservées à un seul endroit, cela facilite grandement leur gestion pour les futures versions du code.

Imploser le tableau

Chaque fois que vous exécutez une requête sur la base de données et que vous devez travailler avec un tableau de données, vous pouvez utiliser WP_Meta_Query et utiliser chaque clé comme partie du tableau d’arguments.

Mais si vous avez un ensemble de données relativement volumineux, vous devez d’abord parcourir tout cela, puis vous devez créer la requête, puis vous devez la traiter.

Et une fois que vous avez fait tout cela, je ne suis pas convaincu que le code qui a été écrit ne se soit pas fait au détriment des performances. C’est pourquoi, parfois, je choisis d’utiliser wpdb.

Ne pas utiliser la préparation

Maintenant, lors de l’interface directe avec la base de données, j’essaie de m’assurer que :

  1. J’ai une bonne raison de le faire,
  2. J’utilise des requêtes paramétrées.

Mais je travaille avec cet ensemble spécifique de données depuis un petit moment en essayant d’utiliser toutes les permutations de développement WordPress dont je suis conscient (y compris en parler à plusieurs pairs à ce sujet) pour essayer de faire fonctionner cela de la meilleure façon possible.

Cela n’arrivait pas, cependant. Et c’est là que je suis tombé sur la page suivante du Codex :

Dans 99% des cas, vous pouvez utiliser $wpdb->prepare() à la place, et c’est la méthode recommandée. Cette fonction est uniquement destinée à être utilisée dans les rares cas où vous ne pouvez pas utiliser facilement $wpdb->prepare(). Un exemple est la préparation d’un tableau à utiliser dans une clause IN.

Et c’est exactement ce que j’essayais de faire : je cherchais à rechercher la méta-table de publication où les valeurs de clé méta étaient contenues dans un tableau.

Voici donc comment j’ai travaillé sur tout cela.

Tout d’abord, j’ai créé un tableau pour contenir les différentes clés méta que je sais que j’aurai éventuellement besoin de mapper (bien que la valeur des clés n’ait pas d’importance dans le cadre de cet article):

<?php

// This is used to maintain a map of data should we need to add more.
$data_types = [
    'data_item_one',
    'data_item_two',
    '...'
    'data_item_ten,
];

Ensuite, je les ai convertis en une chaîne prête pour MySQL. Certes, ce n’est pas une entrée utilisateur et elle est utilisée dans une clause IN, elle ne peut donc pas être utilisée dans une instruction prepare :

<?php

/**
 * Converts the incoming array into a comma-delimited string with
 * quotes wrapped around each key.
 *
 * @access private
 *
 * @param  array $arr The array to convert to a string.
 * @return string     The string representation of the array delimited by quotes and commas.
 */
private function convert_to_sql_ready_string( $arr) {
  return '"'. implode( $arr, '","' ). '"';
}

Enfin, j’ai créé la requête et récupéré les résultats :

<?php

public function get_data_values() {

  global $wpdb;
  $query = "
    SELECT post_id, meta_key, meta_value 
    FROM $wpdb->postmeta WHERE
    meta_key in ($this->data_types) AND 
    meta_value <> '';
  ";

  $results = $wpdb->get_results( $query );

  return $results;
}

Et c’est ainsi que j’ai fini par travailler avec les tableaux, la propriété de classe et la configuration de ma requête.

Est-ce la meilleure façon de travailler avec des requêtes WordPress avec des clauses IN ? Je ne suis pas sûr, mais compte tenu de mon expérience, de ce que j’ai lu et de son fonctionnement, je suis satisfait du résultat final.

Source d’enregistrement: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More