Usar wpdb para conectarse a una base de datos separada
Quiero conectar wpdb
a otra base de datos. ¿Cómo creo la instancia y le paso el nombre de la base de datos/usuario/contraseña?
Gracias

Sí, es posible.
El objeto wpdb puede utilizarse para acceder a cualquier base de datos y consultar cualquier tabla. No necesita estar relacionado con Wordpress en absoluto, lo cual es muy interesante.
El beneficio es la capacidad de usar todas las clases y funciones de wpdb como get_results
, etc., por lo que no es necesario reinventar la rueda.
Así es cómo se hace:
$mydb = new wpdb('usuario','contraseña','basededatos','localhost');
$rows = $mydb->get_results("select Nombre from mi_tabla");
echo "<ul>";
foreach ($rows as $obj) {
echo "<li>".$obj->Nombre."</li>";
}
echo "</ul>";

Booyah. Qué pena que todos esos comentarios acumulados en la pregunta misma bloquearan tu respuesta precisa.

@Jeremy Clarke: Estoy de acuerdo. Espero que nuestros colegas de WordPress sean más cuidadosos para no difundir involuntariamente desinformación.

también puedes ahorrar tiempo usando global $wpdb
. Pero antes de ejecutar el método $wpdb->get_results, debes incluir wp-load.php así:
require_once('/tu/ruta/wordpress/wp-load.php');

Establece el prefijo de WPDB para que WP_Query y get_post generen la consulta SQL correcta llamando a $mydb->set_prefix('wp_');

Sé que este es un hilo antiguo, pero no puedo evitar pensar que sobrescribir la variable $mydb
con un nuevo objeto podría dejar una conexión abierta (podría estar equivocado). Verificaría si $mydb
ya está instanciado desde una llamada anterior, y si es así, cerraría la conexión antes de crear una nueva instancia. Por ejemplo (lo siento, no puedo hacer bloques de código Markdown ordenados en los comentarios):
if ($mydb != null) { $mydb->close(); }

@JuniorMayhé No puedo usar required_once
ya que me da el error PHP Fatal error: require_once(): Failed opening required

Conectarse a una segunda base de datos es fácil en WordPress, simplemente creas una nueva instancia de la clase WPDB y la usas de la misma manera que usarías la instancia estándar de $wpdb que todos conocemos y amamos.
Asumiendo que la segunda base de datos tiene la misma información de acceso que la principal de WordPress, incluso puedes usar las constantes predefinidas de wp-config.php para evitar codificar manualmente los datos de acceso.
/**
* Instancia la clase wpdb para conectarte a tu segunda base de datos, $database_name
*/
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
* Usa el nuevo objeto de base de datos igual que usarías $wpdb
*/
$results = $second_db->get_results($your_query);

Esto es algo redundante con 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 a la base de datos, ya que casi siempre son las correctas para usar. De lo contrario, corres el riesgo de tener problemas al moverte de entornos de desarrollo -> stage -> producción donde los detalles de inicio de sesión podrían cambiar.

nadie ha mencionado esto, así que pensé en añadir una forma aún más fácil...
siempre que tu base de datos adicional tenga los mismos detalles de usuario/contraseña para acceder a ella que tu base de datos de WordPress, puedes usar el nombre de la base de datos antes del nombre de la tabla así:
$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);

Aunque estos métodos funcionarán, perderás la capacidad de usar otras características personalizadas como get_post_custom y las consultas de WordPress. La solución simple es:
$wpdb->select('nombre_de_la_base_de_datos');
Lo cual cambia la base de datos a nivel del sistema (un select_db de MySQL). El método database.tabla funciona si solo quieres hacer una consulta simple, pero si necesitas acceder a otro blog de WordPress puedes usar select. Solo necesitarás cambiarlo de vuelta cuando hayas terminado o tu blog podría comportarse de manera extraña.

Estoy usando esta solución y funciona genial, excepto por una cosa. Por alguna razón desconocida wp_get_post_terms()
no parece usar la nueva base de datos seleccionada?? Todas las demás funciones que he probado (como get_post_meta()
, get_posts()
, etc.) parecen funcionar bien, pero wp_get_post_terms()
parece trabajar con la base de datos DB_NAME
. ¿Alguna idea?

No puedo comentar todavía, pero quería ampliar la respuesta de Wadih M. (que es excelente).
La clase de base de datos de WP es una versión personalizada del ezSQL de Justin Vincent. Si te gusta la interfaz y estás buscando hacer un sitio que no esté basado en WordPress, podrías querer echarle un vistazo: http://justinvincent.com/ezsql

ezSQL fue realmente frustrante para mí, viniendo de WPDB. Sin sentencias "prepare", ni "insert" o "update"... Me gusta usar toda la clase WPDB tal como existe, lo cual es posible incluyendo un par de archivos de BackPress en tu proyecto.

@gabrielk El enlace está roto - el nuevo es: [1] [1]: http://justinvincent.com/ezsql

Tenía problemas al usar $wpdb
para conectarme a una segunda base de datos de un blog desde un sitio principal que necesita actualizar dos blogs. Utilicé $wpdb->select($dbname, $dbh)
para seleccionar la segunda base de datos, pero seguía obteniendo resultados de la primera base de datos.
Resolví el problema llamando a wp_cache_flush()
para limpiar la caché de WordPress antes de llamar a las funciones de WP en la segunda base de datos.
