Cuando tu web lleva ya un tiempo funcionando, es normal que haya cosas que ya no sean necesarias pero sigan existiendo. Uno de los casos más molestos es el de las imágenes que ya no se usan pero que siguen ocupando espacio en tu WordPress.
Estas imágenes que ya no usas en tus entradas o páginas, o en cualquier otro tipo de contenido que ha quedado obsoleto, siguen alojadas en tu servidor, gastando recursos y espacio de almacenamiento. Lo mejor que puedes hacer con ellas es eliminarlas si no las vas a volver a utilizar. Pero, ¿cómo las puedes encontrar y asegurarte de que no se están usando en ningún sitio? Vamos a verlo…
Antes de empezar
Lo primero que has de hacer si quieres borrar imágenes de tu WordPress que ya no se están usando es hacer una copia de seguridad de tu web, que incluya también los archivos de medios dentro del directorio wp-content
.
Aunque las imágenes que subes a la biblioteca de medios se guardan dentro de wp-content/uploads/
, es posible que si usas o usaste un plugin para subir los archivos, estos acabaran guardados en otro directorio diferente. De ahí que te asegures de que tienes una copia de seguridad de tu base de datos de WordPress y de todos los archivos que hay dentro de del directorio wp-content
y no sólo de wp-content/uploads
.
Con la copia de seguridad creada, podemos seguir con los siguientes pasos…
Detectar las imágenes que han quedado huérfanas en WordPress
Hay varias formas de detectar las imágenes que ya no se usan en ningún contenido dentro de tu web en WordPress. La más efectiva es buscarlas en la base de datos de WordPress.
Para ello debemos saber que las imágenes que has subido a la biblioteca de medios de WordPress se almacenan dentro de la tabla wp_posts
como si de una entrada o página más se tratase. Lo que las distingue de otros contenidos almacenados en esta tabla es que tienen el valor attachment dentro de la columna post_type
.
Por cierto, aviso importante: si no tienes conocimientos sobre bases de datos, lo mejor es que tengas cuidado con lo que haces a partir de ahora, ten cerca la copia de la base de datos y écha un vistazo a esta entrada del Codex de WordPress donde te explican todo con más detalle.
¿Por dónde íbamos? Ah, sí: queremos encontrar todas aquellas imágenes que no se estén usando en tu WordPress. Esto es más fácil de definir que de hacer, pero no te preocupes, vamos a intentar explicarlo poco a poco y de forma sencilla.
Necesitaremos escribir una consulta en lenguaje SQL para ejecutar en la base de datos MySQL de WordPress. Si no sabes acceder a la base de datos de tu web, ponte en contacto con tu proveedor de alojamiento web para que te explique cómo has de hacerlo. Si te dan acceso a un phpMyAdmin, también nos vale 😉
La consulta que necesitas ejecutar es la siguiente:
Lo primero que hacemos es empezar con una instrucción SELECT
para seleccionar todas las filas de una tabla en concreto. En la línea 2, el asterisco viene a indicar esto mismo, que nos quedamos con todas las columnas de cada fila seleccionada.
Las líneas 3 y 4 sirven para indicar de qué tabla vamos a seleccionar las filas. Como ves, la tabla que vamos a seleccionar es wp_posts
, que es la tabla donde se guardan los attachments (archivos de la biblioteca de medios) de WordPress.
A partir de la línea 5, la sentencia WHERE
nos sirve para ir añadiendo condiciones para filtrar sólo las filas que nos interesan y que queremos que aparezcan en el resultado de la consulta SELECT
.
Cada condición entre las líneas 6 y 14 va separada por la instrucción AND, que nos sirve para indicar que se han de cumplir todas las condiciones a la vez. Si una fila no cumple todas las condiciones del WHERE
, no se devolverá en la salida de la consulta SELECT
.
La primera condición de la línea 6 nos define que queremos quedarnos sólo con las filas cuyo valor de la columna post_type
sea attachment. Como ya comenté antes, en la tabla wp_posts
se guardan también entradas y páginas, entre otros contenidos. Con esta condición sólo nos quedaremos con las imágenes.
Para cada attachment, WordPress se apunta si se está usando en una entrada o página (o cualquier otro contenido) mediante la columna post_parent
. En esta columna se guarda habitualmente el identificador de la entrada o página dónde se usa la imagen, o cero en caso de que no se use. Por esto, la condición de la línea 8 nos hace quedarnos con aquellos attachments cuyo post_parent
no exista.
Por otro lado, si escogemos una imagen para que sea la imagen destacada de una entrada o página, WordPress crea un metadato en la tabla wp_postmeta
con la clave _thumbnail_id
y como valor pone el identificador del attachment de la imagen. En la línea 10 de la consulta nos quedamos con aquellas imágenes cuyo identificador no aparezca como valor de una fila de wp_postmeta
para la clave _thumbnail_id
.
La línea 12 define una condición para quedarnos con las imágenes cuya URL no aparezca en el contenido de entradas o páginas. De este modo, si dentro del contenido aparece la URL de la imagen, entendemos que la imagen sigue siendo útil y por tanto no habrá que borrarla. Fíjate que la URL de la imagen aparece en la columna guid
de la tabla wp_posts
.
Por último, existe la posibilidad de que utilices algún plugin que meta la URL de las imágenes en filas de la tabla wp_postmeta
. La condición de la línea 14 sirve para detectar este caso.
Y ya está, ejecutar esta consulta SQL te devolverá todas las filas de imágenes que presuntamente no se están usando y han quedado huérfanas en WordPress.
Ten en cuenta que al buscar imágenes huérfanas puede haber falsos positivos, es decir, imágenes que se devuelven pero que en realidad sí que están siendo usadas en WordPress. Esto es así porque puede que uses plugins que definen sus propias tablas y guardan allí las referencias a tus imágenes. Si este es tu caso, deberás adaptar la consulta añadiendo condiciones adicionales para cubrir estos casos.

