Muss in benutzerdefinierten Tabellen das Präfix $ wpdb-> verwendet werden?

16

Entschuldigung, wenn diese Frage trivial ist. Ich fange gerade an, Plugins in WordPress zu entwickeln.

In allen Tutorials habe ich folgendes gefunden: Beim Erstellen der benutzerdefinierten Tabellen $wpdb->prefixwird verwendet.

Beispiel:

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

Meine Frage:

Ist es obligatorisch zu verwenden $wpdb->prefix? Was passiert, wenn ich kein Präfix für meine benutzerdefinierten Tabellen verwende?

Neuling
quelle

Antworten:

22

Es ist obligatorisch, wird jedoch nicht erzwungen.

Stellen Sie sich das Szenario vor, in dem zwei Wordpress-Sites in derselben Datenbank eingerichtet wurden. Ein mit dem Präfix wp_und dem anderen mit wp2_. Wenn Sie Ihr Plugin an beiden Standorten mit dem Präfix installieren, werden Ihre erstellten Tabellen wp_liveshoutboxfür den ersten Standort und wp2_liveshoutboxfür den zweiten Standort erstellt. Wenn Sie jedoch das Präfix weglassen, wird auf beiden Websites dieselbe Tabelle mit dem Namen verwendet, liveshoutboxund das Ganze wird getrennt.

Sakibmoon
quelle
12
Mit anderen Worten ist es obligatorisch . :)
Rarst
4

Folgendes berücksichtigen:

Ihr Plugin wird in einem WordPress-Netzwerk verwendet, das für jede Site unterschiedliche Tabellenpräfixe verwendet. Ihr Plugin kann gleichzeitig auf 836 verschiedenen Sites in derselben Datenbank ausgeführt werden. wp_385677_liveshoutboxist ein durchaus vernünftiger Tabellenname.

Ihr Plugin wird von einem Benutzer installiert, der ein gewisses Sicherheitskonzept hat und das Tabellenpräfix geändert hat, um Bots zu blockieren, die versuchen, select * from wp_usersin das System zu injizieren . Selbst wenn sie eine neue Sicherheitslücke finden, wird dies nicht funktionieren.

Verknüpfungen wie das Festcodieren von Tabellennamen sind eine gute Möglichkeit, ein Produkt zum Laufen zu bringen, aber keine gute Möglichkeit, es freizugeben. In kürzester Zeit wird das Plugin eine Menge "Funktioniert nicht" -Kommentare enthalten. Im schlimmsten Fall wird die Website eines anderen beschädigt.

Wenn ich eine komplexe Abfrage habe und mich nicht mit dem Schmerz des Schreibens auseinandersetzen möchte, 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....können Sie Ersatz verwenden. Beispielsweise:

$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 ändert sich ständig. Was heute "funktioniert", funktioniert morgen möglicherweise nicht mehr. Deshalb gibt es API-Funktionen. Der Wordpress-Entwickler sicherstellen, dass das öffentliche API Verhalten konsistent ist (oder sie wird die Funktion an Wert verlieren). Wenn Sie mit internen Methodenaufrufen gestartet werden, da es ‚schneller auf diese Weise‘ wird es in der Regel kommen, wie sie zu beißen. Es gibt nur sehr wenige echte Verknüpfungen in der Software - sie verlagern einfach die erforderliche Arbeit von jetzt zu später und wie Ihre Kreditkarte "später" kostet in der Regel mehr.

paul
quelle
Da hier von Multisite die Rede ist, ist ein zusätzliches Element, das ich in der Antwort nicht gesehen habe, dass die Verwendung $wpdb->prefix . "users"einer ungültigen Tabelle in einer Multisite-Installation resultiert. Das ist , weil es das Präfix db an den Tisch befestigen. Multisite verwendet jedoch nur eine Benutzertabelle, da alle Benutzer Netzwerkbenutzer sind. Wenn die Abfrage also die Tabellen wp_users oder wp_usermeta umfasst, müssen Sie $wpdb->usersbzw. $wpdb->usermetaverwenden.
butlerblog