Использование 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);

Это несколько избыточно для ответа Вадиха, но я думаю, что мой пример кода немного яснее, и также важно помнить константы входа в 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);

По моему опыту, это работает только для получения данных, то есть с использованием 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


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 во второй базе данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.