Utilizarea wpdb pentru conectarea la o bază de date separată
Vreau să conectez wpdb
la o altă bază de date. Cum pot crea instanța și să îi transmit numele bazei de date/numele de utilizator/parola?
Mulțumesc

Da, este posibil.
Obiectul wpdb poate fi folosit pentru a accesa orice bază de date și pentru a interoga orice tabel. Nu este necesar să fie legat de WordPress, ceea ce este foarte interesant.
Beneficiul este capacitatea de a utiliza toate clasele și funcțiile wpdb precum get_results
, etc., astfel încât nu este nevoie să reinventezi roata.
Iată cum:
$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>";

Bravo. Păcat că toate acele comentarii adăugate la întrebare au blocat răspunsul tău precis.

@Jeremy Clarke: Sunt de acord. Sperăm ca colegii noștri din comunitatea WordPress să fie mai atenți pentru a nu răspândi nevinovăți informații greșite.

poți economisi timp folosind global $wpdb
. Dar înainte de a apela metoda $wpdb->get_results, trebuie să incluzi wp-load.php astfel:
require_once('/calea/ta/catre/wordpress/wp-load.php');

Setează prefixul WPDB pentru ca WP_Query și get_post să genereze interogări SQL corecte prin apelarea $mydb->set_prefix('wp_');

Știu că acesta este un fir vechi, dar nu pot să nu simt că suprascrierea variabilei $mydb
cu un obiect nou ar putea lăsa o conexiune deschisă (aș putea greși). Aș verifica dacă $mydb
este deja instanțiat dintr-un apel anterior și, dacă da, aș închide conexiunea înainte de a crea o nouă instanță. ex (scuze că nu pot face blocuri de cod Markdown frumoase în comentarii):
if ($mydb != null) { $mydb->close(); }

@JuniorMayhé Nu pot folosi required_once
deoarece îmi dă eroarea PHP Fatal error: require_once(): Failed opening required

Conectarea la o a doua bază de date este ușoară în WordPress, pur și simplu creezi o nouă instanță a clasei WPDB și o folosești în același mod în care ai folosi instanța standard $wpdb pe care o știm și o iubim cu toții.
Presupunând că a doua bază de date are aceleași credențiale de autentificare ca cea principală WordPress, poți folosi chiar constantele predefinite din wp-config.php pentru a evita hardcodarea informațiilor de conectare.
/**
* Instantiezi clasa wpdb pentru a te conecta la a doua bază de date, $database_name
*/
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
* Folosești noul obiect de bază de date exact cum ai folosi $wpdb
*/
$results = $second_db->get_results($your_query);

Acest lucru este oarecum redundant cu răspunsul lui Wadih, dar cred că exemplul meu de cod este un pic mai clar și, de asemenea, este important să ne amintim constantele de conectare la baza de date, deoarece acestea sunt aproape întotdeauna cele corecte de utilizat. În caz contrar, riști să întâmpini probleme la trecerea de la medii de dezvoltare -> staging -> live, unde detaliile de conectare s-ar putea schimba.

nimeni nu a menționat acest lucru, așa că am crezut că voi adăuga o metodă și mai ușoară...
atâta timp cât baza ta de date suplimentară are aceleași detalii de utilizator/parolă pentru acces ca și baza de date WordPress, poți folosi numele bazei de date înaintea numelui tabelei, astfel:
$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);

Deși aceste metode vor funcționa, veți pierde abilitatea de a utiliza alte funcționalități personalizate precum get_post_custom și interogările WordPress. Soluția simplă este
$wpdb->select('nume_baza_de_date');
care schimbă baza de date la nivel de sistem (un select_db mysql). Metoda bază_de_date.tabel funcționează dacă doriți doar să faceți o interogare simplă, dar dacă doriți să accesați un alt blog WordPress, puteți folosi select. Va trebui doar să o schimbați înapoi când ați terminat, altfel blogul vostru poate avea comportamente neașteptate.

Folosesc această soluție și funcționează excelent, cu excepția unui singur lucru. Din motive necunoscute, wp_get_post_terms()
nu pare să utilizeze noua bază de date selectată?? Orice altă funcție pe care am încercat-o (cum ar fi get_post_meta()
, get_posts()
etc.) pare să funcționeze perfect, dar wp_get_post_terms()
pare să lucreze cu baza de date DB_NAME
. Aveți idei?

Încă nu pot comenta, dar am vrut să extind răspunsul lui Wadih M. (care este excelent).
Clasa de bază de date din WP este o versiune personalizată a ezSQL-ului lui Justin Vincent. Dacă vă place interfața și doriți să faceți un site care nu se bazează pe WordPress, ar putea fi util să verificați: http://justinvincent.com/ezsql

ezSQL a fost foarte frustrant pentru mine, venind din WPDB. Nu există declarații "prepare", nici funcții "insert" sau "update"... Prefer să folosesc întreaga clasă WPDB așa cum există, ceea ce este posibil prin includerea a câteva fișiere din BackPress în proiectul tău.

@gabrielk Linkul este mort - cel nou este: [1] [1]: http://justinvincent.com/ezsql

Am avut dificultăți în utilizarea $wpdb
pentru a mă conecta la o a doua bază de date a unui blog dintr-un site părinte care trebuie să actualizeze două bloguri. Am folosit $wpdb->select($dbname, $dbh)
pentru a selecta a doua bază de date, dar tot primeam rezultate din prima bază de date.
Am rezolvat problema apelând wp_cache_flush()
pentru a goli cache-ul WordPress înainte de a apela funcțiile WP pe a doua bază de date.
