Nuestro objetivo es crear dos sitios web de WordPress que compartirán los inicios de sesión y los mismos usuarios. Una vez que un usuario se haya suscrito a un sitio web, podrá acceder al otro sitio web con la misma función y capacidades.

Para lograr este objetivo, deberíamos ser capaces de editar el archivo de configuración de WordPress y actualizar las tablas de la base de datos. Es esencial una comprensión general de la arquitectura y la estructura de la base de datos de WordPress, así como un conocimiento básico del desarrollo de WordPress. No te preocupes si no eres un profesional. Sólo sigue las instrucciones de este post y haz tus preguntas en los comentarios.

Antes de empezar a codificar, necesitamos saber dónde se almacenan los roles y capacidades de los usuarios de WordPress. Así que, nuestro primer paso es sumergirnos profundamente en las tablas de la base de datos.

Importante: Lo siguiente no funcionará en el entorno Kinsta debido al hecho de que sólo permitimos una instalación de WordPress para cada sitio (a menos que estés ejecutando WordPress en varios sitios). Puede ser posible hacer que esto funcione en nuestra plataforma, pero requeriría alguna configuración o desarrollo adicional. Recomendamos discutir esto con un desarrollador de WordPress.

Datos y metadatos del usuario

De forma predeterminada, WordPress almacena los datos relacionados con el usuario en tres tablas: {$pref}options, {$pref}users y {$pref}usermeta.

  • La tabla {$pref}options almacena la lista completa de roles y capacidades disponibles en una fila cuyo campo option_key es {$pref}user_roles.
  • La tabla {$pref}users almacena datos básicos de los usuarios, como nombre de usuario, contraseña, correo electrónico, url, etc.
  • La tabla {$pref}usermeta almacena los metadatos de los usuarios.

Cuando trabajamos en nuevas instalaciones de WordPress, no tenemos que preocuparnos por la fila {$pref}user_roles en la tabla {$pref}options, porque el correspondiente campo option_value tiene siempre el mismo valor. Deberíamos considerar esta fila por si acaso estamos trabajando en instalaciones existentes en las que se han cambiado los papeles o las capacidades.

No te preocupes por la tabla de{$pref}users, porque guarda datos básicos de los usuarios que no cambiaremos cuando compartamos usuarios entre sitios web.

La tabla de {$pref}usermeta es la única que vamos a actualizar para lograr nuestro objetivo.

Estructura de la tabla de usuarios y usermeta (source: Codex Database Description)
Estructura de la tabla de usuarios y usermeta
(fuente: Descripción de la base de datos del Codex)

{$pref}usermeta almacena los metadatos del usuario en pares clave/valor. En esta tabla, cinco filas almacenan los datos que debemos considerar.

Cinco filas en la tabla de la meta-usuario almacenan datos relativos a las capacidades del usuario, el nivel y los ajustes del tablero de mandos
Cinco filas en la tabla de la meta-usuario almacenan datos relativos a las capacidades del usuario, el nivel y los ajustes del tablero de mandos

La primera fila tiene el campo meta_clave establecido en {$pref}capabilities, y el correspondiente campo meta_valor es una matriz serializada que contiene el rol de usuario. La segunda fila almacena el nivel de usuario (obsérvese que los niveles de usuario están desactualizados desde WordPress 3.0). Las tres filas restantes se refieren a los ajustes del tablero de mandos el los que no nos vamos a sumergir en presente post. La
función, el nivel y la configuración del usuario son específicos de la instalación de WordPress y se identifican con el mismo valor $pref. Es un dato importante cuando nuestro objetivo es compartir usuarios entre sitios web, porque tendremos que duplicar estas filas y cambiar el campo meta_key en consecuencia.

Eso es todo lo que tenemos que saber sobre las tablas de usuarios cuando pretendemos compartir inicios de sesión y usuarios entre nuevas instalaciones de WordPress. Cuando se trabaja en sitios web existentes, debemos considerar que muchos plugins añaden filas adicionales a {$pref}usermeta, y puede que se nos pida que profundicemos en las tablas de la base de datos.

Dicho esto sobre las tablas de usuarios, podemos dar un paso adelante. Ahora tenemos que definir dos constantes específicas en el archivo wp-config.php.

Definición de tablas de usuario personalizadas – Compartir inicios de sesión

