Cambiar estructura de archivos subidos en WordPress quitando mes y año

Categorías: WordPress

Hoy vamos a ver una forma de cambiar la estructura con la cual WordPress sube los archivos: Quitamos el año y el mes para que las imágenes sean atemporales y no haya siempre una referencia a cuando se subieron. O sea, pasamos de /uploads/2018/04/ a /uploads/.

Dentro de WordPress en AJUSTES / MEDIOS hay una opción llamada «Subida de archivos: Organizar mis archivos subidos en carpetas basadas en mes y año». Si la marcamos, todo el archivo que se suba irá a una carpeta dentro de uploads que tendrá primero el año y luego el mes. Por ejemplo: /uploads/2018/04.

Mientras esté marcada esta opción todos los archivos que se suban se meterán en una carpeta con el año y luego el mes.

Si desactivamos la opción: En principio no pasa nada, aunque todas las imágenes/archivos que subamos a partir de ese momento no estarán dentro de una estructura de carpetas basada en mes y año, sino directamente en /uploads/.

¿Qué hacemos con las imágenes que habíamos subido previamente?

Cómo WordPress no cambia la ruta a una imagen o archivo porque lo guarda en la página, entrada o en el custom post type, tendremos que reemplazar datos en la base de datos.

La forma más sencilla es hacerlo a mano, que no llevará algo de tiempo, pero funciona y no es complicado.

Instalamos y activamos el plugin BETTER SEARCH AND REPLACE.

Y luego nos conectamos por FTP al servidor y miramos el contenido de /wp-content/uploads/. Vemos cuantos años hay y qué meses contiene cada año. El reemplazo solo habrá que hacerlo para los años y meses que contengan archivos. Los demás nos dan igual.

Descargamos todas las carpetas de años y meses con las imágenes al ordenador. Volvemos a subir todas las imágenes sin la estructura de carpeta directamente en /uploads/.

Nos vamos a Better Search and Replace y sustituimos en toda la web (o sea, en better search and replace seleccionamos todas las tablas) siempre la carpeta /uploads/ + año + / + mes + /

Por ejemplo para sustituir febrero de 2017, sustituimos:  /uploads/2017/12/ por  /uploads/

Y luego nos falta sustituir en la tabla postmeta lo mismo: año + / + mes + / por nada. O sea, dejamos en blanco el campo por el que sustituimos el año y el mes.

Por ejemplo para sustituir febrero de 2017, sustituimos: 2017/12/ por nada.

Este trabajo doble lo tenemos que hacer porque WordPress guarda los metadatos de los archivos subidos sin la carpeta /uploads/ y sin el / inicial dentro del campo meta_value.

Ahora solo nos faltará eliminar la estructura antigua de archivos subidos, eliminando por FTP los años. Como previamente nos habíamos bajado todos los archivos y los habíamos vuelto a subir a /uploads/ sin la estructura de carpetas, no se ha perdido nada y todo funciona correctamente.

Si por alguna de aquellas la habéis liado y en vez de sustituir 2017/12/ por nada, lo habéis sustituido por / podéis utilizar el siguiente comando en MYSQL para quitar la barra inicial. Si no la quitáis, toda referencia a cualquier archivo de la web será así /uploads// con una doble barra detrás de uploads. Los navegadores modernos lo suelen obviar, pero siempre es mejor tenerlo todo correcto:

UPDATE `wp_postmeta` SET `meta_value` = SUBSTR(`meta_value`, 2) WHERE `meta_key` = '_wp_attached_file' AND `meta_value` LIKE '/%'

OJO: Si tenéis una estructura de tablas distinta, tenéis que sustituir wp_postmeta por el nombre que tenga la tabla en vuestro caso.

 

OJO: Esto se puede hacer de forma más automatizada a través de MYSQL y expresiones regulares, pero la forma más sencilla es esta. Sobre todo para webs que se acaban de montar y solo tienen 2 ó 3 meses de archivos subidos.

Para hacerlo con expresiones regulares, lo más sencillo es:

1) Exportar la tabla WP_POSTMETA (si habéis cambiado el prefijo de WordPress, cambiará «wp_» por lo que hayáis configurado). Y reemplazar (por ejemplo con Notepad++ y la opción de REGEX). Reemplazar:

(\d\d\d\d\/\d\d\/)

por nada. O sea, que busque eso y lo elimine.

2) Exportar todas las tablas de WordPress (lo más sencillo es incluir también WP_POSTMETA). Reemplazar (por ejemplo con Notepad++ y la opción de REGEX):

/uploads/(\d\d\d\d\/\d\d\/)

con:

/uploads/

 

¡Saludos!

Salir de la versión móvil