Використання wpdb для підключення до окремої бази даних


86

Я хочу підключитися wpdbдо іншої бази даних. Як створити екземпляр і передати йому ім'я бази даних / ім'я користувача / пароль?

Дякую


Інша база даних MySQL чи інший тип бази даних? Ви все ще хочете отримати доступ до звичайної бази даних WordPress, або ви переміщуєте сайт з однієї БД в іншу?
EAMann

1
Так, ще одна база даних MySQL. Це окрема БД на одному сервері, і це не Wordpress. Це нестандартний db, з інформацією, яку я хочу відображати всередині wordpress.
Wadih M.

1
Якщо ви зробили це з об’єктом $ wpdb, якби це було можливо, він би відключив решту WordPress від існуючої бази даних. Отже, не рекомендується. Інший варіант - створити новий екземпляр за допомогою EZSQL, який використовується WordPress. Я думаю, що EZSQL використовується, тому що це шар, який дозволяє вам обмежувати використання php-pdo-mysql, php-mysql або php-mysqli, не знаючи, який може бути встановлений на даному сервері.
Воломіке

3
Так, це можливо. wpdb може бути створений для доступу до будь-якої бази даних та запиту будь-якої таблиці.
Wadih M.

Відповіді:


138

Так, це можливо.

Об'єкт 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>";

3
Буя. Шкода, що всі ці коментарі додалися до самого питання, щоб заблокувати вашу точну відповідь.
jerclarke

@ Джеремі Кларк: Я згоден. Сподіваємось, що наші колеги-словоскладники будуть уважнішими, щоб не безневинно поширити дезінформацію.
Wadih M.

1
Ви також можете заощадити час, використовуючи global $wpdb. Але перед тим, як запустити метод $ wpdb-> get_results, ви повинні включити wp-load.php як: require_once('/your/wordpress/wp-load.php');
Молодший М

Встановіть префікс 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- > живі середовища, де можуть змінюватися дані для входу.
jerclarke

Встановіть префікс 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. Ніяких заяв "підготувати", не "вставити" чи "оновити" ... Мені подобається використовувати весь клас WPDB, як він існує, що можливо, включивши у свій проект пару файлів із BackPress.
goldenapples

@gabrielk Посилання мертве - нове: [1] [1]: justinvincent.com/ezsql
Гексод

4

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

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

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