« Le lien de confirmation dans l’email de bienvenue affiche du HTML brut, avec les balises visibles » : ce genre de retour arrive dès qu’un développeur ajoute des balises <strong> ou <a href> dans le corps d’un email envoyé via wp_mail(), sans avoir préalablement ajusté le type de contenu de l’email.
Par défaut, wp_mail() envoie ses messages au format text/plain, du texte brut sans aucune interprétation de balise. Toute balise HTML insérée dans le corps du message s’affiche donc telle quelle chez le destinataire, exactement comme elle a été écrite dans le code.
Le filtre wp_mail_content_type
WordPress propose un filtre dédié pour changer ce comportement par défaut : wp_mail_content_type. Il reçoit le type de contenu actuel et doit renvoyer celui qui doit réellement être utilisé pour l’envoi :
add_filter( 'wp_mail_content_type', function () {
return 'text/html';
} );
wp_mail(
'client@example.com',
'Confirmation de votre commande',
'<p>Merci pour votre commande. <strong>Numéro : #4521</strong></p>'
);
Une fois ce filtre actif, le corps du message est interprété comme du HTML par le client de messagerie du destinataire, ce qui permet d’utiliser des balises de mise en forme basique directement dans le contenu transmis à wp_mail().
Un piège classique : le filtre qui reste actif trop longtemps

Le problème survient quand ce filtre reste accroché en permanence, sans jamais être retiré. Tout email envoyé ultérieurement par WordPress — y compris des notifications système générées par le cœur lui-même, comme la réinitialisation de mot de passe — se retrouve alors traité comme du HTML, alors que son contenu original n’était pas préparé pour ce format et peut afficher des caractères mal interprétés ou une mise en forme inattendue.
La bonne pratique consiste à accrocher le filtre juste avant l’envoi concerné, puis à le retirer immédiatement après :
function envoyer_confirmation_html( $destinataire, $sujet, $corps_html ) {
$activer_html = function () {
return 'text/html';
};
add_filter( 'wp_mail_content_type', $activer_html );
wp_mail( $destinataire, $sujet, $corps_html );
remove_filter( 'wp_mail_content_type', $activer_html );
}
Cette précaution garantit que seul l’email visé bénéficie du format HTML, sans effet de bord sur les autres emails générés par le site, qu’ils proviennent du thème, d’une extension, ou du cœur de WordPress lui-même.
Structurer un email HTML un minimum présentable
Un email HTML brut, sans structure minimale, s’affiche souvent de façon inégale selon le client de messagerie du destinataire. Une structure simple, avec des styles intégrés directement dans les balises plutôt que dans une feuille de style externe (peu de clients email interprètent correctement une feuille externe), donne un résultat plus fiable :
$corps = '<div style="font-family: Arial, sans-serif; max-width: 600px;">'
. '<h2 style="color: #1a1a1a;">Merci pour votre commande</h2>'
. '<p>Votre numéro de commande est le <strong>#4521</strong>.</p>'
. '</div>';
Pour un besoin plus poussé, mieux vaut envisager un gabarit HTML dédié, chargé depuis un fichier séparé plutôt que construit en concaténant des chaînes PHP dans la fonction d’envoi elle-même.
Le nom de l’expéditeur, un réglage voisin
Deux autres filtres accompagnent souvent wp_mail_content_type pour personnaliser un envoi HTML : wp_mail_from et wp_mail_from_name, qui permettent d’ajuster respectivement l’adresse et le nom affichés comme expéditeur, plutôt que de laisser WordPress utiliser son adresse générique par défaut, souvent construite à partir du nom de domaine du site :
add_filter( 'wp_mail_from', function () {
return 'commandes@example.com';
} );
add_filter( 'wp_mail_from_name', function () {
return 'Boutique Example';
} );
Ce que ce filtre ne résout pas
Changer le type de contenu ne garantit ni la délivrabilité de l’email, ni son passage à travers les filtres anti-spam des grands fournisseurs de messagerie. Ces aspects dépendent d’une configuration serveur plus large — enregistrements SPF, DKIM, réputation de l’adresse d’envoi — qui reste indépendante du format choisi pour le corps du message.
Sur tout envoi HTML ponctuel, encadrer précisément l’ajout et le retrait du filtre
wp_mail_content_typeévite qu’un email système sans rapport ne se retrouve rendu au mauvais format des semaines plus tard.
En résumé
Le passage au format HTML ne demande qu’un filtre, mais sa portée doit rester strictement limitée à l’envoi concerné. Ce détail, souvent négligé, évite qu’un simple email de bienvenue mis en forme ne perturbe silencieusement d’autres notifications du site, bien après sa mise en place initiale.