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

Tips

sanitize_key et sanitize_title : la nuance qui évite un identifiant mal formé

Deux fonctions de nettoyage produisent parfois un résultat identique sur un texte simple, mais divergent nettement dès qu'accents ou espaces s'en mêlent.

Par Clément Hadrot • 2 septembre 2026 • 4 min de lecture • Aucun commentaire
sanitize_key et sanitize_title : la nuance qui évite un identifiant mal formé

sanitize_key( 'Categorie_Été' ) et sanitize_title( 'Categorie_Été' ) ne produisent pas le même résultat, et confondre les deux fonctions est une source d’erreurs discrète mais réelle dans la génération d’une clé d’option ou d’un slug d’article. La première vise une clé technique, la seconde un identifiant lisible destiné à apparaître dans une URL.

Comparer leur comportement précis permet de choisir la bonne fonction selon l’usage réellement prévu, plutôt que par habitude.

Ce que fait sanitize_key

sanitize_key( string $key ) met la chaîne en minuscules et supprime tout caractère qui ne fait pas partie du jeu [a-z0-9_-]. Aucune translittération n’est appliquée : un accent, un caractère non latin ou tout symbole hors de ce jeu restreint est simplement retiré, sans être remplacé par un équivalent proche. Cette fonction est pensée pour des identifiants purement techniques, jamais destinés à l’affichage : le nom d’une clé d’option, le nom d’un groupe de transients, un nom de meta-clé personnalisée.

Ce que fait sanitize_title

L'essentiel à retenir : sanitize_key restreint à un jeu de caractères très limité ; sanitize_title translittère les accents pour produire un slug lisible ; Les deux ciblent des usages différents, pas interchangeables

sanitize_title( string $title, string $fallback_title = '', string $context = 'save' ) vise un objectif différent : produire un slug lisible et compatible avec une URL, à partir d’un titre destiné à un humain. Elle translittère les caractères accentués vers leur équivalent non accentué le plus proche, remplace les espaces par des tirets, et garde un résultat qui reste reconnaissable par rapport au titre d’origine — c’est cette fonction, par exemple, qui transforme le titre d’un article en son slug par défaut.

Comparatif direct sur un même texte

Entréesanitize_key()sanitize_title()
Categorie_Étécategorie_tcategorie_ete
Guide n° 12 (débutant)guiden12dbutantguide-n-12-debutant

Le premier exemple illustre bien la différence de traitement des accents : sanitize_key() retire simplement le « é » sans le remplacer, produisant un résultat difficile à relire, alors que sanitize_title() le convertit en « e », gardant un mot reconnaissable.

Un exemple d’usage correct pour chacune

// Clé technique d'option, jamais affichée à l'utilisateur
$cle_option = sanitize_key( 'Réglage Notification Email' );
update_option( $cle_option, $valeur );

// Slug lisible pour une page de destination générée dynamiquement
$slug_page = sanitize_title( 'Offre spéciale rentrée 2026' );

Utiliser sanitize_title() pour une clé d’option fonctionnerait techniquement, mais produirait des tirets là où une convention de nommage à base d’underscores serait plus cohérente avec le reste des clés déjà présentes dans la base de données. À l’inverse, utiliser sanitize_key() pour générer un slug d’article visible dans une URL abîmerait chaque mot accentué, au lieu de le convertir proprement.

Points de vigilance supplémentaires

  • sanitize_title() accepte un troisième paramètre $context, qui influence légèrement son comportement selon qu’il s’agit d’un enregistrement ou d’un affichage de recherche par exemple.
  • Aucune des deux fonctions ne garantit l’unicité du résultat : pour un slug d’article, c’est wp_unique_post_slug() qui gère la déduplication en ajoutant un suffixe numérique si nécessaire.
  • Ni l’une ni l’autre ne doit être confondue avec un échappement de sortie : ces fonctions nettoient une donnée avant stockage ou usage interne, elles ne remplacent pas esc_html() ou esc_attr() au moment de l’affichage.

Poser d’abord la question de l’usage final avant de choisir : un identifiant que personne ne verra jamais appelle sanitize_key(), un texte destiné à apparaître dans une URL lisible appelle sanitize_title().

En résumé

La confusion entre sanitize_key() et sanitize_title() vient souvent du fait que les deux acceptent une chaîne libre et en retournent une version nettoyée, en minuscules. Leur divergence apparaît dès qu’un accent ou un caractère non latin entre en jeu : l’une le supprime sans ménagement, l’autre le convertit intelligemment. Choisir en fonction de la destination finale de la valeur — clé technique invisible ou slug destiné à l’affichage — évite un résultat inattendu découvert trop tard, une fois des données déjà enregistrées avec la mauvaise fonction.

Partager :

À propos de l'auteur

Clément Hadrot

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

Voir tous ses articles

Dans la même veine

À lire aussi