Renommer automatiquement les fichiers accentués sous WordPress

Mis à jour le :

Vous recherchez une astuce fonctionnelle pour supprimer les caractères accentués contenus dans vos fichiers et qui empêchent l’affichage correct de vos images par exemple ?

Ne cherchez plus voici le code approuvé et utilisé en interne sur tous nos projets. Ce script PHP est à placer dans le dossier mu-plugins sur vos différentes installations WordPress.

<?php if ( ! defined( 'ABSPATH' ) ) {
die( 'Restricted Area' );
}

/*
* Plugin Name: Sanitize File Name
* Description: Clean file name when uploading files in WordPress.
* Version: 20240103
* Author: Mickaël Gris (Saipafo) & Aurélien Denis (WP channel)
* Author URI: https://wpchannel.com/wordpress/tutoriels-wordpress/renommer-automatiquement-fichiers-accentues-wordpress/
*/

function wpc_sanitize_french_chars( $filename ) {
// Force the file name in UTF-8
$filename = mb_convert_encoding( $filename, "UTF-8" );

// Remove accents using WordPress function
$filename = remove_accents( $filename );

// Additional replacements
$char_not_clean = [ '©' ];
$clean = [ 'copy' ];
$friendly_filename = str_replace( $char_not_clean, $clean, $filename );

// Remove any remaining special characters
$friendly_filename = preg_replace( '/[^\w\s.-]/u', '', $friendly_filename );

// Lowercase
$friendly_filename = strtolower( $friendly_filename );

return $friendly_filename;
}

add_filter( 'sanitize_file_name', 'wpc_sanitize_french_chars' );

Pour tester son fonctionnement, envoyez une image avec un accent dans le nom du fichier. Vérifiez ensuite que l’URL du média a bien été renommée proprement.

À déployer sur toutes vos installations WordPress pour éviter des surprises notamment suite à une migration sur des serveurs qui tolèrent moins facilement les caractères accentués.

Avatar de Mickaël Gris

Protégez votre site WordPress

Vos données sont précieuses,
ne prenez pas le risque de tout perdre.
Confiez-moi votre maintenance !

Ces articles devraient t’intéresser…

