Déplacer des milliers de fichiers média depuis le /uploads/ de WP vers des sous-dossiers ?
Parfois, quelques anciens utilisateurs de WordPress expérimentent un problème de surcharge de fichiers média / images, dans le répertoire /uploads/ de leur Hébergement WordPress.
Est-ce que vous vous retrouvez dans ce cas de figure… ?
Cela fait plusieurs années que vous êtes l’éditeur d’un site WordPress sur lequel vous publiez régulièrement des articles et des pages contenant un certain nombre de fichiers médias : photos, PDF, vidéos, etc.
Et puis, un beau jour, contre toute attente, votre hébergeur vous contacte en vous annonçant que vous avez plus de 10.000 fichiers dans le seul et unique dossier /uploads/ de votre site WordPress.
À en croire les menaces de votre Hébergeur Web, vous avez maintenant quelques jours pour régler la situation en urgence sous peine de voir votre compte d’hébergement définitivement clôturé…
C’est bien sûr une surprise pour vous ! Vous n’étiez probablement pas conscient que votre répertoire uploads contenait autant de fichiers et que, pour un serveur Web, cela peut avoir des conséquences dramatiques pour le disque dur…
Malheureusement, votre hébergeur ne vous a pas indiqué la cause de ce problème et surtout comment le résoudre.
Comment déplacer de très nombreuses images depuis le dossier /uploads/ de WordPress vers des sous-dossiers (année/mois) ?
Rassurez-vous, il existe bien une solution à votre problème.
Nous allons voir dans ce tutoriel comment, étape par étape, déplacer vos médias dans des sous-dossiers sans que cela ne détériore votre site WordPress.
« Organiser mes téléversements dans des dossiers mensuels et annuels »
Avant de passer aux étapes techniques, penchons-nous sur l’origine de ce problème d’engorgement de votre répertoire /uploads.
Il est tout simplement probable que vous ou votre webmaster ayez décoché une case très importante dans votre tableau de bord WordPress. Elle se trouve dans l’onglet Réglages > Média :

Comme l’indique cette case, elle permet de trier tous les fichiers médias que vous téléversez dans votre site WordPress en sous-dossiers comme ceci : /wp-content/uploads/2021/12
En la décochant l’intégralité des médias que vous avez chargés sur votre site se retrouve dans le dossier principal : /wp-content/uploads
Trop de fichiers dans le répertoire /uploads/ de mon serveur d’hébergement Web, mon hébergeur menace de désactiver mon compte d’hébergement
Chez EasyHoster, notre politique n’est pas de menacer nos clients, ni de les contraindre à se débrouiller seuls ou d’investir du budget auprès d’un technicien afin qu’il tente de vous aider. Nous préférons plutôt prendre le temps de comprendre les problématiques de nos clients afin de leur proposer des solutions pérennes sans surcoût.
Dans ce billet, nous allons bien sûr vous présenter étape par étape ce que vous pouvez faire pour déplacer les milliers de fichiers présents à la racine de votre dossier /uploads. Cependant, sachez que si vous êtes déjà client chez EasyHoster ou si vous souhaitez le devenir, nous pourrons effectuer cette intervention pour vous gratuitement sous certaines conditions.
N’hésitez pas à ouvrir un ticket auprès de notre support pour bénéficier de notre aide.
Première étape : créer des sous-dossiers dans /uploads et déplacer les médias
Pour la création de ce billet, nous nous sommes basés sur le site de l’un de nos clients faisant face à la même problématique que vous. Son dossier /uploads contenait des milliers d’images commençant soit par des chiffres (de 0 à 9) soit pas des lettres (de A à Z). Nous avons donc décidé de classer ces médias dans des dossiers que nous avons nommés :
- folder-0-2
- folder-3-9
- folder-a
- folder-b
- etc.
Bien sûr, le but n’étant pas de créer des sous-dossiers contenant (à nouveau) des milliers de fichiers, si vous vous rendez compte que vous avez énormément de fichiers commençant par un certain chiffre ou une certaine lettre n’hésitez pas à vous créer des sous-dossiers plus adaptés.
Dans notre exemple, le client avait énormément d’images dont le nom commençait par le chiffre 2. Si cela n’avait pas été le cas, nous aurions pu envisager de créer un seul sous-dossier pour les chiffres, comme ceci : folder-0-9.
Pour votre information, sachez que si vous souhaitez avoir un aperçu du nombre de fichiers commençant, par exemple, par la lettre a, vous pouvez utiliser le Terminal de votre compte cPanel :

