Uno stub per lavorare con le query di database in WordPress
Per quanto io sia un fan di alcune API di WordPress per interrogare il database come:
- WP_Query ,
- WP_User_Query ,
- WP_Meta_Query ,
- e così via
Sono anche un fan delle query direttamente sul database quando necessario.
Come noterai, c’è un modo coerente in cui lo faccio e poiché ci sono volte in cui lo faccio più frequentemente, negli ultimi tempi, ecco un formato di base per lavorare con le query di database in WordPress.
Se lo faccio, però, generalmente ci sono cose che tengo a mente:
- assicurati sempre che la query sia parametrizzata (soprattutto nel caso di input dell’utente),
- restituire le informazioni sotto forma di un array associativo.
Il primo caso riguarda la sicurezza; il secondo è più o meno per comodità di semplificare l’iterazione dei dati tramite le funzioni di array PHP.
Query al database in WordPress
Innanzitutto, è importante comprendere due concetti:
- parametrizzazione,
- colonna_array
Questi sono il fulcro di come scrivo le mie domande e lavoro con i risultati di esse.
1 Parametrizzazione
Puoi leggere di più su questo nel Codex, ma la parametrizzazione è un modo in cui siamo in grado di scrivere query che funzionano per prevenire l’iniezione di SQL.
Tutti i dati nelle query SQL devono essere sottoposti a escape SQL prima che la query SQL venga eseguita per prevenire attacchi di SQL injection. Il
preparemetodo esegue questa funzionalità per WordPress, che supporta sia una sintassi sprintf() -like che vsprintf() -like.
Vale a dire che il metodo supporta token come %s, %d e %f quando si passano informazioni nella query. Mostrerò un esempio di questo più avanti nel post.
2 Lavorare con le colonne della matrice
I risultati di tali query possono essere restituiti in una varietà di modi diversi. Vale a dire, come un oggetto, un array indicizzato numericamente o un array associativo. Il più delle volte, mi piace usare gli array (e mostrerò come farlo in WordPress più avanti in questo post).
Il motivo, tuttavia, è che posso sfruttare array_column. Dal manuale PHP:
array_column() restituisce i valori da una singola colonna dell’input, identificata da column_key. Facoltativamente, è possibile fornire una chiave_indice per indicizzare i valori nella matrice restituita in base ai valori della colonna chiave_indice della matrice di input.
Ciò significa che se hai un array e ha un gruppo di risultati ognuno dei quali ha la stessa colonna, puoi facilmente semplicemente le informazioni passando l’array in un metodo e quindi passando il nome della colonna in un metodo.
Il risultato? Una matrice numericamente indicizzata dei valori. Ciò rende molto più semplice scorrere i dati tramite array_map, using for o using foreach.
Uno stub per interrogare il database
Con questa logica in atto, ecco lo stub che normalmente utilizzo ogni volta che lavoro direttamente con le query del database:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
",
$userId
),
ARRAY_A
);
if (empty($results)) {
return;
}
$results = array_map($results, 'column_name');
Ed ecco un esempio con un paio di informazioni diverse in modo da poter vedere come funziona :
<?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');
Fare query sulla tabella wp_user_meta potrebbe sembrare sciocco poiché get_user_meta è una funzione API valida, ma ho pensato che sarebbe stata una query facile da capire dato quello che sto cercando di spiegare in questo passato.
Ad ogni modo, non posso fornire la query né posso gestire il caso in cui i risultati potrebbero tornare con più colonne (in tal caso, dovrai lavorare con qualcosa di diverso da array_map, ma dovrebbe essere abbastanza facile, giusto? )
