È obbligatorio utilizzare $ wpdb-> prefisso nelle tabelle personalizzate


16

Scusa se questa domanda è banale. Sto appena iniziando a sviluppare plugin in WordPress.

In tutti i tutorial ho trovato questo: durante la creazione delle tabelle personalizzate, $wpdb->prefix viene utilizzato.

Esempio:

$table_name = $wpdb->prefix . "liveshoutbox";

La mia domanda:

È obbligatorio da usare $wpdb->prefix? Cosa succede se non utilizzo il prefisso per le mie tabelle personalizzate?

Risposte:


22

È obbligatorio, sebbene non sia applicato.

Considerare lo scenario in cui due siti Wordpress sono stati installati nello stesso database. Uno con prefisso wp_e un altro con wp2_. Se si installa il plug-in in entrambi i siti con il prefisso, le tabelle create saranno wp_liveshoutboxper il primo sito e wp2_liveshoutboxper il secondo sito. Ma se si omette il prefisso, entrambi i siti utilizzeranno la stessa tabella denominata liveshoutboxe l'intero processo verrà interrotto.


12
In altre parole è obbligatorio . :)
Rarst

4

Considera quanto segue:

Il plug-in viene utilizzato su una rete wordpress, che utilizza prefissi di tabella diversi per ciascun sito. Il tuo plugin potrebbe essere in esecuzione contemporaneamente su 836 siti diversi, tutti nello stesso database. wp_385677_liveshoutboxè un nome di tabella perfettamente ragionevole.

Il plug-in è installato da un utente che ha un concetto di sicurezza e ha modificato il prefisso della tabella per bloccare i robot che tentano di iniettare select * from wp_usersnel sistema. Anche se trovano una nuova vulnerabilità, non funzionerà.

Prendere scorciatoie come i nomi delle tabelle hardcoding è un buon modo per mettere in funzione un prodotto, ma non un buon modo per rilasciarlo. in pochissimo tempo il plugin avrà una pila di commenti "non funziona", nel peggiore dei casi si romperà il sito di qualcun altro.

Se ho una query complessa e non voglio affrontare il dolore della scrittura 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ...., puoi usare i sostituti. Per 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 continua evoluzione. Ciò che "funziona" oggi potrebbe non funzionare domani. Ecco perché ci sono funzioni API. Gli sviluppatori di Wordpress si assicureranno che il comportamento dell'API pubblica sia coerente (o che deprezzeranno la funzione). Se inizi a utilizzare le chiamate di metodo interne perché è "più veloce in quel modo", di solito tornerà a morderti. Esistono pochissime scorciatoie nel software: spostano il lavoro richiesto da ora in poi e come la tua carta di credito "dopo" di solito costa di più.


Poiché questo menziona il sito multiplo, un ulteriore elemento da notare che non ho visto nella risposta è che l'utilizzo $wpdb->prefix . "users"risulterà in una tabella non valida in un'installazione multisito. Questo perché applicherà il prefisso db alla tabella. Tuttavia, il multisito utilizza solo una tabella utenti, poiché tutti gli utenti sono utenti di rete. Pertanto, se la query coinvolge le tabelle wp_users o wp_usermeta, è necessario utilizzare $wpdb->userso $wpdb->usermetarispettivamente.
Butlerblog,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.