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


16

Вибачте, якщо це питання є тривіальним. Я тільки починаю розробляти плагіни в WordPress.

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

Приклад:

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

Моє запитання:

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

Відповіді:


22

Вона є обов'язковою, хоча вона не виконується.

Розглянемо сценарій, коли два веб-сайти Wordpress були налаштовані в одній базі даних. Один з префіксом wp_і інший з wp2_. Якщо ви встановите свій плагін на обох сайтах з префіксом, ваші створені таблиці будуть wp_liveshoutboxдля першого та wp2_liveshoutboxдругого сайту. Але якщо ви опустите префікс, обидва сайти будуть використовувати одну liveshoutboxі ту ж таблицю з назвою, і вся справа розпадеться.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.