È obbligatorio utilizzare $wpdb->prefix nelle tabelle personalizzate
Mi scuso se questa domanda è banale. Sto iniziando ora a sviluppare plugin per WordPress.
In tutti i tutorial che ho trovato viene mostrato questo: durante la creazione di tabelle personalizzate, viene utilizzato $wpdb->prefix
.
Esempio:
$table_name = $wpdb->prefix . "liveshoutbox";
La mia domanda:
È obbligatorio utilizzare
$wpdb->prefix
? Cosa succede se non uso il prefisso per le mie tabelle personalizzate?

È obbligatorio, anche se non è imposto.
Considera lo scenario in cui due siti WordPress sono stati configurati nello stesso database. Uno con il prefisso wp_
e l'altro con wp2_
. Se installi il tuo plugin in entrambi i siti con il prefisso, le tabelle create saranno wp_liveshoutbox
per il primo sito e wp2_liveshoutbox
per il secondo. Ma se ometti il prefisso, entrambi i siti utilizzeranno la stessa tabella chiamata liveshoutbox
e l'intero sistema si interromperà.

Considera quanto segue:
Il tuo plugin viene utilizzato su una rete WordPress, che utilizza prefissi di tabella diversi per ogni sito. Il tuo plugin potrebbe essere eseguito contemporaneamente su 836 siti diversi, tutti nello stesso database. wp_385677_liveshoutbox
è un nome di tabella perfettamente ragionevole.
Il tuo plugin viene installato da un utente che ha una certa concezione della sicurezza e ha modificato il prefisso delle tabelle per bloccare i bot che cercano di iniettare select * from wp_users
nel sistema. Anche se trovassero una nuova vulnerabilità, non funzionerebbe.
Prendere scorciatoie come hardcodare i nomi delle tabelle è un buon modo per far funzionare un prodotto rapidamente, ma non è un buon modo per rilasciarlo. In pochissimo tempo il plugin avrà una pila di commenti "non funziona" e, nel peggiore dei casi, potresti danneggiare il sito di qualcun altro.
Se ho una query complessa e non voglio affrontare il dolore di scrivere 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....
puoi usare i replacer. Ad esempio:
$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';
$change = array (
'%table%' => $wpdb->prefix . '_mytable',
'%meta%' => $wpdb->prefix . '_mytablemeta'
);
$sql = str_replace( array_keys( $change ), array_values( $change ), $query );
$results = $wpdb->get_results( $sql );
WordPress è in costante evoluzione. Ciò che "funziona" oggi potrebbe non funzionare domani. Ecco perché esistono le funzioni API. Gli sviluppatori di WordPress si assicureranno che il comportamento delle API pubbliche sia coerente (o deprecheranno la funzione). Se inizi a utilizzare chiamate a metodi interni perché è "più veloce così", di solito ti si ritorcerà contro. Ci sono pochissime vere scorciatoie nel software: semplicemente spostano il lavoro necessario da ora a dopo, e come con la tua carta di credito, "dopo" di solito costa di più.

Dato che si menziona il multisite, un elemento aggiuntivo da notare che non ho visto nella risposta è che l'uso di $wpdb->prefix . "users"
risulterà in una tabella non valida in un'installazione multisite. Questo perché anteporrà il prefisso del database alla tabella. Tuttavia, il multisite utilizza solo una tabella utenti, poiché tutti gli utenti sono utenti di rete. Quindi, se la query coinvolge le tabelle wp_users o wp_usermeta, devi usare rispettivamente $wpdb->users
o $wpdb->usermeta
.
