Utilizzare wpdb per connettersi a un database separato
Sì, è possibile.
L'oggetto wpdb può essere utilizzato per accedere a qualsiasi database e interrogare qualsiasi tabella. Non deve assolutamente essere correlato a WordPress, il che è molto interessante.
Il vantaggio è la possibilità di utilizzare tutte le classi e funzioni di wpdb come get_results
, ecc., quindi non c'è bisogno di reinventare la ruota.
Ecco come fare:
$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>";

Booyah. Peccato che tutti quei commenti aggiunti alla domanda stessa abbiano bloccato la tua risposta accurata.

@Jeremy Clarke: Concordo. Spero che i nostri colleghi wordpressiani siano più attenti a non diffondere involontariamente disinformazione.

puoi anche risparmiare tempo usando global $wpdb
. Ma prima di utilizzare il metodo $wpdb->get_results, devi includere wp-load.php come:
require_once('/percorso/del/tuo/wordpress/wp-load.php');

Imposta il prefisso WPDB per fare in modo che WP_Query e get_post generino query SQL corrette chiamando $mydb->set_prefix('wp_');

So che questo è un thread vecchio, ma non posso fare a meno di pensare che sovrascrivere la variabile $mydb
con un nuovo oggetto potrebbe lasciare una connessione aperta (potrei sbagliarmi). Controllerei se $mydb
è già stata istanziata da una chiamata precedente e, in tal caso, chiuderei la connessione prima di crearne una nuova istanza. Ad esempio (scusa non posso fare blocchi di codice Markdown ordinati nei commenti):
if ($mydb != null) { $mydb->close(); }

@JuniorMayhé Non riesco a usare required_once
perché mi dà PHP Fatal error: require_once(): Failed opening required

Connettere un secondo database in WordPress è semplice, basta creare una nuova istanza della classe WPDB e usarla nello stesso modo in cui useremmo la standard $wpdb che tutti conosciamo e amiamo.
Assumendo che il secondo database abbia le stesse credenziali di accesso del database principale di WordPress, puoi persino usare le costanti predefinite da wp-config.php per evitare di hardcodare le informazioni di login.
/**
* Istanzia la classe wpdb per connetterti al tuo secondo database, $database_name
*/
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
* Usa il nuovo oggetto database esattamente come useresti $wpdb
*/
$results = $second_db->get_results($your_query);

Questo è in parte ridondante rispetto 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 database, poiché sono quasi sempre quelle corrette da utilizzare. Altrimenti si rischiano problemi quando si passa da ambienti di sviluppo a staging e poi a produzione, dove i dettagli di accesso potrebbero cambiare.

nessuno l'ha ancora detto, quindi ho pensato di aggiungere un modo ancora più semplice...
fintanto che il tuo database aggiuntivo ha le stesse credenziali di accesso (utente/password) del tuo database WordPress, puoi utilizzare 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);

Anche se queste soluzioni funzioneranno, perderai la possibilità di utilizzare le funzionalità personalizzate "altre" come get_post_custom e le query di WordPress. La soluzione semplice è
$wpdb->select('nome_database');
che cambia il database a livello di sistema (un select_db di mysql). Il metodo database.tabella funziona se vuoi solo fare una semplice query, ma se vuoi accedere a un altro blog WordPress puoi usare select. Dovrai solo ripristinare il database originale quando hai finito, altrimenti il tuo blog potrebbe comportarsi in modo strano.

Sto utilizzando questa soluzione e funziona benissimo, tranne per una cosa. Per qualche motivo sconosciuto wp_get_post_terms()
sembra non utilizzare il nuovo database selezionato?? Tutte le altre funzioni che ho provato (come get_post_meta()
, get_posts()
ecc.) sembrano funzionare perfettamente, ma wp_get_post_terms()
sembra lavorare sul database DB_NAME
. Qualche idea?

Non posso ancora commentare, ma volevo ampliare la risposta di Wadih M. (che è ottima).
La classe database di WP è una versione personalizzata dell'ezSQL di Justin Vincent. Se ti piace l'interfaccia e vuoi realizzare un sito che non sia basato su WordPress, potresti dare un'occhiata a: http://justinvincent.com/ezsql

ezSQL è stato davvero frustrante per me, provenendo da WPDB. Niente istruzioni "prepare", niente "insert" o "update"... Mi piace usare l'intera classe WPDB così com'è, cosa possibile includendo un paio di file da BackPress nel tuo progetto.

@gabrielk Il link non funziona - quello nuovo è: [1] [1]: http://justinvincent.com/ezsql

Stavo avendo problemi con l'uso di $wpdb
per connettermi a un secondo database di un blog da un sito principale che deve aggiornare due blog. Ho usato $wpdb->select($dbname, $dbh)
per selezionare il secondo database, ma continuavo a ottenere risultati dal primo database.
Ho risolto il problema chiamando wp_cache_flush()
per pulire la cache di WordPress prima di chiamare le funzioni WP sul secondo database.
