Использование wpdb для подключения к отдельной базе данных

86

Я хочу подключиться wpdbк другой базе данных. Как мне создать экземпляр и передать ему имя базы данных / имя пользователя / пароль?

Спасибо

Вадих М.
источник
Другая база данных MySQL или другой тип базы данных? Вам все еще нужен доступ к обычной базе данных WordPress, или вы перемещаете сайт из одной БД в другую?
EAMann
1
Да, еще одна база данных MySQL. Это отдельная БД на том же сервере, и это не Wordpress. Это пользовательский БД, с информацией, которую я хочу отображать в WordPress.
Вадих М.
1
Если бы вы сделали это с объектом $ wpdb, если бы это было возможно, он отключил бы остальную часть WordPress от существующей базы данных. Так что не рекомендуется. Другой вариант - создать новый экземпляр, используя EZSQL, который используется WordPress. Я думаю, что EZSQL используется, потому что это слой, который абстрагирует вас от необходимости использовать php-pdo-mysql, php-mysql или php-mysqli, не зная, что может быть установлено на данном сервере.
Volomike
3
Да, это возможно. Можно создать экземпляр wpdb для доступа к любой базе данных и запроса к любой таблице.
Вади М.

Ответы:

139

Да, это возможно.

Объект wpdb может использоваться для доступа к любой базе данных и запроса к любой таблице. Абсолютно не нужно быть связанным с Wordpress, что очень интересно.

Преимущество заключается в возможности использовать все классы и функции wpdb, например get_results, и т. Д., Чтобы не было необходимости заново изобретать колесо.

Вот как:

$mydb = new wpdb('username','password','database','localhost');
$rows = $mydb->get_results("select Name from my_table");
echo "<ul>";
foreach ($rows as $obj) :
   echo "<li>".$obj->Name."</li>";
endforeach;
echo "</ul>";
Вадих М.
источник
4
Booyah. Жаль, что все эти комментарии складывались в сам вопрос, чтобы заблокировать ваш точный ответ.
Джеркларк
@ Джереми Кларк: Я согласен. Надеясь, что наши коллеги по WordPress будут более осторожны, чтобы не распространять невинную дезинформацию.
Вади М.
1
Вы также можете сэкономить время с помощью global $wpdb. Но перед запуском метода $ wpdb-> get_results, вы должны включить wp-load.php как: require_once('/your/wordpress/wp-load.php');
Junior M
Установите префикс WPDB, чтобы WP_Query и get_post генерировали правильный sql-запрос, вызывая$mydb->set_prefix('wp_');
MR
30

В WordPress легко подключиться ко второй базе данных, вы просто создаете новый экземпляр класса WPDB и используете его так же, как и стандартный экземпляр $ wpdb, который мы все знаем и любим.

Предполагая, что вторая база данных имеет ту же информацию для входа в систему, что и основная WP, вы даже можете использовать предопределенные константы из wp-config.php, чтобы избежать жесткого кодирования информации для входа.

/**
 * Instantiate the wpdb class to connect to your second database, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Use the new database object just like you would use $wpdb
 */
$results = $second_db->get_results($your_query);
jerclarke
источник
Это несколько избыточно для ответа Вадиха, но я думаю, что мой пример кода немного яснее, и также важно помнить константы входа в db, поскольку они почти всегда являются правильными для использования, в противном случае вы рискуете столкнуться с проблемами при переходе от dev-> stage- > живые среды, в которых данные для входа могут измениться.
Джеркларк
Установите префикс WPDB, чтобы WP_Query и get_post генерировали правильный sql-запрос, вызывая$second_db->set_prefix('wp_');
MR
21

никто не сказал этого, поэтому я подумал, что я бы добавил еще более простой способ ..

до тех пор, пока ваша дополнительная база данных имеет те же данные о пользователе / ​​пароле для доступа к ней, что и ваша база данных WordPress, вы можете использовать имя базы данных перед именем таблицы, как это

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
CommentLuv
источник
По моему опыту, это работает только для получения данных, то есть с использованием SELECT. Вы не можете вставить данные.
Один защитник
это не будет работать внешне,
Васим А.
7

Хотя они будут работать, вы потеряете возможность использовать «другие» пользовательские функции, такие как запросы get_post_custom и wordpress. Простое решение

$wpdb->select('database_name');

который изменяет базу данных всей системы (mysql select_db). Метод database.table работает, если вы просто хотите сделать простой запрос, но если вы хотите получить доступ к другому блогу WordPress, вы можете использовать select. Вам просто нужно изменить его обратно, когда вы закончите, или ваш блог может делать странные вещи.

кайзер
источник
Я использую это решение, и оно прекрасно работает, за исключением одной вещи. По какой-то неизвестной причине wp_get_post_terms(), кажется, не использовать недавно выбранную БД ?? Каждая другая функция, которую я пробовал (например get_post_meta(), и get_posts()т. Д.), Кажется, работает нормально, но, wp_get_post_terms()похоже, работает с DB_NAMEбазой данных. Есть идеи?
Powerbuoy
7

Я пока не могу комментировать, но я хотел бы расширить ответ Вади М. (это здорово).

Класс базы данных WP является настроенной версией ezSQL Джастина Винсента. Если вам нравится интерфейс и вы хотите создать сайт, не основанный на WordPress, вы можете проверить его: http://justinvincent.com/ezsql

gabrielk
источник
ezSQL был очень расстроен для меня из WPDB. Нет операторов "prepare", нет "insert" или "update" ... Мне нравится использовать весь класс WPDB, как он существует, что возможно, если включить в ваш проект пару файлов из BackPress.
золотые яблоки
@gabrielk Ссылка мертва - новая есть: [1] [1]: justinvincent.com/ezsql
Hexodus
4

Я боролся с использованием $wpdbдля подключения ко второй базе данных блогов с родительского сайта, который должен обновить два блога. Я использовал $wpdb->select($dbname, $dbh)для выбора второй базы данных, но я все еще получал результаты из первой базы данных.

Я решил проблему, вызвав wp_cache_flush()очистку кеша WordPress перед вызовом функций WP во второй базе данных.

Matt
источник