Exécutez la ligne de commande suivante :
ls -d /home/USER/public_html/wp-content/uploads/[a]*
USER doit être remplacé par votre login cPanel
/public_html/ peut être remplacé par /dev.votredomaine.com/ si vous avez décidé de travailler sur un espace de développement plus sûr.
Cette ligne de commande aura pour effet de vous afficher la liste des fichiers commençant par la lettre a.
Si vous le souhaitez, vous pouvez également utiliser cette ligne de commande pour en connaitre le nombre exact :
ls -d /home/USER/public_html/wp-content/uploads/[a]* | wc -l
Ces lignes de commandes sont sensibles à la casse. Vous pouvez donc également exécuter les exécuter avec un A majuscule.
Création de sous-dossiers avec le Gestionnaire de fichiers cPanel
Pour vous créer très simplement des sous-dossiers dans le dossier principal /uploads de votre site WordPress, vous pouvez utiliser votre Gestionnaire de fichiers :

Ensuite, rendez-vous dans votre dossier uploads et cliquez sur « + Dossier » pour créer votre premier sous-dossier.

Création de sous-dossiers en lignes de commande via le Terminal de cPanel
Si vous ne parvenez pas à vous créer un sous-dossier via votre Gestionnaire de fichiers car, par exemple, celui-ci est surchargé à cause de ces nombreux fichiers rendant toutes actions extrêmement lentes, voire impossibles, vous pouvez également utiliser le Terminal de votre compte cPanel.
Par exemple, pour créer un sous-dossier nommé folder-a, voici la ligne de commande à exécuter :
mkdir /home/USER/public_html/wp-content/uploads/folder-a
Déplacer des images dans les sous-dossiers avec le Gestionnaire de fichiers cPanel
Sélectionnez les images que vous souhaitez déplacer dans votre nouveau sous-dossier et cliquez sur Déplacer.
Dans la fenêtre contextuelle, indiquez le chemin de votre nouveau sous-dossier. Dans notre exemple, puisqu’il s’agissait d’images commençant par la lettre W, nous pourrions indiquer /public_html/wp-content/uploads/folder-w. Finalisez votre action en cliquant sur le bouton Move files.

Déplacer des images dans les sous-dossiers via le Terminal de cPanel
Pour déplacer les fichiers commençant par la lettre a minuscule, vous pouvez utiliser cette ligne de commande :
mv /home/USER/public_html/wp-content/uploads/a* /home/USER/public_html/wp-content/uploads/folder-a
Si vous pensez avoir des fichiers média qui commencent par la lettre A majuscule, pensez à lancer la ligne de commande une seconde fois car cette commande est sensible à la casse. La seconde ligne de commande ressemblerait donc à ceci :
mv /home/USER/public_html/wp-content/uploads/A* /home/USER/public_html/wp-content/uploads/folder-a
Dans notre exemple, le sous-dossier s’appelle folder-a, donc avant de déplacer tous les fichiers commençants par a ou A, nous exécutons la ligne de commande suivant :
ls -d /home/USER/public_html/wp-content/uploads/a*/
Plus d’informations sur cette ligne de commande sur cette page :
https://stackoverflow.com/questions/14352290/listing-only-directories-using-ls-in-bash

Il ne vous reste plus qu’à créer tous les sous-dossiers de votre choix et à déplacer toutes les images dans ceux-ci.
Deuxième étape : modifier les URLs de vos médias dans votre base de données
À cette étape, vos fichiers médias ont été déplacés dans votre espace d’hébergement. Malheureusement, leurs adresses restent inchangées dans votre bibliothèque de médias WordPress.

