:::: MENÚ ::::

Conectar un único WordPress a varias Bases de Datos

14/05/2014 — Se ha añadido la explicación de como independizar las carpetas de cada instancia de la una a la otra.

wordpress-two-databese

Imagínate que quieres tener varias páginas en un único hosting, o que sean páginas diferentes dependiendo de la dirección en la que entramos, y que sólo puedes tener una única instalación de WordPress.

Ahora mismo tener un único WordPress y disponer de dos página completamente diferentes, con sus plugins y themes independientes, es una utopía. Se podría conseguir algo parecido con multisite, pero tendría un centro de control y no serían del todo independientes.

Lo que vamos a hacer es con una misma instalación de WordPress crear varias “instancias”, para conseguir que sean independientes la una de la otra y no compartir su información (post, comentarios, media, usuarios, etc.), trabajando como si fueran varios WordPress.

¿Cómo tener en un WordPress dos páginas diferentes?

Para empezar tendremos que saber que punto de acceso va a tener cada web, por ejemplo dominios diferentes. En este caso vamos a usar los dominios; viejo.com que sería el original y el principal, y nueva.com, que este último estaría en el parking del hosting, y nuestro archivo wp-config.php, para decirle que hacer en el caso de que entremos en alguna de ellos.

Disponemos de varias Base de Datos

En la mayoría de hostings normalmente podemos instalar más de una base de datos, pero no un segundo dominio, que haría que tuviésemos una segunda web independiente al principal en un mismo hosting, por lo que esta solución nos viene perfecta.

Simplemente deberemos de crear una base de datos por el proceso habitual en nuestro panel de control, la magia reside en el wp-config.php, en él vamos a buscar las líneas en donde especificamos la base de datos y las cambiamos por la siguiente:

if ( $_SERVER[ 'SERVER_NAME' ] == 'nuevo.com' ) {

	define('DB_NAME', 'nuevo_wordpress'); /* Nombre de la base de datos */
	define('DB_USER', 'root');            /* Usuario de la base de datos */
	define('DB_PASSWORD', 'password');    /* Contraseña de dicho usuario */
	define('DB_HOST', 'localhost');       /* En el 99% de los casos, no hay que cambiar esto */

} else {

	define('DB_NAME', 'viejo_wordpress'); /* Nombre de la base de datos */
	define('DB_USER', 'root');            /* Usuario de la base de datos */
	define('DB_PASSWORD', 'password');    /* Contraseña de dicho usuario */
	define('DB_HOST', 'localhost');       /* En el 99% de los casos, no hay que cambiar esto */

}

Lo que hacemos con if es preguntar, gracias a la variable global $_SERVER que nos trae toda la información sobre la petición y el servidor en que ejecutamos WordPress, si dicha petición es a través del dominio nuevo.com, para en ese caso, usar la base de datos nueva que hemos creado, que se llama nuevo_wordpress. En el caso de que no estemos accediendo a la página con el dominio nuevo.com, use los datos de la base de datos viejo_wordpress (else), haciendo que siempre que no sea el dominio nuevo.com, aparezca el WordPress original.

Si accedemos desde nuevo.com, WordPress detectará que no hay ninguna instalación del mismo en la base de datos, por lo que procederá a instarlo como si fuera una nueva instalación desde cero.

Sólo tengo una Base de Datos

En otros casos, hay hosting que sólo nos permiten crear una única base de datos, por lo que no podemos utilizar el método anterior, así que la única solución es usar la misma base de datos pero, con una prefijo diferente.

Modificaremos el wp-config.php pero sólo la linea que hace referencia al prefijo de las tablas, que es $table_prefix = 'wp_'; y lo dejaremos del siguiente modo:

if ( $_SERVER[ 'SERVER_NAME' ] == 'nuevo.com' ) {

	$table_prefix  = 'nuevo_wp_';

} else {

	$table_prefix  = 'wp_';

}

Al igual que en el caso anterior, con if preguntamos si estamos accediendo desde el dominio nuevo.com y aplicamos el nuevo prefijo, que en este caso es nuevo_wp_. En caso contrario cargamos la configuración que teníamos, que correspondería al WordPress original.

