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
- Definición de tablas de usuario personalizadas – Compartir inicios de sesión
- Instalación de WordPress
- Funciones y capacidades
- Duplicar automáticamente las capas y los niveles con una función
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.
{$pref}usermeta
almacena los metadatos del usuario en pares clave/valor. En esta tabla, cinco filas almacenan los datos que debemos considerar.
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.
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' );
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.
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.
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
.
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.
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:
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
Deja una respuesta