Utilisation de wpdb pour se connecter à une base de données séparée

86

Je veux me connecter wpdbà une autre base de données. Comment créer l'instance et lui transmettre le nom de la base de données / nom d'utilisateur / mot de passe?

Merci

Wadih M.
la source
Une autre base de données MySQL ou un autre type de base de données? Voulez-vous toujours accéder à la base de données WordPress standard ou déplacez-vous le site d'une base de données à une autre?
EAMann
1
Oui, une autre base de données MySQL. C'est une base de données séparée sur le même serveur, et ce n'est pas une base Wordpress. C'est une base de données personnalisée, avec les informations que je veux afficher dans wordpress.
Wadih M.
1
Si vous le faisiez avec l'objet $ wpdb, s'il était même possible, il déconnecterait le reste de WordPress de sa base de données existante. Donc, pas recommandé. Une autre option consiste à créer une nouvelle instance à l'aide de EZSQL, utilisée par WordPress. Je pense que EZSQL est utilisé parce que c'est une couche qui vous évite d'utiliser php-pdo-mysql, php-mysql ou php-mysqli, sans savoir ce qui pourrait être installé sur un serveur donné.
Volomike
3
Oui c'est possible. wpdb peut être instancié pour accéder à n’importe quelle base de données et interroger n’importe quelle table.
Wadih M.

Réponses:

139

Oui c'est possible.

L'objet wpdb peut être utilisé pour accéder à n'importe quelle base de données et interroger n'importe quelle table. Absolument pas besoin d'être lié à Wordpress, ce qui est très intéressant.

L'avantage est la possibilité d'utiliser toutes les classes de wpdb et des fonctions telles que get_results, etc pour qu'il n'y ait pas besoin de réinventer la roue.

Voici comment:

$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>";
Wadih M.
la source
4
Booyah. Dommage que tous ces commentaires se soient ajoutés à la question pour bloquer votre réponse exacte.
jerclarke
Jeremy Clarke: Je suis d'accord. En espérant que nos collègues wordpressers feront plus attention à ne pas répandre innocemment la désinformation.
Wadih M.
1
vous pouvez également gagner du temps en utilisant global $wpdb. Mais avant de déclencher la méthode $ wpdb-> get_results, vous devez inclure wp-load.php en tant que: require_once('/your/wordpress/wp-load.php');
Junior M
Définissez le préfixe WPDB pour permettre à WP_Query et à get_post de générer la requête SQL correcte en appelant$mydb->set_prefix('wp_');
MR,
30

La connexion à une deuxième base de données est facile dans WordPress. Vous créez simplement une nouvelle instance de la classe WPDB et vous l'utilisez de la même manière que vous utiliseriez l'instance standard $ wpdb que nous connaissons et aimons tous.

En supposant que la deuxième base de données possède les mêmes informations de connexion que la base de données principale, vous pouvez même utiliser les constantes prédéfinies de wp-config.php pour éviter de coder en dur les informations de connexion.

/**
 * 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);
jerclarke
la source
Ceci est quelque peu redondant dans la réponse de Wadih mais je pense que mon exemple de code est un peu plus clair et il est également important de se rappeler les constantes de connexion à la base de données car elles sont presque toujours les bonnes à utiliser et sinon vous risquez des problèmes lorsque vous passez de dev-> stage- > environnements vivants où les informations de connexion peuvent changer.
jerclarke
Définissez le préfixe WPDB pour permettre à WP_Query et à get_post de générer la requête SQL correcte en appelant$second_db->set_prefix('wp_');
MR,
21

personne n'a dit cela, alors j'ai pensé ajouter un moyen encore plus simple.

tant que votre base de données supplémentaire a les mêmes détails d'utilisateur / de passe pour y accéder que votre base de données wordpress, vous pouvez utiliser le nom de la base de données avant le nom de la table, comme ceci

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
CommentLuv
la source
D'après mon expérience, cela ne fonctionne que pour obtenir des données, c'est-à-dire utiliser SELECT. Vous ne pouvez pas insérer de données.
Protecteur un
cela ne fonctionnera pas à l'extérieur,
Wasim A.
7

Bien que ces solutions fonctionnent, vous ne pourrez plus utiliser les "autres" fonctionnalités personnalisées, telles que les requêtes get_post_custom et wordpress. La solution simple est

$wpdb->select('database_name');

qui change la base de données à l’échelle du système (un mysql select_db). La méthode database.table fonctionne si vous voulez simplement faire une requête, mais si vous voulez accéder à un autre blog wordpress, vous pouvez utiliser select. Vous aurez juste besoin de le changer lorsque vous avez terminé ou votre blog peut faire des choses étranges.

kaiser
la source
J'utilise cette solution et cela fonctionne très bien, sauf pour une chose. Pour une raison inconnue, wp_get_post_terms()ne semble pas utiliser le nouveau DB sélectionné? Toutes les autres fonctions que j'ai essayées (comme get_post_meta(), get_posts()etc.) semblent bien fonctionner, mais wp_get_post_terms()semblent fonctionner pour la DB_NAMEbase de données. Des idées?
powerbuoy
7

Je ne peux pas encore commenter, mais je voulais développer la réponse de Wadih M. (ce qui est excellent).

La classe de base de données WP est une version personnalisée de l'ezSQL de Justin Vincent. Si vous aimez l'interface et que vous souhaitez créer un site qui n'est pas basé sur WordPress, vous pouvez le consulter: http://justinvincent.com/ezsql

Gabrielk
la source
ezSQL était vraiment frustrant pour moi, venant de WPDB. Pas d'instructions "prepare", pas "insert" ou "update" ... J'aime utiliser toute la classe WPDB telle qu'elle existe, ce qui est possible en incluant quelques fichiers de BackPress dans votre projet.
Goldenapples
@gabrielk Le lien est mort - le nouveau est: [1] [1]: justinvincent.com/ezsql
Hexodus
4

J'avais du mal à utiliser $wpdbpour me connecter à une deuxième base de données de blogs à partir d'un site parent qui doit mettre à jour deux blogs. J'avais l'habitude $wpdb->select($dbname, $dbh)de sélectionner la deuxième base de données, mais je continuais à obtenir des résultats de la première base de données.

J'ai résolu le problème en appelant wp_cache_flush()pour vider le cache WordPress avant d'appeler des fonctions WP sur la deuxième base de données.

Mat
la source