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

31 мая 2015 г., 11:49:37
Просмотры: 39.4K
Голосов: 21

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

Во всех обучающих материалах, которые я нашел, используется $wpdb->prefix при создании пользовательских таблиц.

Пример:

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

Мой вопрос:

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

0
Все ответы на вопрос 2
1
27

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

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

31 мая 2015 г. 11:58:24
Комментарии

Другими словами, это обязательно. :)

Rarst Rarst
31 мая 2015 г. 13:32:01
1

Рассмотрим следующее:

Ваш плагин используется в сети 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 будет вести себя стабильно (или объявят функцию устаревшей). Если вы начнёте использовать внутренние методы, потому что это "быстрее", это обычно обернётся проблемами. В программировании очень мало настоящих сокращений — они просто переносят необходимую работу с настоящего на будущее, и, как с кредитной картой, "потом" обычно обходится дороже.

31 мая 2015 г. 16:48:40
Комментарии

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

butlerblog butlerblog
29 янв. 2019 г. 22:08:49