Обязательно ли использовать префикс $ wpdb-> в пользовательских таблицах

16

Извините, если этот вопрос тривиален. Я только начинаю разрабатывать плагины в WordPress.

Во всех уроках я нашел это: при создании пользовательских таблиц $wpdb->prefixиспользуется.

Пример:

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

Мой вопрос:

Обязательно ли использовать $wpdb->prefix? Что произойдет, если я не использую префикс для своих пользовательских таблиц?

новичок
источник

Ответы:

22

Это обязательно, хотя и не применяется.

Рассмотрим сценарий, когда два сайта Wordpress были настроены в одной базе данных. Один с префиксом, wp_а другой с wp2_. Если вы установите плагин на обоих сайтах с префиксом, созданные вами таблицы будут wp_liveshoutboxдля первого сайта и wp2_liveshoutboxдля второго сайта. Но если вы пропустите префикс, оба сайта будут использовать одну liveshoutboxи ту же таблицу с именами, и все будет разбито.

sakibmoon
источник
12
Другими словами это обязательно . :)
Рарст
4

Учтите следующее:

Ваш плагин используется в сети WordPress, которая использует разные префиксы таблиц для каждого сайта. Ваш плагин может работать одновременно на 836 разных сайтах, все в одной базе данных. wp_385677_liveshoutboxэто совершенно разумное имя таблицы.

Ваш плагин установлен пользователем, который имеет некоторую концепцию безопасности, и изменил префикс таблицы, чтобы блокировать ботов, которые пытаются внедрить select * from wp_usersв систему. Даже если они найдут новую уязвимость, она не сработает.

Использование ярлыков, таких как жесткое кодирование имен таблиц, - это хороший способ запустить продукт в эксплуатацию, но не хороший способ его выпуска. в очень короткое время плагин будет иметь кучу комментариев «не работает», в худшем случае вы взломаете чужой сайт.

Если у меня сложный запрос, и я не хочу иметь дело с болью написания 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id .... вы можете использовать заменители. Например:

$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 постоянно меняется. То, что «работает» сегодня, может не работать завтра. Вот почему есть функции API. Разработчики Wordpress позаботятся о том, чтобы поведение общедоступного API было согласованным (или они не будут использовать эту функцию). Если вы начнете использовать внутренние вызовы методов, потому что это «быстрее», то, как правило, вы снова будете кусать вас. В программном обеспечении очень мало настоящих ярлыков - они просто переносят требуемую работу с настоящего момента на потом, и, как и ваша кредитная карта, «позже» обычно стоит дороже.

Павел
источник
Так как здесь упоминается мультисайт, еще один элемент, который я не заметил в ответе, заключается в том, что использование $wpdb->prefix . "users"приведет к неверной таблице в мультисайтовой установке. Это потому, что он прикрепит префикс db к таблице. Однако в мультисайтах используется только одна пользовательская таблица, поскольку все пользователи являются пользователями сети. Поэтому, если запрос включает таблицы wp_users или wp_usermeta, вы должны использовать $wpdb->usersили $wpdb->usermetaсоответственно.
butlerblog