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

Astuces

sanitize_email avant is_email : deux fonctions qu’on confond trop souvent

Nettoyer une adresse email et valider qu'elle est correctement formée sont deux opérations distinctes, que WordPress sépare volontairement en deux fonctions.

Par WordPress Développement • 12 mars 2024 • 4 min de lecture • Aucun commentaire
sanitize_email avant is_email : deux fonctions qu'on confond trop souvent
FonctionRôleRésultat renvoyé
sanitize_email()Retirer les caractères non autorisés dans une adresse emailUne chaîne nettoyée, potentiellement toujours invalide
is_email()Vérifier que la chaîne respecte le format d’une adresse valideL’adresse elle-même si valide, sinon false

Un formulaire d’inscription accepte une valeur du type contact@@example..com sans broncher, simplement parce que le développeur a appliqué sanitize_email() sur la saisie et s’est arrêté là, en pensant que cette étape suffisait à garantir une adresse exploitable.

Ce n’est pourtant pas le rôle de sanitize_email(). Comme la plupart des fonctions de la famille sanitize_* dans WordPress, elle se contente de retirer les caractères qui n’ont structurellement rien à faire dans le type de donnée visé, sans se prononcer sur la validité globale de la chaîne obtenue.

Ce que sanitize_email() retire réellement

sanitize_email() parcourt la chaîne fournie et ne conserve que les caractères autorisés dans une adresse email selon la spécification (lettres, chiffres, et un ensemble précis de caractères spéciaux comme le point, le tiret, l’arobase, le trait de soulignement). Elle retire donc les espaces, les balises HTML éventuellement présentes, et tout caractère qui ne pourrait de toute façon pas apparaître dans une adresse email légitime :

echo sanitize_email( 'contact @ example.com' );
// contact@example.com (espaces retirés)

echo sanitize_email( 'contact@@example..com' );
// contact@@example..com (rien à retirer : tous les caractères sont "autorisés")

Le second exemple illustre précisément la limite de la fonction : une double arobase et un double point restent des caractères valides pris individuellement, alors que leur combinaison ne forme jamais une adresse email correcte. sanitize_email() n’a aucun moyen de le détecter, ce n’est simplement pas sa mission.

is_email() pour valider le format

L'essentiel à retenir : sanitize_email() retire les caractères invalides d'une chaîne ; is_email() vérifie que le résultat respecte le format d'une adresse valide ; Les deux fonctions se complètent, l'une ne remplace jamais l'autre

is_email() prend le relais exactement là où sanitize_email() s’arrête. Elle vérifie la structure complète de l’adresse — présence d’une seule arobase, partie locale et domaine non vides, domaine contenant au moins un point suivi d’une extension plausible — et renvoie l’adresse elle-même si elle est valide, ou false dans le cas contraire :

function traiter_inscription_newsletter( $email_saisi ) {
    $email = sanitize_email( $email_saisi );

    if ( ! is_email( $email ) ) {
        return new WP_Error(
            'email_invalide',
            "L'adresse email saisie n'est pas valide."
        );
    }

    return $email;
}

Cet enchaînement — nettoyer, puis valider — reste la seule combinaison fiable. Sanitizer seul laisse passer des adresses mal formées ; valider seul, sans sanitizer avant, expose is_email() à des espaces ou des caractères parasites qui peuvent fausser son verdict selon leur position dans la chaîne.

Un filtre disponible sur is_email()

is_email() déclenche le filtre is_email, qui reçoit le résultat de la validation ainsi que l’adresse d’origine et le contexte de vérification. Ce filtre permet, dans de rares cas, d’ajuster la logique de validation à des besoins spécifiques d’un projet, par exemple pour refuser explicitement certains domaines connus pour générer des adresses jetables :

add_filter( 'is_email', function ( $adresse_validee, $adresse_originale ) {
    if ( $adresse_validee && str_ends_with( $adresse_validee, '@domaine-interdit.example' ) ) {
        return false;
    }

    return $adresse_validee;
}, 10, 2 );

Ce que ni l’une ni l’autre ne garantissent

  • Aucune des deux fonctions ne vérifie que l’adresse existe réellement ou qu’elle appartient bien à la personne qui l’a saisie.
  • Aucune ne détecte les adresses jetables ou temporaires, un besoin qui nécessite une liste de domaines à comparer séparément.
  • La seule façon de confirmer qu’une adresse est réellement exploitable reste l’envoi d’un email de confirmation avec un lien à activer.

Sur un formulaire d’inscription, cette confirmation par email reste donc une étape complémentaire indispensable, que la validation du format ne remplace jamais entièrement.

Sur tout champ email d’un formulaire, enchaîner systématiquement sanitize_email() puis is_email() avant d’enregistrer quoi que ce soit évite bien des adresses invalides qui polluent silencieusement une base de contacts.

En résumé

Nettoyer n’est pas valider, et les deux fonctions répondent chacune à une question différente : sanitize_email() retire ce qui ne peut structurellement pas appartenir à une adresse email, is_email() confirme que ce qui reste forme bien une adresse cohérente. Les utiliser dans cet ordre, systématiquement, évite la plupart des mauvaises surprises.

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