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

Да, это возможно.
Объект 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>";
}
echo "</ul>";

Бух. Жаль, что все эти комментарии на самом вопросе помешали вашему точному ответу.

@Jeremy Clarke: Согласен. Надеюсь, наши коллеги по WordPress будут осторожнее, чтобы случайно не распространять дезинформацию.

вы также можете сэкономить время, используя global $wpdb
. Но перед вызовом метода $wpdb->get_results необходимо подключить wp-load.php следующим образом:
require_once('/ваш/путь/wordpress/wp-load.php');

Установите префикс WPDB, чтобы WP_Query и get_post генерировали корректный SQL-запрос с помощью вызова $mydb->set_prefix('wp_');

Я знаю, что это старая тема, но не могу избавиться от ощущения, что перезапись переменной $mydb
новым объектом может оставить соединение открытым (возможно, я ошибаюсь). Я бы проверил, был ли $mydb
уже создан предыдущим вызовом, и если да, закрыл бы соединение перед созданием нового экземпляра. Например (извините, не могу сделать аккуратные блоки кода Markdown в комментариях):
if ($mydb != null) { $mydb->close(); }

@JuniorMayhé Я не могу использовать required_once
, так как получаю ошибку PHP Fatal error: require_once(): Failed opening required

Подключение ко второй базе данных в WordPress выполняется просто - вам нужно создать новый экземпляр класса WPDB и использовать его так же, как стандартный экземпляр $wpdb, который мы все знаем и любим.
Если вторая база данных использует те же учетные данные для входа, что и основная база WordPress, вы можете использовать предопределенные константы из wp-config.php, чтобы избежать жесткого кодирования учетных данных.
/**
* Создаем экземпляр класса wpdb для подключения ко второй базе данных $database_name
*/
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
* Используем новый объект базы данных так же, как используется $wpdb
*/
$results = $second_db->get_results($your_query);

Это в некоторой степени повторяет ответ Wadih, но я думаю, что мой пример кода немного понятнее. Также важно помнить о константах для входа в базу данных, так как почти всегда лучше использовать именно их. В противном случае вы рискуете столкнуться с проблемами при переходе между средами разработки, тестирования и продакшена, где данные для входа могут меняться.

никто об этом не упомянул, поэтому я решил добавить ещё более простой способ..
если ваша дополнительная база данных имеет такие же данные пользователя/пароль для доступа, как и ваша WordPress база данных, вы можете использовать имя базы данных перед именем таблицы, вот так:
$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);

Хотя эти методы будут работать, вы потеряете возможность использовать другие пользовательские функции, такие как get_post_custom и запросы WordPress. Простое решение - это:
$wpdb->select('название_базы_данных');
что изменяет базу данных на уровне всей системы (аналог mysql select_db). Метод database.table работает, если вам нужно выполнить простой запрос, но если вы хотите получить доступ к другому блогу WordPress, вы можете использовать select. Вам просто нужно будет вернуть обратно исходную базу данных после завершения работы, иначе ваш блог может вести себя странно.

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

Я пока не могу оставлять комментарии, но хотел бы дополнить ответ Wadih M. (который отличный).
Класс базы данных в WordPress — это модифицированная версия ezSQL от Justin Vincent. Если вам нравится этот интерфейс и вы хотите использовать его для сайта, не основанного на WordPress, стоит ознакомиться с оригиналом: http://justinvincent.com/ezsql

ezSQL был для меня очень разочаровывающим после работы с WPDB. Нет "prepare" запросов, нет "insert" или "update"... Мне нравится использовать весь класс WPDB как есть, что возможно, включив несколько файлов из BackPress в ваш проект.

@gabrielk Ссылка не работает - новая вот: [1] [1]: http://justinvincent.com/ezsql

У меня возникли трудности с использованием $wpdb
для подключения к базе данных второго блога с родительского сайта, которому необходимо обновлять два блога. Я использовал $wpdb->select($dbname, $dbh)
для выбора второй базы данных, но всё равно получал результаты из первой базы.
Я решил проблему, вызвав wp_cache_flush()
для очистки кеша WordPress перед вызовом функций WP для второй базы данных.