18 réponses
  1. Avatar de Isabelle
    Isabelle

    Bonjour,

    j’ai bien pensé à enlever les accents des photos mais j’ai des espaces que je voudrais remplacer par des tirets (je viens seulement d’apprendre que les espaces pouvaient être mal interprétés). Est-ce que si dans le code que vous proposez je rajoute ‘/ /’ à remplacer par ‘/-/’ ça marche?
    Merci d’avance !

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Bonjour Isabelle, si vous utilisez notre mi-plugin les accents et les espaces seront remplacés par des tirets.

  2. Avatar de Xiyitifu
    Xiyitifu

    Ahhh merci beaucoup pour le script c’est parfait pour remplacer le plugin que j’utilisais avant !!

  3. Avatar de Pascal
    Pascal

    Bonjour
    Pour mes propres besoins et inspiré de votre code ainsi que de deux autres sources, j’ai réalisé un petit plugin : https://www.pascal-bourhis.net/cms-wordpress/wordpress-plugin-clean-image-filenames-and-autofill-attachement-fields
    qui évite d’envoyer n’importe quoi comme nom de fichier image mais aussi remplit automatiquement les champs Title, Description et ALT.

    1. Avatar de e.lito
      e.lito

      Bonjour @Pascal,
      Qu’est-il arrivé à votre site ce plugin est le graal pour moi c’est exactement ce que je cherche mais la page est en 404.

      Serait-il possible de le récupérer ailleurs je ne le trouve pas.

      Merci d’avance.

  4. Avatar de viriis
    viriis

    Merci d’avoir répondu c’est parfait

  5. Avatar de viriis
    viriis

    Bonjour merci pour cette information utile,
    par contre peut on directement insérer ce code dans le fichier function.php du theme? merci

    1. Avatar de Mickaël Gris
      Mickaël Gris

      Bonjour,

      Oui vous pouvez intégrer sans problème ce code dans le fichier functions.php de votre thème. Cela fonctionnera sans soucis.
      Je vous recommande néanmoins la création d’un mu-plugin qui est la bonne pratique dans ce genre de cas 😉 .

  6. Avatar de Roberto
    Roberto

    super vous avez résolu mon problème. Un BIG merci !

  7. Avatar de Mickaël Gris
    Mickaël Gris

    Concernant les fichiers déjà uploadés, ily a cette extension : https://wordpress.org/plugins/wp-image-utils/
    Elle permet de renommer les fichiers après avoir été envoyé sur serveur. A tester après backup, certains fichiers seront bien renommés d’autres non…

    1. Avatar de Ben
      Ben

      Merci ! Je viens de tester ce plugin, j’ai backupé avant bien sûr… Et je n’ai pas eu à restaurer, tout marche comme prévu ! (WP v4.6.1)

  8. Avatar de Kalagan
    Kalagan

    Merci pour le tuyau.

    Je dois tester cela pour un de mes clients.
    Par contre, cela ne prend en compte que les nouveaux ficheirs uploadé, pas les anciens…

    1. Avatar de Mickaël Gris
      Mickaël Gris

      Bonjour,

      Effectivement, cela ne concerne que les nouveaux fichiers envoyés.
      N’hésite pas à me faire un petit retour après ton test client !

  9. Avatar de Willy Bahuaud
    Willy Bahuaud

    Hello,

    On peut aussi utiliser la fonction remove_accents() directement en callback, elle fait la même chose, mais est déjà présente dans WordPress. C’est juste un peu plus court 🙂

    add_filter( 'sanitize_file_name', 'remove_accents' );

    1. Avatar de Mickaël Gris
      Mickaël Gris

      Salut Willy !

      Merci pour le partage sur cette fonction 🙂 . En fait, l’intérêt de passer par ce mu-plugin est double :
      1) Le problème de la fonction remove_accents() déjà présent dans WordPress, c’est qu’elle ne supprime pas toujours entièrement les accents. Dans certains cas, les accents ne sont pas supprimés (je peux t’envoyer des fichiers avec le nom accentués qui ne seront pas traité par remove_accents() ). Avec ce mu-plugin, ce problème est corrigé.
      2) Un autre avantage, c’est que ce mu-plugin va entièrement renommer le fichier en supprimant les majuscules. D’un point de vue stockage et accès dans les URL c’est plus propre. D’ailleurs, c’est peut-être aussi intérêt d’un point de vue SEO ? (ça dépasse mes compétences !).

      1. Avatar de _BenM_
        _BenM_

        Bonjour Mickaël,
        Tu dis : « Le problème de la fonction remove_accents() déjà présent dans WordPress, c’est qu’elle ne supprime pas toujours entièrement les accents. »
        Ah ? Dans quels cas précis ? Peut-être le fameux coup e + accent // e accentué ?
        Une liste de remplacement d’accents plus complète est dispo ici http://php.net/manual/fr/function.preg-replace.php#96586
        D’ailleurs, pourquoi utiliser preg_replace en ligne 21, et pas str_replace, puisque il n’y a pas de regex ? aa ne facilite pas la lecture.
        Dernière chose : cette fonction a du mettre un peu de bazar dans les noms de fichiers de ce qui l’ont utilisée puisqu’il y a un décalage dès le Ç, remplacé par a.

        1. Avatar de Mickaël Gris
          Mickaël Gris

          Salut,

          Merci pour l’intérêt porté à ce tutoriel. Mes réponses ci-dessous.

          La fonction native remove_accents(); de WordPress ne traite pas tous les cas comme il faut. Au départ je faisais comme Willy, mais il s’est avéré que dans certains cas, les fichiers restent accentués une fois uploadé ! Certes, ça dépend du serveur hôte et des fichiers envoyés, mais sur le parc de sites Web que je gère ça m’est arrivé plus d’une fois. On trouve d’ailleurs plusieurs cas sur Google où les gens disent avoir le problème…
          Dans mon cas, il m’a fallu trouver une solution car de nombreux clients avaient le problème… Avec ce système, ce soucis est corrigé. Je l’ai même adapté il y a un environ 2 ans pour traiter encore un autre cas…

          Lecture moins facile avec preg_replace ? Je ne sais pas. Au départ j’ai adapté ma fonction maison pour en faire un tutoriel sur WP Channel. A l’époque le preg_replace(); se justifiait davantage c’est vrai, c’était très optimisé SEO… Libre à toi d’adapter ensuite 🙂 .

          Merci pour ton retour de décalage ! Dans le premier array(); il y avait en tout premier caractère un @… le deuxième array(); a été oublié lors de la mise à jour.
          Certains nous ont signalés que le @ pouvait être utilisé à bon escient lors de l’upload… (pour gérer le rétina notamment). Il a donc été retiré de ce tutoriel pour s’adapter. Personnellement, je continue de le remplacer par un « a »…

    2. Avatar de bécane WEB
      bécane WEB

      La fonction prévue dans le Codex ne fait pas aussi bien le job, loin de là. Elle ne fonctionne pas pour les accents existants en dehors de l’anglais et ne transforme pas les majuscules en minuscule. De plus elle laisse des espaces arpès les accents

      //////////

      Par exemple un nom de fichier comme « image-trop d’accent pour testé LA FONCTION à enlever.jpg » va devenir « image-trop-daccent-pour-testé-LA-FONCTION-à-enlever.jpg ».

      Le mu-plugin proposé par WPChannel va donner quelque chose de plus propre : « image-trop-daccent-pour-teste-la-fonction-a-enlever.jpg ».