Cuándo se trabaja con software que requiere identificarse como usuario, ¿quién no se ha visto bloqueado alguna vez? Desde un hackeo a una metedura de pata, te puedes imaginar causas de lo más variadas. Y si el usuario bloqueado es el único administrador, la cosa puede ser complicada.

En el Codex hay un script de “emergencia” para resetear la contraseña de un usuario, pero ¿y si necesitamos crear un administrador completamente nuevo? Pues nada, lo hacemos. Desde MySQL es extremadamente sencillo.

Toma el siguiente código, cambia el prefijo de las tablas wp_users y wp_usermeta por el que utilices en tu instalación, cambia username y password123 por el nombre de usuario y contraseña que desees, y ejecuta:

INSERT INTO `wp_users` (`user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`)
VALUES ('username', MD5('unpassword123'), 'Nombre Apellido', 'admin@example.com', '0');

INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) 
VALUES (NULL, (Select max(id) FROM wp_users), 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');

Cuándo se crea un usuario desde el API de WordPress, también se crea una entrada en la tabla wp_usermeta con el key wp_user_level. Los niveles de usuario se sustituyeron en el 2005 por los roles y las capacidades; salvo que tengas algo que todavía los utilice, que lo veo bastante improbable, creo que esa entrada en la base de datos no hace nada. Si estás en esa situación, el nivel de usuario que se correspondía con el administrador es el 10. Con el siguiente snippet crearás el usuario, el rol administrador y el user level correspondiente;

INSERT INTO `wp_users` (`user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`)
VALUES ('username', MD5('unpassword123'), 'Nombre Apellido', 'admin@example.com', '0');

INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) 
VALUES (NULL, (Select max(id) FROM wp_users), 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');

INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) 
VALUES (NULL, (Select max(id) FROM wp_users), 'wp_user_level', '10');

Super Admins

Y si necesitas un super admin, primero se crea el usuario administrador y luego se le dan permisos de super admin. Desde PHP, en el entorno WordPress, es tan fácil como utilizar la función grant_super_admin():

add_action( 'init', function () {
    // Cambia $user_id por la ID de usuario que quieres hacer super admin
    grant_super_admin( $user_id );
}

Crear super admins desde MySQL es un poco más lioso. Hay que ir a la tabla wp_sitemeta y buscar la entrada con el key admins. El valor de este campo es un array serializado con el nombre de usuario de los super administradores. Basta añadir el nombre de usuario al que se le quiere hacer super admin, lo delicado está en mantener la validez de los datos serializados.

Por ejemplo, podemos tener este valor:

a:1:{i:1;s:11:"superadmin1";}

Y queremos añadir al usuario cybmeta como super admin; el array serializado quedaría del siguiente modo:

a:2:{i:1;s:11:"superadmin1";i:2;s:7:"cybmeta";}

¿Qué hemos hecho?

  • a:2 indica que es un array (a) con dos items (2). Antes era a:1 porque solo había 1 elemento.
  • i:1;s:11:"superadmin1" indica que es el item 1 (i:1) y que consiste en un string (s) de 11 caracteres (s:11:”superadmin1″)
  • i:2;s:7:"cybmeta" indica que es el item 2 (i:2) y que consiste en un string de 7 caracteres (s:7:”cybmeta”)

Si queremos añadir otro más, por ejemplo, el usuario bob:

a:3:{i:1;s:11:"superadmin1";i:2;s:7:"cybmeta";i:3;s:3:"bob";}

Con wp-cli

¿Utilizas wp-cli? Crear un administrador es incluso más fácil (recuerda cambiar username por el nombre de usuario elegido):

$ wp user create username admin@example.com --role=administrator

El password será autogenerado y se mostrará en el terminal; si quieres establecer tu propio password:

$ wp user create username admin@example.com --role=administrator --user_pass=unpassword123

Y para super administradores, primero se crea el usuario y luego se le asignan permisos de super admin:

$ wp super-admin add username

Y si prefieres hacerlo desde PHP, este script tiene buena pinta.

  • Este artículo me lo guardo en favoritos porque siempre que me ha hecho falta me he tirado buenos ratos buscando o recordando cómo hacerlo 🙂

    ¡Muchas gracias!