Al entrar por primera vez por nuevo.com, WordPress detectará que no existe ninguna instalación con el prefijo nuevo_wp_ y procederá a instalarlo, dejándonos el WordPress original intacto.

Separar /wp-content, /themes, /uploads y /plugins

WordPress nos permite cambiar la ubicación de sus carpeta, así que nos vamos a aprovechar de ello para poder independizarlas de una instancia a la otra. Volveremos a hacer uso de nuestro amigo wp-config.php.

if ( $_SERVER[ 'SERVER_NAME' ] == 'nuevo.com' ) {

	// /wp-confing - http://codex.wordpress.org/Editing_wp-config.php#Moving_wp-content_folder
	define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/nuevo_com' );
	define( 'WP_CONTENT_URL', 'http://nuevo.com/nuevo_com' );
	
	// /plugins - http://codex.wordpress.org/Editing_wp-config.php#Moving_plugin_folder
	define( 'WP_PLUGIN_DIR', dirname(__FILE__) . '/nuevo_com/plugins' );
	define( 'WP_PLUGIN_URL', 'http://nuevo.com/nuevo_com/plugins' );
	define( 'PLUGINDIR', dirname(__FILE__) . '/nuevo_com/plugins' );
	
	// /uploads - http://codex.wordpress.org/Editing_wp-config.php#Moving_uploads_folder
	define( 'UPLOADS', 'nuevo_com/uploads' );

} else {

	// /wp-confing - http://codex.wordpress.org/Editing_wp-config.php#Moving_wp-content_folder
	define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/viejo_com' );
	define( 'WP_CONTENT_URL', 'http://viejo.com/viejo_com' );
	
	// /plugins - http://codex.wordpress.org/Editing_wp-config.php#Moving_plugin_folder
	define( 'WP_PLUGIN_DIR', dirname(__FILE__) . '/viejo_com/plugins' );
	define( 'WP_PLUGIN_URL', 'http://viejo.com/viejo_com/plugins' );
	define( 'PLUGINDIR', dirname(__FILE__) . '/viejo_com/plugins' );
	
	// /uploads - http://codex.wordpress.org/Editing_wp-config.php#Moving_uploads_folder
	define( 'UPLOADS', 'viejo_com/uploads' );

}

Como en los otros casos, usamos if para comprobar que dominio es. En los define declaramos la constante que usa por defecto WordPress y el nuevo valor que va a tener, que dependiendo del caso es una URL o la ubicación de la carpeta.

Si te has fijado, la carpeta /themes no está. Es porque WordPress no tiene una constante definida para ella y tendríamos que usar en su defecto la función register_theme_directory(). Si no usamos dicha función, WordPress irá a buscarla a la carpeta /wp-content por defecto o la que hayamos declarado nosotros.

Desde mi punto de vista, lo ideal para crear las carpetas para cada instancias, es únicamente crear la carpeta que correspondería a /wp-content y dentro añadir las otras carpetas tal cual, ya que WordPress sabrá que se ha movido la carpeta /wp-content y él automáticamente ya irá a buscar el resto allí.

Como es lógico, si en varios WordPress vas a usar los mismos plugins y themes, no es necesario hacer este paso, aunque sí te recomiendo que lo hagas para la carpeta /uploads, ya que podrías sobrescribir las imágenes que tenías con anterioridad.

El problema, el .htaccess

Si en los diversas instancias de WordPress usas el mismo tipo de permalink no tendrás ningún tipo de problema, pero si usas uno diferente tendrás que modificar el .htaccess para que tenga presente de que dominio viene la petición. Siguiendo con el ejemplo, tu .htaccess debería de quedar así:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# BEGIN Instancias de WordPress

	# BEGIN nuevo.com

		RewriteCond %{SERVER_NAME} =nuevo.com [NC]
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule . /index.php [L]
	
	# END nuevo.com
	
	# BEGIN viejo.com

		RewriteCond %{SERVER_NAME} =viejo.com [NC]
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule . /index.php [L]		
	
	# END viejo.com

# END Instancias de WordPress

