Usar wpdb para conectarse a una base de datos separada

10 sept 2010, 05:31:00
Vistas: 172K
Votos: 108

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

4
Comentarios

¿Otra base de datos MySQL, o otro tipo de base de datos? ¿Aún deseas acceder a la base de datos regular de WordPress, o estás migrando el sitio de una DB a otra?

EAMann EAMann
10 sept 2010 06:39:00

Sí, otra base de datos MySQL. Es una base de datos separada en el mismo servidor, y no es de WordPress. Es una base de datos personalizada, con información que quiero mostrar dentro de WordPress.

Wadih M. Wadih M.
10 sept 2010 06:41:20

Si hicieras eso con el objeto $wpdb, si fuera incluso posible, desconectaría el resto de WordPress de su base de datos existente. Por lo tanto, no es recomendable. Otra opción es crear una nueva instancia usando EZSQL, que es utilizado 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 Volomike
10 sept 2010 08:18:58

Sí, es posible. wpdb puede instanciarse para acceder a cualquier base de datos y consultar cualquier tabla.

Wadih M. Wadih M.
10 sept 2010 15:43:21
Todas las respuestas a la pregunta 6
7
169

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>";
10 sept 2010 15:48:08
Comentarios

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

jerclarke jerclarke
11 sept 2010 23:46:41

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

Wadih M. Wadih M.
20 sept 2010 19:27:06

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');

Junior Mayhe Junior Mayhe
20 sept 2015 01:25:12

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

M-R M-R
13 oct 2015 13:58:07

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(); }

joehanna joehanna
21 ene 2020 03:35:30

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

Faisal Faisal
23 mar 2021 07:50:42

@M-R. ¿Cómo se puede usar wp_query después? Lo estoy intentando pero obtengo resultados de la instalación local de WordPress, no de la base de datos remota a la que me estoy conectando.

stemon stemon
14 abr 2022 00:02:41
Mostrar los 2 comentarios restantes
2
34

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);
11 sept 2010 23:53:01
Comentarios

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.

jerclarke jerclarke
11 sept 2010 23:55:02

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

M-R M-R
13 oct 2015 13:58:53
2
23

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);
29 dic 2010 16:27:16
Comentarios

Según mi experiencia, esto solo funciona para obtener datos, es decir, usando SELECT. No puedes insertar datos.

Protector one Protector one
28 jun 2015 18:06:51

no funcionará externamente,

Wasim A. Wasim A.
31 ene 2019 15:57:21
1
11

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.

8 abr 2011 15:02:04
Comentarios

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?

powerbuoy powerbuoy
9 jul 2013 05:54:58
2

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

10 sept 2010 19:38:36
Comentarios

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.

goldenapples goldenapples
22 abr 2011 22:23:30

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

Hexodus Hexodus
23 nov 2013 10:20:16
0

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.

22 abr 2011 22:13:59