Usando wpdb para conectarse a una base de datos separada

86

Quiero conectarme wpdba otra base de datos. ¿Cómo creo la instancia y le paso el nombre de la base de datos / nombre de usuario / contraseña?

Gracias

Wadih M.
fuente
¿Otra base de datos MySQL u otro tipo de base de datos? ¿Todavía desea acceder a la base de datos normal de WordPress o está moviendo el sitio de una base de datos a otra?
EAMann
1
Sí, otra base de datos MySQL. Es un DB separado en el mismo servidor, y no es Wordpress. Es una base de datos personalizada, con información que quiero mostrar dentro de WordPress.
Wadih M.
1
Si hiciera eso con el objeto $ wpdb, si fuera posible, desconectaría el resto de WordPress de su base de datos existente. Por lo tanto, no recomendado. Otra opción es crear una nueva instancia usando EZSQL, que es usado por WordPress. Creo que EZSQL se usa porque es una capa que te abstrae de tener que usar php-pdo-mysql, php-mysql o php-mysqli, sin saber cuál podría estar instalado en un servidor determinado.
Volomike
3
Si es posible. Se puede crear una instancia de wpdb para acceder a cualquier base de datos y consultar cualquier tabla.
Wadih M.

Respuestas:

139

Si es posible.

El objeto wpdb se puede usar para acceder a cualquier base de datos y consultar cualquier tabla. Absolutamente no es necesario estar relacionado con Wordpress, lo cual es muy interesante.

El beneficio es la capacidad de usar todas las clases y funciones de wpdb como get_results, etc. para que no haya necesidad de reinventar la rueda.

Así es cómo:

$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.
fuente
44
Booyah Lástima que todos esos comentarios se hayan sumado a la pregunta en sí para bloquear su respuesta precisa.
jerclarke
@ Jeremy Clarke: Estoy de acuerdo. Esperando que nuestros compañeros de wordpress sean más cuidadosos de no difundir inocentemente la desinformación.
Wadih M.
1
También puede ahorrar tiempo utilizando global $wpdb. Pero antes de activar el método $ wpdb-> get_results, debe incluir wp-load.php como: require_once('/your/wordpress/wp-load.php');
Junior M
Establecer WPDB prefijo para hacer WP_Query y get_post para generar consulta SQL correcta llamando$mydb->set_prefix('wp_');
MR
30

Conectarse a una segunda base de datos es fácil en WordPress, simplemente crea una nueva instancia de la clase WPDB y la usa de la misma manera que usaría la instancia estándar $ wpdb que todos conocemos y amamos.

Suponiendo que la segunda base de datos tiene la misma información de inicio de sesión que la WP principal, incluso puede usar las constantes predefinidas de wp-config.php para evitar codificar la información de inicio de sesión.

/**
 * 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
fuente
Esto es algo redundante para la respuesta de Wadih, pero creo que mi ejemplo de código es un poco más claro y también es importante recordar las constantes de inicio de sesión de db, ya que casi siempre son las correctas para usar y, de lo contrario, corre el riesgo de tener problemas al pasar de dev-> stage- > entornos en vivo donde los detalles de inicio de sesión pueden cambiar.
jerclarke
Establecer WPDB prefijo para hacer WP_Query y get_post para generar consulta SQL correcta llamando$second_db->set_prefix('wp_');
MR
21

nadie ha dicho esto, así que pensé en agregar una forma aún más fácil ...

siempre que su base de datos adicional tenga los mismos detalles de usuario / contraseña para acceder a ella que su base de datos de WordPress, puede usar el nombre de la base de datos antes del nombre de la tabla como este

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
CommentLuv
fuente
Desde mi experiencia, esto solo funciona para obtener datos, es decir, usar SELECT. No puedes insertar datos.
Protector uno
no funcionará externamente,
Wasim A.
7

Si bien estos funcionarán, perderá la capacidad de utilizar las "otras" características personalizadas, como las consultas get_post_custom y wordpress. La solución simple es

$wpdb->select('database_name');

que cambia la base de datos en todo el sistema (un mysql select_db). El método database.table funciona si solo desea realizar una consulta simple, pero si desea acceder a otro blog de WordPress puede usar select. Solo tendrá que volver a cambiarlo cuando haya terminado o su blog puede hacer cosas extrañas.

emperador
fuente
Estoy usando esta solución y funciona muy bien, excepto por una cosa. Por alguna razón desconocida, wp_get_post_terms()¿no parece usar el DB recientemente seleccionado? Todas las demás funciones que he probado (como get_post_meta(), get_posts()etc.) parecen funcionar bien, pero wp_get_post_terms()parecen funcionar hacia la DB_NAMEbase de datos. ¿Algunas ideas?
powerbuoy
7

Todavía no puedo comentar, pero quería ampliar la respuesta de Wadih M. (que es genial).

La clase de base de datos de WP es una versión personalizada de ezSQL de Justin Vincent. Si le gusta la interfaz y desea hacer un sitio que no esté basado en WordPress, puede consultarlo: http://justinvincent.com/ezsql

gabrielk
fuente
ezSQL fue realmente frustrante para mí, viniendo de WPDB. Sin declaraciones de "preparación", sin "inserción" o "actualización" ... Me gusta usar toda la clase WPDB tal como existe, lo cual es posible al incluir un par de archivos de BackPress en su proyecto.
goldenapples
@gabrielk El enlace está muerto - nuevo es: [1] [1]: justinvincent.com/ezsql
Hexodus
4

Estaba luchando con el uso $wpdbpara conectarme a una segunda base de datos de blogs desde un sitio principal que necesita actualizar dos blogs. Solía $wpdb->select($dbname, $dbh)seleccionar la segunda base de datos, pero aún obtenía resultados de la primera base de datos.

Resolví el problema llamando wp_cache_flush()para borrar el caché de WordPress antes de llamar a las funciones de WP en la segunda base de datos.

Mate
fuente