Errore wpdb::prepare chiamato in modo errato - Correzione query WordPress
Ho questo codice per rimuovere i post orfani dopo aver eliminato un custom post type.
Funziona, ma questo codice...
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type='attorneys'"
)
);
...genera questo errore:
PHP Notice: wpdb::prepare è stato chiamato in modo errato. L'argomento query di wpdb::prepare() deve avere un segnaposto.
Dopo aver letto la spiegazione su make.wordpress.org di Andrew Nacin, ho capito (più o meno) che mi manca il secondo argomento.
Poi, dopo aver letto questo post su Stack, mi chiedo se ho davvero bisogno della funzione prepare()
. Ci sono variabili con valori sconosciuti? Non sono sicuro.
...cosa mi sfugge?
AGGIORNAMENTO: Questo codice funziona anche, ma senza prepare() mi chiedo se sia sicuro.
global $wpdb;
$wpdb->query(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type='attorneys'"
);
Consigli?

Si consiglia sempre di utilizzare $wpdb->prepare
quando si ricevono input dall'utente. Questo aiuta a proteggere le query dagli attacchi SQL Injection. Per maggiori dettagli, consulta il Codex
Quando usi $wpdb->prepare
, devi passare le variabili alla query. Nel tuo caso, puoi evitare di usare $wpdb->prepare
poiché stai utilizzando un valore hard-coded. Ma se hai lo stesso valore in una variabile, devi modificarlo come segue
$post_type = 'attorneys';
$wpdb->query(
$wpdb->prepare(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type=%s",
$post_type
)
);
