Renommer un fichier sur WordPress automatiquement durant l’upload

Ce tutoriel va nous permettre de renommer un fichier sur WordPress que nous allons téléverser, afin de les rendre optimisé pour le web, c’est-à-dire : en minuscule, avec les « tirets du 6 » et des chiffres.

Introduction

Bien que WordPress soit un CMS plutôt intéressant et complet sur de nombreux plans, certaines fonctionnalités les plus utilisées ne sont pas forcément optimisées. Lorsque nous téléversons (upload) des médias (images, pdf, doc, etc.) sur une installation WordPress, ce dernier ne propose pas la réécriture des noms des fichiers uploadés et nous nous retrouvons généralement face à un problème quand nous devons récupérer le site et/ou le ré-héberger. Dans ce tutoriel, je vais vous expliquer comment faire pour renommer un fichier sur WordPress, de manière automatique.

Renommer un fichier sur WordPress

Pour réaliser ce renommage de fichier, nous allons passer par l’application d’une fonction sur le filtre « sanitize_file_name » afin de pousser un peu plus le niveau de réécriture du fichier. Cette opération nous permettra, par exemple, de passer d’un fichier qui se nomme F@_pf42çfèdg.JPG en f-pf42cfedg.jpg.

Création de la fonction et du filtre

Nous allons créé une fonction et l’ajouter au filtre « sanitize_file_name » avec une priorité à 10. Notez que nous utilisons la variable $filename comme argument de la fonction.

if ( !function_exists( 'medias_rewrite_filename' ) ) {
  add_filter('sanitize_file_name', 'medias_rewrite_filename', 10);
  function medias_rewrite_filename($filename){
    //votre code ici...
  }
}

Réécrire un nom de fichier

Dans un premier temps, on met en place la variable dans la fonction remove_accents() afin de convertir tous les accents en caractères « simple ». Vous pouvez retrouver la liste des caractères sur le site WordPress.

$clean_filename = remove_accents( $filename );

Ensuite, on efface les espaces, codes espaces et les underscores. On va les remplacer des tirets, tout simplement.

$invalid = array(
    ' '   => '-',
    '%20' => '-',
    '_'   => '-',
);

$clean_filename = str_replace( array_keys( $invalid ), array_values( $invalid ), $clean_filename );

Après cela, nous allons procéder à une réécriture des caractères afin qu’ils soient tous compris entre :

Sur la seconde ligne, on efface tous les caractères spéciaux listés.

Pour terminer, sur la troisième ligne, on efface tous les tirets supérieur à 1. En clair, si vous avez deux tirets (ou plus) à la suite, il le remplacera par un seul et unique tiret.

$clean_filename = preg_replace('/[^A-Za-z0-9-\. ]/', '', $clean_filename); 
$clean_filename = preg_replace('/\.(?=.*\.)/', '', $clean_filename);
$clean_filename = preg_replace('/-+/', '-', $clean_filename);

En avant dernier, on remplace le tiret qui se trouve avant le point de l’extension.

$clean_filename = str_replace('-.', '.', $clean_filename);

Et pour terminer, on transforme tous les caractères en minuscules.

$clean_filename = strtolower( $clean_filename );

Hopopop ! J’allais oublier le petit retour.

return $clean_filename;

Code final

Et voilà ! Nous venons de terminer le code, vous devriez avoir quelque chose comme ça à la fin.

if ( !function_exists( 'medias_rewrite_filename' ) ) {
  add_filter('sanitize_file_name', 'medias_rewrite_filename', 10);
  function medias_rewrite_filename($filename){
    $clean_filename = remove_accents( $filename ); 

    $invalid = array(
        ' '   => '-',
        '%20' => '-',
        '_'   => '-',
    );

    $clean_filename = str_replace( array_keys( $invalid ), array_values( $invalid ), $clean_filename );
    $clean_filename = preg_replace('/[^A-Za-z0-9-\. ]/', '', $clean_filename); 
    $clean_filename = preg_replace('/\.(?=.*\.)/', '', $clean_filename);
    $clean_filename = preg_replace('/-+/', '-', $clean_filename); 
    $clean_filename = str_replace('-.', '.', $clean_filename);
    $clean_filename = strtolower( $clean_filename ); 

    return $clean_filename;
  }
}

Aller plus loin

Ce petit code qui vous rendra service sur vos productions mérite également un emplacement de choix. En effet, vous pouvez très le mettre dans le fichier functions.php de votre thème ou même créer un plugin. Cependant, le meilleur emplacement, pour ce genre de fonctionnalités assez importante, reste d’en faire un mu-plugin.

Cela vous permettra d’avoir cette fonction toujours active et n’aura pas la fragilité d’être supprimé par votre client, que ce soit en thème ou en plugin « classique ».

Conclusion

La fonction que je viens de vous présenter est une façon de faire mais rien ne vous empêche de créer votre propre fonction avec vos ajouts personnels. LA fonction ultime n’existe pas encore malheureusement.

Vous savez maintenant comment faire pour renommer un fichier sur wordpress, de manière à avoir un nom de fichier optimisé pour le web. Cette petite fonction bien utile est loin d’être la seule et je m’en vais tester d’autres fonctions de ce genre afin de vous faciliter la vie.

A propos de l'auteur
Photo de Florian Valois
Florian Valois

Développeur autodidacte depuis plus de 15 ans, je suis devenu développeur front-end chez Rollingbox, agence web à Versailles.

Ce tutoriel vous a plu ? Partagez-le !

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.