# sanitize_hex_color : valider une couleur saisie dans un champ de réglage

> Un champ de couleur libre laisse passer n'importe quelle chaîne. Sans validation, une valeur mal formée finit par casser un style généré dynamiquement.

- Auteur : WordPress Développement
- Publié le : 2022-11-07
- Mis à jour le : 2022-11-07
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/sanitize-hex-color-valider-couleur-champ-reglage/

## L’essentiel

- Accepte uniquement un format hexadécimal valide à trois ou six caractères
- Retourne null pour toute valeur mal formée, jamais une chaîne tronquée
- Existe en variante avec valeur par défaut via sanitize_hex_color_no_hash

Un champ de réglage personnalisé qui accepte une couleur au format texte libre, sans validation, finit tôt ou tard par recevoir une valeur inattendue : un nom de couleur CSS, une chaîne rgba, ou simplement une faute de frappe. Si cette valeur est ensuite injectée directement dans une feuille de style générée dynamiquement, le résultat peut aller d'un style silencieusement ignoré à une chaîne CSS mal formée qui casse l'affichage.

`sanitize_hex_color()` répond à ce besoin précis de validation, en acceptant uniquement une chaîne conforme au format hexadécimal court ou long, précédée d'un dièse.

## Ce que la fonction accepte, et ce qu'elle rejette

```
sanitize_hex_color( '#ff6600' ); // '#ff6600'
sanitize_hex_color( '#f60' );    // '#f60'
sanitize_hex_color( 'ff6600' );  // null (dièse manquant)
sanitize_hex_color( 'orange' );  // null (pas un format hexadécimal)
sanitize_hex_color( '' );        // '' (chaîne vide autorisée telle quelle)
```

Une valeur vide est traitée à part : elle est retournée telle quelle, sans être considérée comme invalide, ce qui permet à un champ de réglage de rester facultatif sans déclencher de rejet sur une valeur simplement non renseignée.

## Utilisation dans un callback de réglage

> L'essentiel à retenir : Accepte uniquement un format hexadécimal valide à trois ou six caractères ; Retourne null pour toute valeur mal formée, jamais une chaîne tronquée ; Existe en variante avec valeur par défaut via sanitize_hex_color_no_hash

```
register_setting( 'mon_groupe_reglages', 'ma_couleur_accent', array(
    'type'              => 'string',
    'sanitize_callback' => 'sanitize_hex_color',
    'default'           => '#2271b1',
) );
```

En le déclarant directement comme `sanitize_callback`, chaque enregistrement du réglage passe automatiquement par cette validation, sans code supplémentaire à écrire dans le formulaire d'administration lui-même.

## La variante sans dièse

Pour un champ où le dièse est ajouté séparément à l'affichage plutôt que saisi par l'utilisateur, `sanitize_hex_color_no_hash()` accepte le même format sans exiger le caractère `#` en préfixe, et retourne la valeur également sans dièse.

| Fonction | Format attendu en entrée | Format en sortie |
| --- | --- | --- |
| `sanitize_hex_color()` | Avec dièse | Avec dièse, ou null |
| `sanitize_hex_color_no_hash()` | Sans dièse | Sans dièse, ou null |

## Ce que cette fonction ne couvre pas

- Les formats rgb(), rgba() ou hsl() ne sont pas reconnus par cette fonction : elle est strictement dédiée au format hexadécimal.
- Elle ne gère aucune conversion entre formats : une valeur rgba() valide sera simplement rejetée, jamais convertie automatiquement.
- Pour les palettes de couleurs déclarées dans `theme.json`, la validation suit un mécanisme différent, propre au schéma de ce fichier, sans passer par cette fonction PHP.

> Un repère pour toute page de réglages personnalisée qui propose un champ de couleur : dès que ce champ n'est pas un composant natif de sélection de couleur, une validation explicite via `sanitize_hex_color()` évite qu'une valeur mal formée ne remonte jusqu'à une feuille de style générée dynamiquement.

## En résumé

Un champ de couleur en apparence anodin mérite la même rigueur de validation que n'importe quel autre champ de réglage. `sanitize_hex_color()` couvre le cas le plus courant — un format hexadécimal — avec un comportement prévisible : une valeur conforme passe, tout le reste devient `null`, sans jamais laisser passer une chaîne à moitié valide.
