Uno de los peores hábitos, en cuanto a seguridad en informática se
refiere, es utilizar la cuenta de administrador de forma compulsiva para
todo, sin importar que la tarea que estemos haciendo requiera
privilegios de administrador o no. Esto se puede aplicar tanto a la
cuenta de root
en un sistema GNU/Linux como al usuario administrador
en WordPress. Lo ideal sería utilizar una cuenta con el mínimo nivel de
privilegios posible que nos permita llevar a cabo nuestra tarea.
En WordPress hay varios niveles de privilegios, desde suscriptor que sólo puede modificar su perfil, hasta super administrador, pasando por diferentes niveles según se permita la creación, edición o eliminación de artículos.
Si ya teníamos artículos publicados, por ejemplo con el usuario administrador, y queremos pasarlos a otro usuario, por ejemplo con perfil autor, podemos hacerlo, utilizando la cuenta de administrador, uno a uno. Si teníamos muchos artículos, mejor hacerlo directamente sobre la base de datos.
Nos conectamos a la base de datos de WordPress.
$ mysql -uwpuser -p wpdb
Las tablas que vamos a utilizar son wp_posts
y wp_users
. Podemos ver
información relativa a ellas con el comando desc
:
mysql> desc wp_users;
+---------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------------+------+-----+---------------------+----------------+
| ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| user_login | varchar(60) | NO | MUL | | |
| user_pass | varchar(64) | NO | | | |
| user_nicename | varchar(50) | NO | MUL | | |
| user_email | varchar(100) | NO | | | |
| user_url | varchar(100) | NO | | | |
| user_registered | datetime | NO | | 0000-00-00 00:00:00 | |
| user_activation_key | varchar(60) | NO | | | |
| user_status | int(11) | NO | | 0 | |
| display_name | varchar(250) | NO | | | |
+---------------------+---------------------+------+-----+---------------------+----------------+
mysql> desc wp_posts;
+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| post_author | bigint(20) unsigned | NO | MUL | 0 | |
| post_date | datetime | NO | | 0000-00-00 00:00:00 | |
| post_date_gmt | datetime | NO | | 0000-00-00 00:00:00 | |
| post_content | longtext | NO | MUL | NULL | |
| post_title | text | NO | MUL | NULL | |
| post_excerpt | text | NO | | NULL | |
| post_status | varchar(20) | NO | | publish | |
| comment_status | varchar(20) | NO | | open | |
| ping_status | varchar(20) | NO | | open | |
| post_password | varchar(20) | NO | | | |
| post_name | varchar(200) | NO | MUL | | |
| to_ping | text | NO | | NULL | |
| pinged | text | NO | | NULL | |
| post_modified | datetime | NO | | 0000-00-00 00:00:00 | |
| post_modified_gmt | datetime | NO | | 0000-00-00 00:00:00 | |
| post_content_filtered | longtext | NO | | NULL | |
| post_parent | bigint(20) unsigned | NO | MUL | 0 | |
| guid | varchar(255) | NO | | | |
| menu_order | int(11) | NO | | 0 | |
| post_type | varchar(20) | NO | MUL | post | |
| post_mime_type | varchar(100) | NO | | | |
| comment_count | bigint(20) | NO | | 0 | |
+-----------------------+---------------------+------+-----+---------------------+----------------+
Necesitamos conocer los identificadores del usuario origen y usuario destino. Por ejemplo:
mysql> select ID, user_login from wp_users;
+----+------------+
| ID | user_login |
+----+------------+
| 1 | admin |
| 2 | user |
+----+------------+
Cambiamos los artículos del viejo usuario (con identificador 1) al nuevo usuario (con identificador 2):
mysql> update wp_posts set post_author=2 where post_author=1;
Y listos.
Cambiar el nombre de usuario
Cambiar el nombre de usuario que se utiliza para iniciar sesión, una vez
creado el usuario, es algo que no se puede hacer desde el panel de
administración de WordPress, pero podemos cambiarlo desde la consola
MySQL. Por ejemplo, para cambiar el usuario admin
por newlogin
:
$ update wp_users set user_login="newlogin" where user_login="admin";
Actualizado el 12 de enero de 2014
Enumeración de usuarios
WordPress permite mostrar un listado de los artículos de cada usuario
mediante una URL como http://www.example.com/author/username/
. El
problema es que, por defecto, este nombre de usuario coincide con el
nombre de usuario que se utiliza para iniciar sesión en el panel de
administración. Encontrar este nombre de usuario no es difícil, ya que
los enlaces del tipo http://www.example.com/?author=1
redirigen a un
enlace como el anterior, pero con el nombre del usuario que se
corresponde con el identificador utilizado, en este ejemplo el 1, que
además suele ser el usuario administrador.
Afortunadamente, se pueden tener nombres de usuario diferentes para
iniciar sesión y para mostrar los artículos de un usuario a través el
campo user_nicename
. Podemos modificar el nuestro mediante:
mysql> update wp_users set user_nicename="nick" where user_login="username";
Actualizado el 15 de agosto de 2012
Cambiar la información del autor de los comentarios
Los comentarios en WordPress también tienen asociado un usuario. Primero
veamos los campos que tiene la tabla wp_comments
:
mysql> desc wp_comments;
+----------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+---------------------+------+-----+---------------------+----------------+
| comment_ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| comment_post_ID | bigint(20) unsigned | NO | MUL | 0 | |
| comment_author | tinytext | NO | | NULL | |
| comment_author_email | varchar(100) | NO | | | |
| comment_author_url | varchar(200) | NO | | | |
| comment_author_IP | varchar(100) | NO | | | |
| comment_date | datetime | NO | | 0000-00-00 00:00:00 | |
| comment_date_gmt | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| comment_content | text | NO | | NULL | |
| comment_karma | int(11) | NO | | 0 | |
| comment_approved | varchar(20) | NO | MUL | 1 | |
| comment_agent | varchar(255) | NO | | | |
| comment_type | varchar(20) | NO | | | |
| comment_parent | bigint(20) unsigned | NO | MUL | 0 | |
| user_id | bigint(20) unsigned | NO | | 0 | |
+----------------------+---------------------+------+-----+---------------------+----------------+
Si el usuario está registrado, el campo user_id
tiene el identificador
del usuario, sino le asigna un 0. Sin embargo, el nombre, la URL y el
correo electrónico, que queda registrado aunque no se muestre, son los
que tuviera el usuario en el momento de hacer el comentario, por lo que
si el usuario los modifica posteriormente, los cambios no quedan
reflejados en los comentarios anteriores.
Para ver los comentarios de usuarios registrados podemos ejecutar:
mysql> select comment_author, comment_author_url, comment_author_email, comment_author_IP, user_id from wp_comments where user_id != 0;
Si queremos cambiar el autor de los comentarios de un usuario concreto y actualizar la información asociada, por ejemplo cambiar el autor de los comentarios del usuario con identificador 1 al que tiene el 2, no tenemos más que ejecutar:
mysql> update wp_comments c, wp_users u
set c.comment_author=u.user_nicename, c.comment_author_url=u.user_url, c.comment_author_email=u.user_email, c.user_id=u.ID
where u.ID=2 and c.user_id=1;
Dependiendo de la configuración de MySQL, es posible que nos aparezca el siguiente error:
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
Si están activadas las actualizaciones seguras, no se permite ejecutar ninguna sentencia de actualización o borrado si no se utiliza un campo clave en el WHERE o no se utiliza la cláusula LIMIT. En este caso no estamos seleccionando los comentarios por ningún campo clave, de ahí que aparezca el error.
Podemos desactivar las actualizaciones seguras ejecutando:
mysql> set SQL_SAFE_UPDATES=0;
Y ahora ya sí que nos dejará ejecutar la actualización. Si queremos volver a activar las actualizaciones seguras, no tenemos más que asignarle un valor de 1.