WordPress nos permite poner tablas personalizadas en lugar de {$pref}users y {$pref}usermeta. Esto significa que si dos (o más) sitios web de WordPress comparten una base de datos, podemos establecer las mismas tablas de usuarios y usermeta para todos ellos. En consecuencia, todos los sitios web que compartan este cuadro compartirán los mismos usuarios.

Nota: Para poder compartir los mismos usuarios y tablas usermeta, las instalaciones de WordPress deben compartir la misma base de datos.

Sólo tenemos que definir CUSTOM_USER_TABLE y CUSTOM_USER_META_TABLE en el archivo wp-config.php, como se muestra en el siguiente código:

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', 'my_users_table' );
define( 'CUSTOM_USER_META_TABLE', 'my_usermeta_table' );
Nota: En los sitios web existentes es obligatorio hacer una copia de seguridad de las instalaciones de WordPress antes de hacer cualquier cambio en los archivos wp-config.php y las tablas de datos

Ahora que sabemos lo que hay que hacer, es hora de ejecutar nuestras dos instalaciones de WordPress.

Instalación de WordPress

Para mayor comodidad, nombraré las carpetas raíz de WordPress primero y segundo. first_ y second_ serán los respectivos prefijos de la tabla.
Ahora hagamos la primera instalación.

En este ejemplo, fijamos el campo de prefijo de la tabla en first_
En este ejemplo, fijamos el campo de prefijo de la tabla en first_
Nota: Todas las instalaciones compartirán una única base de datos, y debemos proporcionar a cada instalación un prefijo de tabla único.

Cuando el primer sitio web de WordPress esté en marcha, podemos editar su archivo de configuración. Abre /first/wp-config.php y agrega las siguientes líneas sobre el comentario «stop editing»:

$table_prefix  = 'first_';

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', $table_prefix . 'users' );
define( 'CUSTOM_USER_META_TABLE', $table_prefix . 'usermeta' );

/* That's all, stop editing! Happy blogging. */

Hemos habilitado el modo de depuración obligando a WordPress a almacenar avisos de error y advertencias en el archivo debug.log (lee más acerca de este tema en Un artículo en profundidad sobre cómo configurar WordPress).
Entonces, hemos definido las constantes CUSTOM_USER_TABLE y CUSTOM_USER_META_TABLE a las tablas first_users y first_usermeta. De esta manera no cambiamos la configuración predeterminada de WordPress.

Hemos terminado con la primera instalación. A continuación tenemos que copiar wp-config.php de la primera carpeta de instalación y pegarlo en la carpeta raíz de la segunda instalación. Ten cuidado de cambiar el valor de $table_prefix en consecuencia:

$table_prefix  = 'second_';

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', 'first_users' );
define( 'CUSTOM_USER_META_TABLE', 'first_usermeta' );

CUSTOM_USER_TABLE y CUSTOM_USER_META_TABLE se ajustan a los valores de la primera instalación: first_users y first_usermeta. Eso es todo para la primera instalación.

share logins
WordPress está al tanto de los usuarios existentes y deberíamos establecer una dirección de correo electrónico inexistente para el usuario administrador

Al ejecutar la segunda instalación, debemos establecer una dirección de correo electrónico inexistente para el usuario administrador ya que WordPress encuentra un número de usuarios existentes en la tabla first_users.

WordPress crea un nombre de usuario administrador para la segunda instalación
WordPress crea un nombre de usuario administrador para la segunda instalación

Accede al segundo panel de administración de la instalación como administrador y lista los usuarios de WordPress. Encontrarás el nuevo usuario administrador y todos los usuarios de la primera página web (esto te permite compartir los inicios de sesión). En este momento, los usuarios de un sitio no podrán acceder al otro sitio web.

Los usuarios de la segunda página web no heredarán sus papeles de la primera página web
Los usuarios de la segunda página web no heredarán sus papeles de la primera página web

Para conceder a los usuarios las mismas capacidades en ambos sitios web, tenemos que actualizar la tabla {$pref}usermeta.

Funciones y capacidades

Si estás ejecutando nuevas instalaciones de WordPress, no tienes que preocuparte por la tabla de {$pref}options. Sólo tienes que actualizar la tabla {$pref}usermeta.

