Utilizzo di wpdb per connettersi a un database separato


86

Voglio collegarmi wpdba un altro database. Come posso creare l'istanza e passargli il nome del database / nome utente / password?

Grazie


Un altro database MySQL o un altro tipo di database? Vuoi ancora accedere al normale database di WordPress o stai spostando il sito da un DB a un altro?
EAMann,

1
Sì, un altro database MySQL. È un DB separato sullo stesso server e non è Wordpress. È un db personalizzato, con le informazioni che voglio visualizzare all'interno di wordpress.
Wadih M.

1
Se lo facessi con l'oggetto $ wpdb, se fosse possibile, disconnetterebbe il resto di WordPress dal suo database esistente. Quindi, non raccomandato. Un'altra opzione è quella di creare una nuova istanza utilizzando EZSQL, che viene utilizzato da WordPress. Penso che EZSQL sia usato perché è un livello che ti impedisce di usare php-pdo-mysql, php-mysql o php-mysqli, non sapendo quale potrebbe essere installato su un determinato server.
Volomike,

3
Si è possibile. wpdb può essere istanziato per accedere a qualsiasi database e interrogare qualsiasi tabella.
Wadih M.,

Risposte:


139

Si è possibile.

L'oggetto wpdb può essere utilizzato per accedere a qualsiasi database e interrogare qualsiasi tabella. Non è assolutamente necessario essere collegati a Wordpress, il che è molto interessante.

Il vantaggio è la possibilità di utilizzare tutte le classi e le funzioni di wpdb get_results, ecc. In modo che non sia necessario reinventare la ruota.

Ecco come:

$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. Peccato che tutti quei commenti aggiunti alla domanda stessa per bloccare la tua risposta accurata.
jerclarke,

@Jeremy Clarke: sono d'accordo. Sperando che i nostri compagni di wordpress stiano più attenti a non diffondere innocentemente la disinformazione.
Wadih M.,

1
puoi anche risparmiare tempo usando global $wpdb. Ma prima di lanciare il metodo $ wpdb-> get_results, devi includere wp-load.php come: require_once('/your/wordpress/wp-load.php');
Junior M

Imposta il prefisso WPDB per rendere WP_Query e get_post per generare la query sql corretta chiamando$mydb->set_prefix('wp_');
MR

30

Connettersi a un secondo database è facile in WordPress, è sufficiente creare una nuova istanza della classe WPDB e utilizzarla nello stesso modo in cui utilizzereste l'istanza $ wpdb standard che tutti conosciamo e amiamo.

Supponendo che il secondo database abbia le stesse informazioni di accesso del WP principale, è anche possibile utilizzare le costanti predefinite di wp-config.php per evitare di codificare le informazioni di accesso.

/**
 * 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);

Questo è in qualche modo ridondante alla risposta di Wadih, ma penso che il mio esempio di codice sia un po 'più chiaro ed è anche importante ricordare le costanti di accesso al db in quanto sono quasi sempre quelle giuste da usare e altrimenti si rischiano problemi quando si passa da dev-> stage- > ambienti live in cui i dettagli di accesso potrebbero cambiare.
jerclarke,

Imposta il prefisso WPDB per rendere WP_Query e get_post per generare la query sql corretta chiamando$second_db->set_prefix('wp_');
MR

21

nessuno l'ha detto, quindi ho pensato di aggiungere un modo ancora più semplice ...

purché il tuo database aggiuntivo abbia gli stessi dettagli utente / pass per accedervi come il tuo database wordpress puoi usare il nome del database prima del nome della tabella in questo modo

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);

Dalla mia esperienza, questo funziona solo per ottenere dati, ad esempio utilizzando SELECT. Non è possibile inserire dati.
Protettore uno il

non funzionerà esternamente,
Wasim A.

7

Mentre funzioneranno, perderai la possibilità di utilizzare le "altre" funzionalità personalizzate come get_post_custom e le query wordpress. La soluzione semplice è

$wpdb->select('database_name');

che cambia il database a livello di sistema (un mysql select_db). Il metodo database.table funziona se vuoi solo fare una semplice query, ma se vuoi accedere ad un altro blog di wordpress puoi usare select. Devi solo cambiarlo quando hai finito o il tuo blog potrebbe fare cose strane.


Sto usando questa soluzione e funziona benissimo, tranne una cosa. Per qualche ragione sconosciuta wp_get_post_terms()non sembra usare il DB appena selezionato ?? Ogni altra funzione che ho provato (come get_post_meta(), get_posts()ecc.) Sembra funzionare bene ma wp_get_post_terms()sembra funzionare verso il DB_NAMEdatabase. Qualche idea?
powerbuoy,

7

Non posso ancora commentare, ma volevo ampliare la risposta di Wadih M. (che è grandiosa).

La classe di database di WP è una versione personalizzata di ezSQL di Justin Vincent. Se ti piace l'interfaccia e vuoi creare un sito che non è basato su WordPress, ti consigliamo di verificarlo: http://justinvincent.com/ezsql


ezSQL è stato davvero frustrante per me, proveniente da WPDB. Nessuna istruzione "preparazione", nessun "inserimento" o "aggiornamento" ... Mi piace usare l'intera classe WPDB così com'è, il che è possibile includendo un paio di file di BackPress nel progetto.
goldenapples,

@gabrielk Il link è morto - il nuovo è: [1] [1]: justinvincent.com/ezsql
Hexodus

4

Ho avuto difficoltà a utilizzare $wpdbper connettermi a un secondo database di blog da un sito padre che deve aggiornare due blog. Ho usato $wpdb->select($dbname, $dbh)per selezionare la seconda base di dati, ma ero ancora ricevendo i risultati del primo database.

Ho risolto il problema chiamando wp_cache_flush()per cancellare la cache di WordPress prima di chiamare le funzioni WP sul secondo database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.