Pour modifier les chemins d’accès de vos fichiers média au sein de WordPress, vous pouvez utiliser un plugin comme Better Search Replace.
Une fois le plugin installé, dans le champ Rechercher indiquez l’ancien chemin des fichiers (commençant par 0 dans notre exemple). Dans le champ Remplacer par indiquez le nouveau chemin des fichiers.
Sélectionnez toutes vos tables, cochez la case Remplacer les GUID.
Si vous avez peur d’avoir fait une erreur, vous pouvez laisser coché Faire un essai. Sinon, décochez cette case et lancez le rechercher/remplacer.

Dans notre exemple, les fichiers commençant par 0 se trouvent maintenant dans le sous-dossier folder-0-2.
Une fois que vous avez répété cette action pour tous les fichiers qui ont été déplacés, vous pouvez passer à l’étape suivante qui est un peu plus complexe.
Troisième étape : concaténer les données sérialisées des médias dans WordPress
Il va maintenant être nécessaire d’exécuter une requête MySQL sur votre base de données. Les requêtes MySQL se lancent via phpMyAdmin dans votre compte cPanel.

Sélectionnez votre base de données et rentrez dans la table wp-postmeta.

Enfin, rendez-vous dans l’onglet SQL.

Nous allons aborder ici deux requêtes MySQL qui peuvent vous être très utiles séparément.
1. Effectuer une recherche dans votre base de données grâce à la requête MySQL SELECT
Il peut s’avérer utile d’exécuter une requête SELECT au préalable de votre intervention via PhpMyAdmin « pour vérification », c’est-à-dire pou être certain que vous modifiez bien les champs appropriés.
Pour rechercher dans votre base de données toutes les images qui commencent par le chiffre 1 grâce à un REGEX, vous pouvez exécuter cette requête :
SELECT * FROM wp_postmeta WHERE meta_value REGEXP '^[1]' AND meta_key = "_wp_attached_file";

Par précaution, veillez à utiliser meta_key = "_wp_attached_file"
pour limiter la requête aux images, car cette table mélange tous les types d’items (posts, pages, custom types, etc).
Source de la requête REGEXP : https://stackoverflow.com/questions/1951320/find-all-the-name-using-mysql-query-which-start-with-the-letter-a
Pour effectuer une recherche des images commençant, par exemple, par les chiffres 0, 1 ou 2, voici la requête MySQL à exécuter :
SELECT * FROM wp_postmeta WHERE meta_value REGEXP '^[012]' AND meta_key = "_wp_attached_file";
2. Effectuer une modification dans votre base de données avec la requête MySQL UPDATE
Par exemple, cette requête MySQL va nous servir à ajouter le répertoire /folder-0-9/, dans notre exemple, au début du champ du media file de la meta_id 22095
UPDATE wp_postmeta SET meta_value = CONCAT('folder-0-9/', meta_value) WHERE meta_id = 22095;
Source de cette requête : https://stackoverflow.com/questions/3765631/how-can-i-append-a-string-to-an-existing-field-in-mysql
Vous pouvez retrouver la meta_id dans votre base de données à cet endroit :