En nuestro ejemplo, cuando se crea un nuevo usuario en el primer sitio web, WordPress añade las filas first_capabilities y first_user_level en la first_usermeta table. Para dar acceso al segundo sitio web, estas filas deben ser duplicadas, como se muestra en la imagen de abajo:

second_usermeta_fields

Cuando se crea un nuevo usuario en el segundo sitio web, las filas de second_capabilities y second_user_level se añadirán a la tabla first_usermeta.

A fin de dar los mismos roles y límites a los usuarios en todos los sitios web, las filas de first_capabilities y first_user_level deben duplicarse en second_capabilities y second_user_level. Con estos dos pares de filas en la misma tabla first_usermeta, los usuarios podrían acceder a ambos sitios web con los mismos privilegios.

Para actualizar todas las filas existentes del usermeta puedes ejecutar una consulta SQL o actualizar las tablas desde phpMyAdmin. ¿Pero qué hay de los usuarios que se suscriban a nuestros sitios web a partir de ahora? Según el Codex de WordPress, usaríamos un plugin o construiríamos una función personalizada.

¡Y ahí vamos!

Duplicar automáticamente las capas y los niveles con una función

set_user_role es un gancho de acción que se activa cada vez que se crea un nuevo usuario o se edita el rol de un usuario existente. Gracias a esta acción, podemos automatizar las actualizaciones de las tablas de usermeta.
Así que, en el archivo principal de un plugin añade la siguiente función:

function ksu_save_role( $user_id, $role ) {

	// Site 1
	// Change value if needed
	$prefix_1 = 'first_';
	
	// Site 2 prefix
	// Change value if needed
	$prefix_2 = 'second_';
	
	$caps = get_user_meta( $user_id, $prefix_1 . 'capabilities', true );
	$level = get_user_meta( $user_id, $prefix_1 . 'user_level', true );

	if ( $caps ){
		update_user_meta( $user_id, $prefix_2 . 'capabilities', $caps );
	}

	if ( $level ){
		update_user_meta( $user_id, $prefix_2 . 'user_level', $level );
	}
}

add_action( 'set_user_role', 'ksu_save_role', 10, 2 );

La función de callback mantiene tres argumentos, dos de los cuales son necesarios: $user_id y $role.

Lo que hace la función es bastante auto-explicativo. get_user_meta devuelve el valor del campo meta de usuario especificado. Hemos llamado a esta función dos veces para recuperar los campos first_capabilities y first_user_level. Entonces hemos usado estos valores para añadir campos de second_capabilities y second_user_level a la tabla first_usermeta.

Descarga el mensaje y activa este plugin en la primera página web.

Para hacer que las instalaciones funcionen simétricamente, sólo tenemos que subir y activar el plugin en cualquier instalación, pero ajustando los valores correctos a los prefijos. Por ejemplo, si activáramos esta característica en el segundo sitio web, sólo tenemos que declarar las variables como sigue:

$prefix_1 = 'second_';
$prefix_2 = 'first_';

Así que, edita e instala el plugin en el segundo sitio web y cree un nuevo usuario o cambia un rol de usuario existente. Entonces revisa el primer sitio web. Los roles de los usuarios serán exactamente los mismos que en el segundo sitio web.

Resumen

En este post, he explicado cómo conceder los mismos privilegios a los usuarios en las instalaciones independientes de WordPress. Una vez registrado en un sitio web, el usuario podrá acceder a todos los sitios web que compartan los mismos usuarios y tablas de usermeta.
Durante el proceso trabajé con nuevas instalaciones. Si estás trabajando en sitios web existentes, debes considerar que algunos plugins podrían haber actualizado la tabla de usermeta, o incluso creado nuevas tablas que almacenen datos relacionados con el usuario. En este caso, sería apropiado un análisis más preciso de la base de datos.

Si tienes alguna pregunta sobre cómo compartir los inicios de sesión en WordPress, o si quieres compartir tu experiencia con nosotros, no dudes en unirte a la conversación publicando tus comentarios.

El código completo de nuestro plugin está disponible en este Gist público

Carlo Daniele Kinsta

Carlo es un diseñador y desarrollador de front-end freelance. Cuando escribe artículos y tutoriales, Carlo se ocupa principalmente de los estándares web, pero cuando juega con sitios web, su mejor compañero de trabajo es WordPress.