Nelio Forms
Un plugin de contacto fantástico que usa el editor de bloques. En su simplicidad está la potencia del plugin. Me encanta, es muy versátil y funciona de maravilla para mí.

Wajari Velasquez
Eliminar las imágenes que han quedado huérfanas en WordPress
Ahora que tenemos las imágenes que potencialmente no se están usando en WordPress, deberíamos echarle un ojo a los resultados y ver si realmente todas las imágenes que tenemos listadas se están usando o no. Dependiendo de lo que encontremos, podemos refinar la consulta añadiendo más condiciones tal y como ya dijimos antes. Si todo parece correcto, seguimos adelante.
Para borrar un attachment en WordPress tenemos la función wp_delete_attachment
que puedes encontrar descrita aquí. Si miras la documentación, verás que a esta función le pasas el identificador del attachment y un booleano indicando si quieres forzar el borrado o sólo poner la imagen en la papelera.
Cuando llames a esta función en WordPress, borrará el attachment y toda su información asociada, incluyendo posibles comentarios, aparición en taxonomías, metadatos relacionados y, lo más importante, los archivos de la imagen almacenados en el directorio wp-content
.
Para obtener la lista de instrucciones wp_delete_attachment
que utilizaremos en PHP, sólo tenemos que cambiar la línea 2 de la consulta anterior para que lo que nos devuelva la consulta SELECT
sea la cadena de caracteres construida con la instrucción que queremos. Una por cada fila retornada por la consulta. Puedes verlo a continuación:

Ahora sólo te queda copiar todas estas funciones y pegarlas, por ejemplo, en el archivo functions.php
de tu tema y visitar tu web. Esto hará que estas instrucciones se ejecuten, borrando las imágenes huérfanas de tu WordPress.
Recuerda comprobar que tu web sigue funcionando perfectamente y que no has borrado imágenes de más. Y si lo has hecho, no te preocupes. Si me hiciste caso al principio, tendrás disponible una copia de la base de datos y de los archivos dentro de wp-content
para poder recuperar lo perdido.
Si no te aclaras con SQL y la base de datos, o directamente no has entendido nada de lo que he explicado, primero házmelo saber, tienes los comentarios aquí abajo. Y segundo, prueba usar un plugin como Media Cleaner. El resultado final ha de ser muy parecido a lo que hemos visto en esta entrada.
Deja una respuesta