Renommer automatiquement les fichiers accentués sous WordPress

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: 20160612
* Author: Mickaël Gris (Neticpro)
* Author URI: https://wpchannel.com/renommer-automatiquement-fichiers-accentues-wordpress/
*/


function wpc_sanitize_french_chars($filename) {
	
	/* Force the file name in UTF-8 (encoding Windows / OS X / Linux) */
	$filemane = mb_convert_encoding($filename, "UTF-8");

	$char_not_clean = array('/À/','/Á/','/Â/','/Ã/','/Ä/','/Å/','/Ç/','/È/','/É/','/Ê/','/Ë/','/Ì/','/Í/','/Î/','/Ï/','/Ò/','/Ó/','/Ô/','/Õ/','/Ö/','/Ù/','/Ú/','/Û/','/Ü/','/Ý/','/à/','/á/','/â/','/ã/','/ä/','/å/','/ç/','/è/','/é/','/ê/','/ë/','/ì/','/í/','/î/','/ï/','/ð/','/ò/','/ó/','/ô/','/õ/','/ö/','/ù/','/ú/','/û/','/ü/','/ý/','/ÿ/', '/©/');
	$clean = array('a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','o','o','o','o','o','u','u','u','u','y','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','o','o','o','o','o','o','u','u','u','u','y','y','copy');

	$friendly_filename = preg_replace($char_not_clean, $clean, $filename);


	/* After replacement, we destroy the last residues */
	$friendly_filename = utf8_decode($friendly_filename);
	$friendly_filename = preg_replace('/\?/', '', $friendly_filename);


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

	return $friendly_filename;
}
add_filter('sanitize_file_name', 'wpc_sanitize_french_chars', 10);

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.

11 commentaires

  1. 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. Mickaël Gris auteur de l’article

      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. _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. Mickaël Gris auteur de l’article

          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 »…

    1. Mickaël Gris auteur de l’article

      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 .

Laisser un commentaire