Consultas SQL para limpiar datos huérfanos y purgar la base de datos de WordPress

En instalaciones de WordPress que llevan en activo muchos años, o que han tenido mucha actividad (contenidos, cambios, actualizaciones, plugins) pueden llevar a situaciones que requieran depurar y limpiar contenidos no necesarios de la base de datos, principalemente contenido denominado "huérfano", filas de la base de datos que no están en uso, pero que por error siguen presentes.

Estas acciones de limpieza se pueden llevar a cabo por medio de consultas SQL que nos ayudarán a automatizar las tareas, estas consultas se pueden ejecutar de forma sencilla desde el apartado SQL de la herramienta phpMyAdmin, disponible en cPanel.

Recuerda que en todos los ejemplos las tablas usarán el prefijo wp_, si tu instalación de WordPress usa otro prefijo diferente, deberás cambiar las consultas para que así lo reflejen, cambiando donde aparezca wp_ por el que corresponda en tu caso.

Eliminar etiquetas que no están en uso

Las etiquetas se almacenen en la table wp_terms y tienen a su vez contenido asociado sobre las tablas wp_term_taxonomy y wp_term_relationships.

Para eliminar las etiquetas sin uso, utilizaremos tres consultas SQL, una para cada tabla de las indicadas, que realizarán las comprobaciones oportunas para verificar que efectivamente el término a eliminar no está en uso.

Limpiamos la tabla wp_terms.

DELETE FROM wp_terms WHERE term_id 
IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );

Limpiamos la tabla wp_term_taxonomy.

DELETE wp_term_taxonomy FROM wp_term_taxonomy
LEFT JOIN wp_terms ON (wp_term_taxonomy.term_id = wp_terms.term_id)
WHERE (wp_terms.term_id IS NULL)

Limpiamos la tabla wp_term_relationships.

DELETE FROM wp_term_relationships WHERE term_taxonomy_id 
not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

Eliminar wp_postmeta que no disponga de posts (wp_posts) asociados

DELETE wp_postmeta FROM wp_postmeta
LEFT JOIN wp_posts ON (wp_postmeta.post_id = wp_posts.ID)
WHERE (wp_posts.ID IS NULL)

Eliminar wp_usermeta que no disponga de usuarios (wp_users) asociados

DELETE wp_usermeta FROM wp_usermeta
LEFT JOIN wp_users ON (wp_usermeta.user_id = wp_users.ID)
WHERE (wp_users.ID IS NULL)

Eliminar posts (wp_posts) cuyo usuario (wp_users) ya no exista

DELETE wp_posts FROM wp_posts
LEFT JOIN wp_users ON (wp_posts.post_author = wp_users.ID)
WHERE (wp_users.ID IS NULL)

Eliminar todas las revisiones de los posts

En este ejemplo eliminamos el autoguardado de los cambios que sean más antiguos a 10 días.

DELETE FROM wp_posts
WHERE
    (post_type = 'revision') AND
    (post_modified_gmt < DATE_SUB(NOW(),INTERVAL 10 DAY))

Eliminar los datos transients de la tabla wp_options

Los datos de tipo transitorio (transients) son opciones y consultas complejas que se almacenan en esta tabla como si fuese un sistema de cache, para evitar ejecutar una y otra vez la misma acción, estos datos se purgan automáticamente, pero puede suceder que no siempre ocurra, por lo que podría ser interesante purgar todos los datos de vez en cuando para eliminar contenido expirado, liberar uso de espacio y mejorar el rendimiento de la base de datos al reducir el número de filas.

DELETE FROM wp_options
WHERE option_name LIKE '%\_transient\_%'