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

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ée | sanitize_key() | sanitize_title() |
|---|---|---|
| Categorie_Été | categorie_t | categorie_ete |
| Guide n° 12 (débutant) | guiden12dbutant | guide-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()ouesc_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.