Query database dirette in WordPress
Se sei tornato su uno dei post che ho scritto negli ultimi, diciamo, due anni, è probabile che mi trovi a sostenere l’utilizzo delle API disponibili sulle query del database di directory quasi ogni singola volta.
E la verità è che mi oriento ancora in quella direzione. Cioè, se c’è un’astrazione o un’API disponibile per fare qualcosa di specifico, allora provo a usarla.
Ma in un paio di progetti recenti, ho lavorato con alcuni set di dati relativamente grandi (grandi rispetto ai set di dati non aziendali). E così facendo, ho cercato di assicurarmi che gli aggiornamenti dei dati fossero il più veloci possibile.
In situazioni come questa, sebbene non piaccia agli standard di codifica di WordPress, trovo occasionalmente che le query dirette al database siano l’opzione migliore per farlo in determinate condizioni.
Utilizzo di query database dirette
Le query dirette al database sono una di quelle cose che hanno una reputazione un po’ mista tra gli sviluppatori di WordPress:
- sono scoraggiati negli standard di codifica,
- WordPress offre l’accesso direttamente al database tramite $wpdb,
- ci sono sfumature nelle query del database che dovrebbero essere comprese.
Quindi quando vedi qualcosa del genere :
<?php
private function set_all_scheduled_events_as_public() {
global $wpdb;
// @codingStandardsIgnoreStart
$wpdb->query(
$wpdb->prepare(
"
UPDATE $wpdb->posts
SET post_status = '%s'
WHERE post_type = '%s'
AND post_status = '%s'
",
'publish',
'tribe_events',
'future') );
// @codingStandardsIgnoreEnd
}
Come fai a sapere se è una buona mossa o no? E ancora meglio, come fai a sapere se dovresti utilizzare le query del database di directory nel tuo codice?
Ci sono alcune domande che normalmente mi pongo quando le affronto tutte condivise di seguito.
1 Ci sono indici sulle colonne?
Prima di utilizzare le query dirette al database in WordPress, è necessario verificare se le colonne che sto interrogando hanno indici su dette colonne.
Gli indici vengono utilizzati per individuare rapidamente i dati senza dover cercare in ogni riga di una tabella di database ogni volta che si accede a una tabella di database.
La linea di fondo è che la velocità con cui è possibile eseguire query e aggiornare le colonne è maggiore se sono presenti indici sulle colonne.
Le query dirette al database dipendono dalla struttura del database.
A tal fine, questo non è qualcosa che dovremmo fare tutto il tempo. Ma ci sono momenti in cui è appropriato (come quando stai aggiornando un set di meta valori) e quando non lo è.
2 Parametrizza le tue query
Quando si utilizzano query dirette al database, è estremamente importante parametrizzare le query per motivi di sicurezza. Puoi leggere tutto su questo nel Codex e questo non è qualcosa da saltare.
Direttamente dalla documentazione :
Per una panoramica più completa dell’escape di SQL in WordPress, vedere Convalida dei dati del database. È una lettura obbligata per tutti i contributori di codice WordPress e gli autori di plugin.
Cioè, se stai prendendo l’input dell’utente, devi assicurarti che sia disinfettato, pulito e pronto per essere inserito nel database. Ma, per quel che vale, non permetto quasi mai all’input dell’utente di influire sulle query dirette del database.
Invece, sono normalmente basati sui dati che ho nel codice e voglio aggiornare o modificare quando sono al sicuro nel regno del controllo della codebase.
3 Provali e provali di nuovo
E infine, prima di implementare qualsiasi query diretta, ti consiglio:
- Avviare il front-end SQL ed eseguire le query,
- Nota eventuali errori che possono generare,
- Correggili e riprova.
Quindi, una volta che hai un test di query funzionante per i casi limite per assicurarti che qualcosa non venga alterato. Ciò è particolarmente vero se utilizzerai le clausole LIKE nelle tue query (che probabilmente è un articolo a sé stante).
Mi manca un’API?
Con le dimensioni dell’API di WordPress, c’è sempre la possibilità che mi manchi qualcosa, trascuri qualcosa o semplicemente non sia intelligente riguardo alle API esistenti.
E se questo è il caso, allora sono felice di correggere le informazioni sopra (quindi non esitare a lasciare un commento).
Ma nel frattempo, se stai lavorando con un dato relativamente impostato, sei sicuro che ci siano indici sulle colonne, sai come parametrizzare le query e hai testato i dati, quindi magari facendo con direct le query di database sono la strada da percorrere.
E se è così, ci sono alcuni modi per ignorare gli standard di codifica senza che PHP CodeSniffer ti sgridi. 🙂
