Le WordPress d'aujourd'hui, décodé pour les développeurs

Astuces

wp_normalize_path : comparer des chemins de fichiers sans piège Windows ou Unix

Deux chemins visuellement identiques peuvent échouer à une comparaison stricte si l'un vient d'un hébergement Windows. Une fonction native uniformise les séparateurs avant toute comparaison.

Par WordPress Développement • 5 juillet 2021 • 3 min de lecture • Aucun commentaire
wp_normalize_path : comparer des chemins de fichiers sans piège Windows ou Unix

« Pourquoi ce chemin ne correspond-il jamais, alors qu’il semble identique à l’œil nu ? » Cette question revient régulièrement dès qu’un code compare des chemins de fichiers récupérés de sources différentes : une constante WordPress, une valeur retournée par une bibliothèque tierce, un chemin saisi manuellement dans un réglage. Sur un hébergement Windows, ces chemins peuvent mélanger antislashs et slashs, rendant toute comparaison stricte imprévisible.

wp_normalize_path() existe précisément pour ce cas : elle uniformise un chemin donné en remplaçant systématiquement les antislashs par des slashs, quel que soit le système d’exploitation sous-jacent.

Ce que fait la fonction, précisément

Trois transformations successives : remplacement de tous les antislashs par des slashs, suppression des séparateurs doublés consécutifs à l’exception du préfixe réseau Windows éventuel, et suppression d’un slash final superflu s’il y en a un.

L'essentiel à retenir : Uniformise les antislashs Windows en slashs avant toute comparaison ; Supprime les doubles séparateurs et la barre finale superflue ; Indispensable avant tout strpos ou égalité stricte sur un chemin
echo wp_normalize_path( 'C:\wamp64\www\mon-site\wp-content' );
// C:/wamp64/www/mon-site/wp-content

echo wp_normalize_path( '/var/www//mon-site/wp-content/' );
// /var/www/mon-site/wp-content

Le résultat est un chemin exploitable de façon identique quel que soit le système d’origine, un prérequis avant toute comparaison de type === ou strpos().

Un cas d’usage typique : vérifier qu’un fichier est bien dans wp-content

function fichier_dans_wp_content( $chemin ) {
    $chemin = wp_normalize_path( $chemin );
    $racine = wp_normalize_path( WP_CONTENT_DIR );

    return 0 === strpos( $chemin, $racine );
}

Sans la normalisation préalable des deux côtés de la comparaison, ce test échouerait silencieusement sur un hébergement où WP_CONTENT_DIR contient des antislashs alors que le chemin fourni en contient des slashs, ou inversement.

Où WordPress l’utilise déjà en interne

  • La classe WP_Filesystem_Direct normalise systématiquement les chemins avant toute opération de lecture ou d’écriture.
  • Les fonctions de gestion des médias comparent des chemins de fichiers normalisés pour éviter les doublons lors d’un import.
  • La documentation officielle sur developer.wordpress.org recommande explicitement cette fonction avant toute manipulation de chemin destinée à être comparée ou stockée.

Ne pas confondre avec l’échappement de chemin

wp_normalize_path() ne vérifie ni l’existence du fichier, ni la sécurité du chemin fourni : elle se contente d’uniformiser sa forme. Un chemin contenant une tentative de remontée de répertoire via ../ reste tel quel après normalisation, et doit être validé séparément si son origine n’est pas fiable.

Un repère simple à adopter en revue de code : dès qu’un chemin de fichier provient d’une source externe à la configuration du site — une valeur d’option, un import, une bibliothèque tierce — une normalisation systématique avant comparaison évite une classe entière de bugs difficiles à reproduire en local.

En résumé

Comparer des chemins de fichiers sans les normaliser au préalable fonctionne généralement en local, sur un poste de développement Unix, et échoue parfois silencieusement sur un hébergement mutualisé Windows plus rare mais toujours présent chez certains prestataires. wp_normalize_path() élimine ce risque à un coût quasi nul, une ligne à ajouter avant chaque comparaison de chemin sensible.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi