Ciao! A volte, lavorando su WordPress, capita di dover interrogare direttamente il database - magari su una tabella custom che abbiamo creato per esigenze specifiche del progetto. Come si fa a costruire query SQL in sicurezza sul nostro CMS preferito? Semplice: con la classe $wpdb.
Iniziamo
Per usare $wpdb, è necessario dichiararla come variabile globale all'inizio di qualsiasi funzione personalizzata.
global $wpdb;
Semplicemente richiamiamo $wpdb e siamo pronti ad usare la classe con i suoi "comodi" metodi.
Insert, Update e Delete
La base del CRUD, ecco come utilizzarle.
Insert
global $wpdb;
$wpdb->insert(
"{$wpdb->prefix}my_table",
array( 'colonna1' => 'valore', 'colonna2' => 123 ),
array( '%s', '%d' )
);
$wpdb->prefix ci permette di recuperare il prefisso corretto della tabella. Il primo array contiene le coppie colonna => valore da inserire. Importantissimo è l'ultimo array dedicato a prevenire l'SQL Injection specificando la tipologia di dato che andremo a passare alla nostra query, un po' come PDO di PHP permetteva di fare il binding dei parametri.
Come specificare i dati nell'array:
- %s (stringa)
- %d (intero)
- %f (float)
Update
global $wpdb;
$wpdb->update(
"{$wpdb->prefix}my_table",
array( 'colonna1' => 'nuovo_valore' ),
array( 'ID' => 1 ),
array( '%s' ), // Formato dei dati
array( '%d' ) // Formato del WHERE
);
In update il primo array contiene i valori da modificare, il secondo la condizione WHERE per trovare il record. Il terzo array specifica il formato dei dati da salvare (%s, %d, ecc.), il quarto il formato della condizione WHERE.
Delete
global $wpdb;
$wpdb->delete(
"{$wpdb->prefix}my_table",
array( 'ID' => 1 ),
array( '%d' )
);
Prepare
Siamo anche liberi di scrivere la query SQL che vogliamo in totale sicurezza grazie al metodo prepare().
global $wpdb;
$query = $wpdb->query( $wpdb->prepare(
"UPDATE $wpdb->posts SET post_title = %s, post_content = %s WHERE ID = %d",
array(
'Nuovo titolo',
'Nuovo contenuto',
10
)
));
Con query() scriviamo ed eseguiamo il nostro SQL "preparandolo" in sicurezza grazie al bind dei valori specificati nell'array.
Altri metodi
La classe $wpdb mette a disposizione altri metodi per lavorare direttamente con il database.
Get Results
Usiamo $wpdb->get_results() per recuperare più righe di dati:
global $wpdb;
$query = $wpdb->prepare(
"SELECT post_title, post_date
FROM $wpdb->posts
WHERE post_status = %s
AND post_type = %s
LIMIT %d",
'publish', 'post', 5
);
$risultati = $wpdb->get_results($query);
foreach($risultati as $post){
// qui i risultati
}
Get Row
$wpdb->get_row() per recuperare una sola riga.
global $wpdb;
$id_utente = 5;
$risultato = $wpdb->get_row(
$wpdb->prepare(
"SELECT user_email FROM $wpdb->users WHERE ID = %d",
array( $id_utente )
)
);
echo $risultato->user_email ?? 'Utente non trovato';
È sempre buona pratica usare
prepare()ogni volta che abbiamo un valore da passare.
Get Var
$wpdb->get_var() utile per recuperare un singolo valore (es. il conteggio dei post).
global $wpdb;
$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->prefix}posts" );
echo $count ?? 0;
E per il debug? possiamo usare $wpdb->show_errors() per mostrare gli errori automaticamente oppure $wpdb->print_error() per stamparli manualmente.
global $wpdb;
// Abilita visualizzazione automatica
$wpdb->show_errors();
$wpdb->query("SELECT * FROM tabella_sbagliata");
// L'errore viene stampato automaticamente
global $wpdb;
$risultato = $wpdb->get_row("SELECT * FROM tabella_sbagliata");
if (!$risultato) {
// Stampo manualmente
$wpdb->print_error();
}
Per oggi è tutto grazie per aver letto questo articoletto.

