Crear usuario administrador de WordPress vía SQL

Contexto

Aplica cuando {prefix}users está vacía o sin admin accesible. Requiere acceso directo a la BD (phpMyAdmin, mysql CLI). Compatible con MySQL 5.7+ / MariaDB 10.x+.

Mecanismo

Hash de contraseña: desde WP 6.8 el formato nativo es $wp$2y$10$... (bcrypt vía password_hash() de PHP), no generable en SQL puro. Se usa en su lugar el fallback legacy: user_pass = MD5(password). WordPress detecta hash de 32 caracteres → autentica → rehash automático a bcrypt en el mismo login. No requiere acción manual post-login más que loguearse una vez.

Prefijo dinámico: nombres de tabla no son parametrizables en SQL estándar (? no aplica a identificadores). Se resuelve con PREPARE/EXECUTE, construyendo el texto del INSERT vía CONCAT() con la variable de prefijo, y pasando los valores reales por USING.

Rol admin: no es una columna; se define en {prefix}usermeta con dos filas:

  • {prefix}capabilities = a:1:{s:13:"administrator";s:1:"1";} (array PHP serializado)
  • {prefix}user_level = 10

Script

SQL
-- 1) CONFIGURACIÓN ---------------------------------------------
SET @prefix      = 'wp_';
SET @admin_user  = 'admin';
SET @admin_pass  = 'CAMBIA-ESTA-CLAVE-2026';
SET @admin_email = 'correo@dominio.cl';
-- -----------------------------------------------------------------

SET @nicename = LOWER(REPLACE(@admin_user, ' ', '-'));

-- 2) INSERT en {prefix}users
SET @sql_user = CONCAT(
  'INSERT INTO `', @prefix, 'users` ',
  '(`user_login`,`user_pass`,`user_nicename`,`user_email`,`user_url`,',
  '`user_registered`,`user_activation_key`,`user_status`,`display_name`) ',
  'VALUES (?, MD5(?), ?, ?, \'\', NOW(), \'\', 0, ?)'
);
PREPARE stmt FROM @sql_user;
EXECUTE stmt USING @admin_user, @admin_pass, @nicename, @admin_email, @admin_user;
DEALLOCATE PREPARE stmt;

SET @new_user_id = LAST_INSERT_ID();

-- 3) INSERT reutilizable en {prefix}usermeta
SET @sql_meta = CONCAT(
  'INSERT INTO `', @prefix, 'usermeta` (`user_id`,`meta_key`,`meta_value`) VALUES (?, ?, ?)'
);
PREPARE stmt_meta FROM @sql_meta;

SET @cap_key = CONCAT(@prefix, 'capabilities');
EXECUTE stmt_meta USING @new_user_id, @cap_key, 'a:1:{s:13:"administrator";s:1:"1";}';

SET @level_key = CONCAT(@prefix, 'user_level');
EXECUTE stmt_meta USING @new_user_id, @level_key, '10';

DEALLOCATE PREPARE stmt_meta;

-- 4) Verificación
SELECT @new_user_id AS nuevo_id, @admin_user AS usuario, @admin_email AS correo;

Notas de ejecución

  • ID se omite del INSERT → lo asigna AUTO_INCREMENT; evita colisión si la tabla no está realmente vacía.
  • MD5() se aplica dentro del INSERT, nunca queda la clave plana en un resultado intermedio.
  • Requiere que el motor de sesión soporte PREPARE/EXECUTE (estándar en MySQL/MariaDB; sin restricciones en cPanel/phpMyAdmin típico).
  • NO_BACKSLASH_ESCAPES en sql_mode rompería el escape \'\' — no es el default, pero verificar si la instancia lo tiene activado.

Post-ejecución

  1. Login en /wp-admin con @admin_user / @admin_pass.
  2. Hash se reescribe a bcrypt automáticamente en ese login.
  3. Cambiar contraseña desde el perfil.
  4. Si la tabla vacía fue síntoma de una migración/dump corrupto, revisar también {prefix}options.siteurl y .home.

Alternativa con acceso SSH

BASH
wp user create admin correo@dominio.cl --role=administrator --user_pass=clave

Genera bcrypt real desde el inicio, sin depender del auto-rehash. Preferible si hay WP-CLI disponible; el script SQL es el camino cuando solo hay phpMyAdmin/consola MySQL.