Intereting Posts
Как заказать персонализированные сообщения по одному из значений настраиваемых полей, «дата»? Ограничить доступ пользователей к нескольким сайтам для не назначенных блогов Заказать по условию Количество сообщений по разным параметрам? Письма, отправленные с локального веб-сервера wp, отклоняются от Siren? загрузить только фото Условный тег для всех категорий настраиваемого типа сообщений Создание нескольких записей CPT из одной формы Gravity WordPress Shortcode для баннера, в котором переданный атрибут может содержать несколько предопределенных значений pre_get_posts для категории исключения Меню «Условное Навигационное меню» Меню «Внутри» на разных сайтах Multisite Получить категории, относящиеся к определенной категории Очень странная проблема с поисковым запросом Как отобразить все меню навигации как выпадающее меню в виджетах? Отобразить список категорий, содержащих продукты с определенным тегом

Должен ли я глобальный $ wpdb за пределами возможностей моего модуля плагина?

Я знаю, что общие рекомендации глобальным переменным – не использовать их вообще. Тем не менее, когда что-то делает с базой данных WordPress, требуется global $wpdb; для доступа к методам, которые WordPress обеспечивает для взаимодействия с базой данных.

Теперь я написал небольшой плагин, который вводит несколько функций, которые необходимо взаимодействовать с базой данных WordPress. Это означает, что в каждой функции я написал global $wpdb; , После этого я $wpdb->prefix . 'my_table_name'; имена таблиц, которые необходимы динамически: $wpdb->prefix . 'my_table_name'; $wpdb->prefix . 'my_table_name'; ,

На мой взгляд, это много избыточного кода, который даже может принести гораздо больше работы. Например, я несколько раз менял имена таблиц во время разработки и мне приходилось менять его во всех функциях моего плагина, где я $wpdb->prefix . 'my_table_name'; $wpdb->prefix . 'my_table_name'; ,

Теперь мой вопрос: хорошо ли использовать global $wpdb вне любой области действия, а затем присваивать именам таблиц глобальным переменным?
Таким образом, все будет намного более гибким в отношении имен таблиц (и, возможно, даже производительности?)

Удобный способ использования $wpdb в плагинах с настраиваемыми таблицами и настраиваемыми функциями – писать класс или пару функций, которые получают объект wp, и настраивать его.

Пример:

 /* Return global wpdb aready setup with custom tables */ my_plugin_get_db( wpdb $wpdb = NULL ) { static $db; if ( is_null($db) || ! is_null( $wpdb ) ) { $db = is_null($wpdb) ? $GLOBALS['wpdb'] : $wpdb; } return $db; } /* Setup database saving $wpdb custom table names insie wpdb object */ my_plugin_set_db() { global $wpdb; /* define here your custom table names */ $my_tables = array( 'my_table_1', 'my_table_1', 'my_table_1' ); foreach ( $my_tables as $table ) { $wpdb->$table = $wpdb->prefix . $table; } my_plugin_get_db( $wpdb ); } add_action( 'plugins_loaded', 'my_plugin_set_db' ); /* Multisite compatibility? */ if ( is_multisite() ) { add_action( 'switch_blog', 'my_plugin_set_db' ); } 

После этого в вашем плагине вы можете использовать

 $db = my_plugin_get_db(); $query = $db->query( "SELECT * FROM $db->my_table_1" ); 

Глобализация, определяемая WordPress, не совпадает с созданием собственных глобальных переменных. В первом случае у вас нет выбора, это последний, которого вы можете избежать. Оберните свои функции в классе и определите имя своей таблицы в качестве члена var. Это позволяет определить его в одном месте и не допускать его из глобальной области.