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
-- 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
IDse omite delINSERT→ lo asignaAUTO_INCREMENT; evita colisión si la tabla no está realmente vacía.MD5()se aplica dentro delINSERT, 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_ESCAPESensql_moderompería el escape\'\'— no es el default, pero verificar si la instancia lo tiene activado.
Post-ejecución
- Login en
/wp-admincon@admin_user/@admin_pass. - Hash se reescribe a bcrypt automáticamente en ese login.
- Cambiar contraseña desde el perfil.
- Si la tabla vacía fue síntoma de una migración/dump corrupto, revisar también
{prefix}options.siteurly.home.
Alternativa con acceso SSH
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.