Un stub pour travailler avec des requêtes de base de données dans WordPress
Autant je suis fan de certaines API WordPress pour interroger la base de données telles que :
- WP_Requête ,
- WP_User_Query ,
- WP_Meta_Query ,
- etc
Je suis également fan d’interroger directement la base de données en cas de besoin.
Comme vous le remarquerez, je procède de manière cohérente et comme il y a des moments où je le fais plus fréquemment, ces derniers temps, voici un format de base pour travailler avec des requêtes de base de données dans WordPress.
Si je fais cela, cependant, il y a généralement des choses que je garde à l’esprit :
- assurez-vous toujours que la requête est paramétrée (surtout dans le cas d’une saisie utilisateur),
- renvoie dans les informations sous la forme d’un tableau associatif.
Le premier cas est pour la sécurité; le second est plus ou moins pratique pour simplifier l’itération dans les données via les fonctions de tableau PHP.
Requêtes de base de données dans WordPress
Tout d’abord, il est important de comprendre deux concepts :
- paramétrage,
- array_column
Celles-ci sont au cœur de la façon dont je rédige mes requêtes et travaille avec les résultats de celles-ci.
1 Paramétrage
Vous pouvez en savoir plus à ce sujet dans le Codex, mais la paramétrisation est un moyen qui nous permet d’écrire des requêtes qui fonctionnent pour empêcher l’injection SQL.
Toutes les données des requêtes SQL doivent être échappées par SQL avant que la requête SQL ne soit exécutée pour se prémunir contre les attaques par injection SQL. La
prepareméthode exécute cette fonctionnalité pour WordPress, qui prend en charge à la fois une syntaxe de type sprintf( ) et vsprintf().
C’est-à-dire que la méthode prend en charge les jetons tels que %s, %d et %f lors de la transmission d’informations dans la requête. Je montrerai un exemple de cela plus tard dans le post.
2 Travailler avec des colonnes de tableau
Les résultats de ces requêtes peuvent être renvoyés de différentes manières. À savoir, en tant qu’objet, tableau indexé numériquement ou tableau associatif. Le plus souvent, j’aime utiliser des tableaux (et je montrerai comment faire cela dans WordPress plus tard dans cet article).
La raison, cependant, est que je peux profiter de array_column. Du manuel PHP :
array_column() renvoie les valeurs d’une seule colonne de l’entrée, identifiée par la column_key. Facultativement, un index_key peut être fourni pour indexer les valeurs dans le tableau renvoyé par les valeurs de la colonne index_key du tableau d’entrée.
Cela signifie que si vous avez un tableau et qu’il a un tas de résultats dont chacun a la même colonne, vous pouvez facilement simplement les informations en passant le tableau dans une méthode, puis en passant le nom de la colonne dans une méthode.
Le résultat? Un tableau indexé numériquement des valeurs. Cela facilite grandement l’itération des données via array_map, en utilisant for ou en utilisant foreach.
Un stub pour interroger la base de données
Avec cette justification en place, voici le stub que j’utilise normalement chaque fois que je travaille directement avec des requêtes de base de données :
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
",
$userId
),
ARRAY_A
);
if (empty($results)) {
return;
}
$results = array_map($results, 'column_name');
Et voici un exemple avec quelques informations différentes pour que vous puissiez voir comment cela fonctionne :
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
user_id,
meta_value
FROM $wpdb->usermeta
WHERE meta_key LIKE %s
AND user_id = %d
",
'%wc_authorize_net_cim_customer_profile_id%',
wp_get_current_user()->ID;
),
ARRAY_A
);
if (empty($results)) {
return [];
}
$results = array_map($results, 'meta_value');
Interroger la table wp_user_meta peut sembler idiot puisque get_user_meta est une fonction API valide, mais je pensais que ce serait une requête facile à comprendre étant donné ce que j’essaie d’expliquer dans le passé.
Quoi qu’il en soit, je ne peux pas fournir la requête ni gérer le cas où les résultats peuvent revenir avec plusieurs colonnes (dans ce cas, vous devrez travailler avec quelque chose de différent de array_map, mais cela devrait être assez facile, non? )