Notez que sur cette capture il s’agit d’une requête MySQL SELECT permettant d’afficher l’image dont la meta_id est 22095
Maintenant que vous connaissez ces deux requêtes SQL, nous allons pouvoir les fusionner en une seule requête pour ajouter notre répertoire au début de la valeur meta_value (UPDATE query based on SELECT Query) :
UPDATE wp_postmeta SET meta_value = CONCAT('folder-0-9/', meta_value) WHERE meta_value REGEXP '^[0]' AND meta_key = "_wp_attached_file";
Comme nous l’avons vu dans le point « Déplacer des images dans les sous-dossiers via le Terminal de cPanel », il se peut que vous ayez des sous-dossiers commençant par la même lettre ou le même chiffre que les fichiers que vous allez déplacer. Pensez donc à exclure ces répertoires précédemment créés.
Dans notre cas, nous avons par exemple eu la situation suivante :
- Nous avions créé un dossier folder-0-2
- Nous devions y déplacer les fichiers commençant par 2
- Et il y avait deux sous-dossiers 2012 et 2021 ayant été créés avant notre intervention
Nous avons donc procédé à une recherche par mesure de sécurité en effectuant cette requête SQL :
SELECT * FROM wp_postmeta WHERE meta_key = '_wp_attached_file' AND meta_value NOT LIKE '%2021/%' AND meta_value NOT LIKE '%2012/%'
Ensuite, nous avons exécuter la requête permettant d’ajouter folder-0-2/ dans les chemins des fichiers nommés 2XXX sans modifier les répertoires 2012 et 2021 :
UPDATE wp_postmeta SET meta_value = CONCAT('folder-0-2/', meta_value) WHERE meta_value REGEXP '^[2]' AND meta_key = "_wp_attached_file" AND meta_value NOT LIKE '%2021/%' AND meta_value NOT LIKE '%2012/%'
Voici un exemple pour les fichiers commençant par la lettre a sans modifier le répertoire avia_posts_css :
UPDATE wp_postmeta SET meta_value = CONCAT('folder-a/', meta_value) WHERE meta_value REGEXP '^[a]' AND meta_key = "_wp_attached_file" AND meta_value NOT LIKE '%avia_posts_css/%';
Quatrième étape : régénérer les miniatures des médias
À ce stade, tout en ordre au niveau du serveur et de votre base de données. Pourtant, lorsque vous visitez votre site WordPress en frontend (partie publique de votre site) certaines de vos images sont cassées. Alors qu’en backend (dans le tableau de bord de WordPress), elles sont bien visibles.
Rassurez-vous, c’est normal. Grâce à cette 4ème étape, ce problème sera réglé.
Dans la table wp_postmeta de votre base de données, il existe une meta_key « _wp_attachment_metadata » qui stocke encore le précédent /path/ ou chemin (uploads seul) sous forme de données sérialisées impossibles à modifier via une requête MySQL.
Pour des raisons de performances, ces meta_data sont utilisées par la balise « srcset » de la balise pour afficher des déclinaisons de tailles d’image, par exemple pour les mobiles et la version responsive, car il est inutile de servir l’image HD à un smartphone avec un tout petit écran.
Heureusement, pour faire cette modification, il existe un plugin permettant de régénérer cette meta_data du wp_attachment. Il s’agit de Regenerate Thumbnails. Il suffit de l’installer et de lancer un scan de toutes vos images pour reconstuire toutes les données sérialisées originales, sur base de la meta_value de _wp_attached_file fraichement mise à jour via PhpMyAdmin et MySQL.
Autrement dit, grâce à Regenerate Thumbnails, nous allons retrouver notre /folder-X/, également dans les données sérialisées « _wp_attachment_metadata ».
Cinquième étape : corriger définitivement le problème de répertoire /uploads contenant plus de 10.000 fichiers
Vous avez déjà fini de corriger le problème du dossier /uploads dans lequel vous aviez des milliers d’images !
Il reste maintenant à faire en sorte que cela ne se reproduise plus jamais… Oui, vous avez bien compris 😉 N’oubliez pas de cocher la case à l’origine de cette situation qui vous a causé tant de tort :

Une solution plus rapide pour classer vos fichiers en sous-dossier dans le répertoire /uploads ?
Si ce tutoriel vous semble beaucoup trop compliqué pour corriger le problème de votre site WordPress, n’hésitez pas à contacter le support technique d’EasyHoster. Nos techniciens disposent d’une grande expertise en WordPress et ont déjà pu régler ce type de situation qui peut sembler inextricable.
Chez EasyHoster, nous avons la volonté d’être un véritable point de contact sur le Web pour nos clients en effectuant gratuitement ces interventions très techniques pour eux afin de soulager leur emploi du temps.
Votre confort est notre priorité ! En n’ayant plus à devoir passer des journées entières sur des problèmes épineux, vous serez en mesure de vous concentrer sur votre coeur de métier. Notre objectif est que vous puissiez réussir sur Internet en ayant un partenaire de qualité et sur qui vous pouvez compter.