Czy obowiązkowe jest użycie przedrostka $ wpdb-> w tabelach niestandardowych?

16

Przepraszam, jeśli to pytanie jest trywialne. Właśnie zaczynam opracowywać wtyczki w WordPress.

We wszystkich samouczkach znalazłem to: podczas tworzenia niestandardowych tabel $wpdb->prefixużywa się.

Przykład:

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

Moje pytanie:

Czy użycie jest obowiązkowe $wpdb->prefix? Co się stanie, jeśli nie użyję przedrostka dla własnych tabel?

Nowicjusz
źródło

Odpowiedzi:

22

Jest to obowiązkowe, choć nie jest egzekwowane.

Rozważ scenariusz, w którym dwie witryny Wordpress zostały skonfigurowane w tej samej bazie danych. Jeden z prefiksem, wp_a drugi z wp2_. Jeśli zainstalujesz wtyczkę w obu witrynach z prefiksem, utworzone tabele będą wp_liveshoutboxdla pierwszej witryny i wp2_liveshoutboxdla drugiej witryny. Ale jeśli pominiesz prefiks, obie strony będą używać tej samej tabeli o nazwie liveshoutboxi cała sprawa się rozpadnie.

sakibmoon
źródło
12
Innymi słowy jest to obowiązkowe . :)
Rarst
4

Rozważ następujące:

Twoja wtyczka jest używana w sieci wordpress, która używa różnych prefiksów tabel dla każdej strony. Twoja wtyczka może działać jednocześnie na 836 różnych witrynach, wszystkie w tej samej bazie danych. wp_385677_liveshoutboxto całkowicie rozsądna nazwa tabeli.

Twoja wtyczka jest instalowana przez użytkownika, który ma pewne pojęcie bezpieczeństwa i zmienił prefiks tabeli, aby blokować boty próbujące wstrzyknąć select * from wp_usersdo systemu. Nawet jeśli znajdą nową lukę, nie zadziała.

Stosowanie skrótów, takich jak nazwy tabel kodowania na stałe, jest dobrym sposobem na uruchomienie produktu, ale nie jest dobrym sposobem na jego wydanie. w bardzo krótkim czasie wtyczka będzie zawierała stos komentarzy „nie działa”, w najgorszym przypadku złamiesz czyjąś stronę.

Jeśli mam złożone zapytanie i nie chcę poradzić sobie z bólem pisania 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ...., możesz użyć zamienników. Na przykład:

$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 ciągle się zmienia. To, co „dziś działa”, jutro może nie działać. Dlatego istnieją funkcje API. Programiści Wordpress upewnią się, że zachowanie publicznego interfejsu API jest spójne (lub osłabią funkcję). Jeśli zaczniesz używać wewnętrznych wywołań metod, ponieważ jest to „szybsze w ten sposób”, zwykle wróci, by cię ugryźć. Istnieje bardzo niewiele prawdziwych skrótów w oprogramowaniu - przenoszą one odtąd wymagane prace od teraz do później i podobnie jak karta kredytowa „później” zwykle kosztuje więcej.

Paweł
źródło
Ponieważ wspomina się w tym przypadku o wielu lokalizacjach, dodatkowym elementem, o którym nie zauważyłem w odpowiedzi, jest to, że użycie $wpdb->prefix . "users"spowoduje niepoprawną tabelę w instalacji na wielu stronach. Jest tak, ponieważ umieści on przedrostek db w tabeli. Jednak na wielu stronach używana jest tylko jedna tabela użytkowników, ponieważ wszyscy użytkownicy są użytkownikami sieci. Więc jeśli zapytanie dotyczy tabel wp_users lub wp_usermeta, musisz użyć odpowiednio $wpdb->userslub $wpdb->usermeta.
butlerblog