</IfModule>

Como verás dentro de propia declaración de WordPress hemos metido la nuestra para cada caso. En realidad esta declaración no difiere en nada de la original de WordPress, pero te sirve como idea de distribución y conducta por si vas a incluir distintos permalinks. Si veis necesario que explique el .htaccess, lo podéis pedir en los comentarios.

Te recomiendo que elimines el permiso de escritura si vas a realizar esta integración, dado que si en alguno de los dos instancias modificas los permalinks, puede ser que pierdas la configuración del otro. Por eso es preferible hacerlo a mano y copiar las indicaciones de WordPress y pegar en el .htaccess


En los ejemplo sólo he usado dos dominio, pero si tienes más dominios, simplemente deberás añadir cuantas sentencias else if te sean necesarias para cada nuevo dominio.

Tampoco hace falta decir que los datos expuestos son de ejemplo, por lo que deberás poner los tuyo en relación a tu base de datos y/o prefijo nuevo que deseas usar y estés usando.

Como has visto, esto nos sirve para tener varias página en un hosting que es monodominio, o sea, que sólo nos pemite trabajar con un dominio, y el mismo permita o no tener más de una base de datos, por lo que podremos crear tantas página basadas en Wordpres como queramos.

Ten presente que sólo existirá un WordPress para toda las instancias, por lo que compartirán las carpetas /wp-content, /themes y /upload, y podremos ver los elementos de una instancia en la otra (menos la carpeta /uploads que se rige por los registros de la base de datos).

Share on Facebook0Tweet about this on TwitterShare on Google+1Share on LinkedIn2Share on Tumblr0Pin on Pinterest0Email this to someone

  • Pablo Palacios Fiestas

    Tengo la siguiente pregunta. Estoy por crear un blog pero se va a generar bastante contenido y la capacidad de mi BD MySQL es de 1gb. Tengo la posibilidad de crear ilimitadas BD. Entonces como puedo hacer para que cuando la BD 1 este llena pueda usar una BD2 y asi sucesivamente. Hay aguna forma.

    Tengo hosting con almacenamiento ilimitado. Agradezco la ayuda

    • En realidad se podría programar WordPress para que trabaje con varias base de datos, pero el costo es bastante elevado, ya que habría que modificar el funcionamiento interno de WordPress para que así pueda hacerlo.

      De todos modos, un gigabyte de base de datos es una cantidad considerable, por lo que durante un muy buen largo periodo de tiempo no te dará problemas.

  • Lenin Palacios

    Al hablar de varias bases de datos, se refiere a varias MySql o puedo usar, MySql y Postgre por ejemplo. No se si tendrá que ver con el tema, pero necesito hacer un sistema que utilice wordpress para lo qu ese manejo de la página, bloqs, comentarios etc. pero en postgre tengo los datos transaccionales (contabilidad, inventario, facturación, etc.). Puedo hacer este híbrido o wordpress solamente es MySql. La idea es utilizar wordpress por los pluggins que tiene y facilidad en el diseño, pero lo que son datos sería en una base de datos más potente. En el modelo MVC wordpress sería el V y el MC sería puro PHP, javascript y jason. Se podrá hacer eso?

    Muchas gracias, muy interesante y útil el bloq.

    • Tu planteamiento se puede hacer, pero desde ya te recomendaría que abandonaras esa idea.

      Yo haría el proyecto en WordPress o usaría un framework, pero usar los dos al mismo tiempo para ahorrarte la Vista te va a dar más quebraderos de cabeza que hacerlo directamente tu a través de código.

      • Lenin Palacios

        ok, lo tendré presente. Sucede que apenas estoy conociendo la herramienta y viendo internamente la forma de trabajar del wordpress. Lo que ando buscando es una herramienta que me facilite la vida para hacer desarrollos rápidos y que sean de buen ver. He visto muchas páginas en wordpress y se ven muy bien, aparte de eso la innumerable cantidad de plugins y gente detrás del framework. También el wordpress contempla muchos elementos que yo tendría que considerar en un desarrollo propio. Vamos a seguir investigando a ver que encuentro.

        Muchas gracias…