Apakah wajib menggunakan awalan $ wpdb-> dalam tabel khusus

16

Maaf jika pertanyaan ini sepele. Saya baru mulai mengembangkan plugin di WordPress.

Dalam semua tutorial saya menemukan ini: saat membuat tabel kustom, $wpdb->prefixdigunakan.

Contoh:

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

Pertanyaan saya:

Apakah wajib untuk digunakan $wpdb->prefix? Apa yang terjadi jika saya tidak menggunakan awalan untuk tabel khusus saya?

pemula
sumber

Jawaban:

22

Ini wajib, meskipun tidak diberlakukan.

Pertimbangkan skenario ketika dua situs Wordpress telah diatur dalam database yang sama. Satu dengan awalan wp_dan lainnya dengan wp2_. Jika Anda memasang plugin di kedua situs dengan awalan, tabel yang Anda buat adalah wp_liveshoutboxuntuk situs pertama dan wp2_liveshoutboxuntuk situs kedua. Tetapi jika Anda menghilangkan awalan, kedua situs akan menggunakan tabel yang sama liveshoutboxdan semuanya akan terpecah.

sakibmoon
sumber
12
Dengan kata lain itu wajib . :)
Rarst
4

Pertimbangkan yang berikut ini:

Plugin Anda digunakan pada jaringan wordpress, yang menggunakan berbagai awalan tabel untuk setiap situs. Plugin Anda dapat berjalan secara bersamaan di 836 situs yang berbeda, semuanya dalam database yang sama. wp_385677_liveshoutboxadalah nama tabel yang masuk akal.

Plugin Anda diinstal oleh pengguna yang memiliki konsep keamanan, dan telah mengubah awalan tabel untuk memblokir bot yang mencoba menyuntikkan select * from wp_userske dalam sistem. Bahkan jika mereka menemukan kerentanan baru, itu tidak akan berhasil.

Mengambil jalan pintas seperti nama tabel hardcoding adalah cara yang baik untuk menjalankan dan menjalankan suatu produk, tetapi bukan cara yang baik untuk merilisnya. dalam waktu yang sangat singkat plugin akan memiliki tumpukan komentar "tidak berfungsi" di dalamnya, dalam kasus terburuk Anda akan merusak situs orang lain.

Jika saya memiliki pertanyaan yang kompleks dan saya tidak ingin berurusan dengan kesulitan menulis 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....Anda dapat menggunakan replacers. Sebagai contoh:

$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 terus berubah. Apa yang "bekerja" hari ini mungkin tidak berfungsi besok. Itu sebabnya ada fungsi API. Pengembang Wordpress akan memastikan perilaku API publik konsisten (atau mereka akan menurunkan fungsi). Jika Anda mulai menggunakan panggilan metode internal karena 'lebih cepat seperti itu' biasanya akan kembali menggigit Anda. Ada beberapa pintasan sejati dalam perangkat lunak - mereka hanya memindahkan pekerjaan yang diperlukan dari sekarang ke nanti, dan seperti kartu kredit Anda "nanti" biasanya harganya lebih mahal.

paul
sumber
Karena ini menyebutkan multisite, elemen tambahan yang perlu diperhatikan yang tidak saya lihat dalam jawabannya adalah penggunaan $wpdb->prefix . "users"akan menghasilkan tabel yang tidak valid dalam instalasi multisite. Itu karena itu akan menambahkan awalan db ke tabel. Namun, multisite hanya menggunakan satu tabel pengguna, karena semua pengguna adalah pengguna jaringan. Jadi, jika kueri melibatkan tabel wp_users atau wp_usermeta, Anda harus menggunakan masing $wpdb->users- $wpdb->usermetamasing.
butlerblog