Este obligatoriu să folosești $wpdb->prefix pentru tabelele personalizate

31 mai 2015, 11:49:37
Vizualizări: 39.4K
Voturi: 21

Îmi cer scuze dacă această întrebare este trivială. Sunt la început în dezvoltarea plugin-urilor pentru WordPress.

În toate tutorialele am găsit următorul lucru: la crearea tabelelor personalizate, se folosește $wpdb->prefix.

Exemplu:

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

Întrebarea mea:

Este obligatoriu să folosesc $wpdb->prefix? Ce se întâmplă dacă nu folosesc prefix pentru tabelele mele personalizate?

0
Toate răspunsurile la întrebare 2
1
27

Este obligatoriu, deși nu este impus.

Luați în considerare scenariul în care două site-uri WordPress au fost configurate în aceeași bază de date. Unul cu prefixul wp_ și altul cu wp2_. Dacă instalați plugin-ul în ambele site-uri cu prefixul, tabelele create vor fi wp_liveshoutbox pentru primul site și wp2_liveshoutbox pentru al doilea site. Dar dacă omiteți prefixul, ambele site-uri vor folosi același tabel numit liveshoutbox și totul se va defecta.

31 mai 2015 11:58:24
Comentarii

Cu alte cuvinte este obligatoriu. :)

Rarst Rarst
31 mai 2015 13:32:01
1

Luați în considerare următoarele aspecte:

Plugin-ul dvs. este utilizat pe o rețea WordPress, care folosește prefixe diferite pentru tabelele fiecărui site. Plugin-ul dvs. ar putea rula simultan pe 836 de site-uri diferite, toate în aceeași bază de date. wp_385677_liveshoutbox este un nume perfect rezonabil pentru un tabel.

Plugin-ul dvs. este instalat de un utilizator care are noțiuni de securitate și a schimbat prefixul tabelelor pentru a bloca bot-urile care încearcă să injecteze select * from wp_users în sistem. Chiar dacă găsesc o nouă vulnerabilitate, nu va funcționa.

A lua scurtături, cum ar fi hardcodarea numelor tabelelor, este o metodă bună pentru a face un produs funcțional rapid, dar nu este o metodă bună pentru a-l lansa. În foarte scurt timp, plugin-ul va avea o grămadă de comentarii "nu funcționează", iar în cel mai rău caz, veți strica site-ul altcuiva.

Dacă am o interogare complexă și nu vreau să mă chinui să scriu 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ...., pot folosi înlocuitori. De exemplu:

$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 se schimbă constant. Ceea ce "funcționează" astăzi poate să nu mai funcționeze mâine. De aceea există funcții API. Dezvoltatorii WordPress se vor asigura că comportamentul API-ului public rămâne consistent (sau vor deprecii funcția). Dacă începeți să folosiți apeluri de metode interne pentru că este "mai rapid așa", de obicei vă va afecta ulterior. Există foarte puține scurtături adevărate în software - ele doar mută munca necesară de acum pentru mai târziu, iar ca cardul dvs. de credit, "mai târziu" costă de obicei mai mult.

31 mai 2015 16:48:40
Comentarii

Deoarece acest lucru menționează multisite, un element suplimentar de notat pe care nu l-am văzut în răspuns este că utilizarea $wpdb->prefix . "users" va rezulta într-un tabel invalid într-o instalare multisite. Acest lucru se întâmplă deoarece va adăuga prefixul bazei de date la tabel. Totuși, multisite folosește un singur tabel de utilizatori, deoarece toți utilizatorii sunt utilizatori ai rețelei. Deci, dacă interogarea implică tabelele wp_users sau wp_usermeta, trebuie să utilizați $wpdb->users sau $wpdb->usermeta respectiv.

butlerblog butlerblog
29 ian. 2019 22:08:49