Обязательно ли использовать $wpdb->prefix в пользовательских таблицах
Извините, если этот вопрос тривиальный. Я только начинаю разрабатывать плагины для WordPress.
Во всех обучающих материалах, которые я нашел, используется $wpdb->prefix
при создании пользовательских таблиц.
Пример:
$table_name = $wpdb->prefix . "liveshoutbox";
Мой вопрос:
Обязательно ли использовать
$wpdb->prefix
? Что произойдет, если я не буду использовать префикс для моих пользовательских таблиц?

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

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