Contact Form 7 (CF7) fait partie des plugins de formulaire de contact les plus populaires pour WordPress. Il offre une multitude de fonctions, dont ce que l'on appelle des Tags de courrier spécifiques au courrier comme [_post_id], [_post_title] ou [_post_author_email].
Ces balises spéciales permettent d'obtenir facilement des informations sur le post dans lequel un formulaire est intégré. Mais que se passe-t-il lorsqu'un formulaire est intégré en dehors du contenu du message (par exemple dans une barre latérale ou un widget) ? C'est précisément là que se pose un problème.
![Ohne Anpassungen würden Tags wie [_post_author_email] oder [_post_title] im Contact Form 7 Formular leer bleiben.](/wp-content/uploads/2025/06/msedge_2hXzheRjQb.png)
Pourquoi nous avions besoin de notre formulaire sidebar et l'avons optimisé
Lorsque nous avons introduit le formulaire de la barre latérale chez Konfuzio, nous voulions offrir aux lecteurs une possibilité plus simple et plus ciblée d'entrer en contact avec les auteurs de nos articles. Il était particulièrement important pour nous de rendre le processus efficace et sûr, tant pour les lecteurs que pour les auteurs. De là est née une tâche passionnante : comment intégrer de manière dynamique l'adresse électronique de l'auteur dans le formulaire sans la révéler publiquement dans le frontend ?
Pourquoi le formulaire est-il si important pour nous ?
- Contact direct avec l'auteur/interface de contact pour les lecteurs
Les lecteurs ont souvent des questions spécifiques ou souhaitent approfondir le sujet traité dans l'article. Notre objectif était d'établir un pont direct avec les auteures du contenu par ce biais - non pas via un système de feedback anonyme, mais via un outil de communication ciblé et contextuel. Parallèlement, nous avons pu éviter que l'adresse e-mail de l'auteur n'apparaisse directement de manière visible dans le frontend, afin d'éviter les spams ou les abus. - Un feedback ciblé pour une amélioration continue de la qualité
Un bon feedback est essentiel pour créer et développer des contenus de qualité. Avec ce formulaire, nous donnons aux lecteurs la possibilité non seulement de poser des questions directes, mais aussi de donner leur avis sur nos contenus. Quels sont les sujets qui les préoccupent ? Où y a-t-il éventuellement des lacunes d'information ? Ce feedback est directement transmis à nos équipes de rédaction et d'écriture et permet d'améliorer les contenus à long terme. - Déclencheurs pour l'édition et la mise à jour régulières des posts
Un autre effet positif du formulaire est qu'il rappelle à nos auteurs de vérifier régulièrement leurs posts et d'ajouter en continu des informations actualisées. Un lecteur qui demande ou commente un post est un signe que le contenu reste pertinent pour notre groupe cible. Cela nous a suffisamment motivés pour travailler sur une solution robuste qui permettrait d'utiliser cette fonction sans restriction dans la sidebar. - Éloge et récompense pour les auteurs engagés et les contenus de qualité
Les contenus qui activent les lectrices et incitent à un échange direct avec les auteurs sont pour nous le signe que nous ne développons pas seulement des thèmes, mais que nous établissons des relations avec notre communauté. Donner à l'auteur(e) d'un post la possibilité d'être en contact avec des lecteurs motivés est une sorte de récompense pour les efforts fournis dans le contenu - une incitation à créer d'autres contenus de qualité.
Le défi technique
L'un de nos principaux obstacles était que Contact Form 7 n'avait pas, par défaut, de [_post_*]-lorsque les formulaires sont intégrés en dehors du contenu d'un message, comme dans notre cas, dans la barre latérale. Sans adaptation, des balises telles que [_post_author_email] ou [_post_title] restent vides.
Une solution sur mesure nous a permis de contourner ce problème. Grâce à l'intégration dynamique du Post-ID en tant que champ caché, nous avons pu remplir les balises côté serveur et récupérer toutes les informations contextuelles en toute sécurité. Grâce à cette solution, notre formulaire fonctionne désormais de manière fiable, même dans la sidebar, et nos lecteurs et auteurs bénéficient de la même manière d'un processus de feedback sans faille.
Fonctionnement des balises mail spécifiques au courrier
Lesdits [_post_*]-Les balises CF7 permettent d'intégrer automatiquement les données du post dans l'e-mail envoyé lors de l'envoi du formulaire.
Il s'agit notamment
[_post_id]: renvoie l'ID du post actuel.[_post_name]: Le slug (nom) du post.[_post_title]Le titre de chaque message.[_post_url]: l'URL du post.[_post_author]: le nom de l'auteur du post.[_post_author_email]: L'adresse e-mail de l'auteur du post.
En théorie, ces balises sont un outil astucieux pour intégrer des contenus dynamiques en fonction des posts, sans avoir à créer manuellement à chaque fois un formulaire spécifique pour chaque post.
problème :
Ce [_post_*]-fonctionnent cependant seulementsi le formulaire fait partie du Contenu du courrier c'est-à-dire qu'il est intégré dans le domaine de contenu. En revanche, si le formulaire est placé dans le Barre latéraledans un widget ou un fichier de thème (par exemple single.php), ces balises spéciales vide. Cela est dû au fait que CF7 ne reconnaît pas automatiquement le contexte du post en dehors du contenu proprement dit.
Pourquoi ces problèmes surviennent-ils ?
Contact Form 7 dépend du fait que le formulaire soit rendu dans un environnement dans lequel la requête principale (Main Query) de WordPress définit correctement le post actuel. Cependant, si un formulaire est intégré dans une sidebar ou un widget, il n'y a pas de lien direct avec la Main Query. Dans ce cas, CF7 ne sait pas quel post est actuellement représenté et remplit la [_post_*]-Les balises de sécurité ne sont donc pas suffisantes.
Exemple : un formulaire dans la sidebar
Supposons que vous ayez publié un blog post avec l'identifiant 123 et un formulaire CF7 dans la sidebar. Le formulaire devrait en fait s'intituler My Blog Post et l'adresse e-mail de l'auteur du post. Toutefois, comme le formulaire est rendu en dehors du post, les balises telles que [_post_title] et [_post_author_email] vide.
Solution : reconnaissance dynamique du contexte du courrier
Pour résoudre ce problème, nous pouvons utiliser le Ajouter un contexte de courrier manuellement et côté serveurLes balises nécessaires fonctionnent dans tous les environnements, y compris dans la sidebar ou les widgets. Nous présentons ici une solution en deux étapes simples :
Étape 1 : ajouter le Post-ID comme champ caché
Tout d'abord, nous nous assurons que l'actuel ID postal est ajouté à chaque formulaire, indépendamment de l'endroit où il est intégré. Pour cela, nous utilisons le hook wpcf7_form_hidden_fieldspour afficher un champ caché contenant l'identifiant postal (post_id) dans le formulaire :
/**
* Add the current post ID as a hidden field in CF7 forms.
*/
add_filter('wpcf7_form_hidden_fields', function ($hidden_fields) {
if (is_singular()) {
global $post;
$post_id = get_queried_object_id() ?: ($post->ID ?? null);
if ($post_id) {
$hidden_fields['post_id'] = absint($post_id); // Ensure the post ID is valid and sanitized.
}
}
return $hidden_fields; // Return the modified hidden fields.
});Explication :
is_singular(): Vérifie si le post actuel est une page unique, un post unique ou un type de post personnalisé.- Le Post-ID est utilisé comme
post_iddans le champ$_POSTdu formulaire et est donc disponible lors du traitement du formulaire.
Étape 2 : Traitement dynamique des _post_*-tags
Maintenant, nous allons mettre en œuvre un hook [_post_*]-lors du traitement du formulaire. Cette approche permet de vérifier s'il existe un identifiant postal et de récupérer dynamiquement les données correspondantes.
/**
* Dynamically populate all _post_* tags using the post ID passed as a hidden field.
*/
add_filter('wpcf7_special_mail_tags', function ($output, $tag_name) {
// Process only _post_* tags.
if (preg_match('/^_post_(id|name|title|url|author|author_email)$/', $tag_name, $matches)) {
// Retrieve the post_id from the hidden fields in the form submission (sent through POST).
$post_id = isset($_POST['post_id']) ? absint($_POST['post_id']) : null;
// If a valid post ID is available, resolve the tag dynamically.
if ($post_id) {
switch ($tag_name) {
case '_post_id':
return $post_id;
case '_post_name':
return get_post_field('post_name', $post_id); // Retrieve the post slug.
case '_post_title':
return get_the_title($post_id);
case '_post_url':
return get_permalink($post_id);
case '_post_author':
$author_id = get_post_field('post_author', $post_id);
return get_the_author_meta('display_name', $author_id);
case '_post_author_email':
$author_id = get_post_field('post_author', $post_id);
$author_email = get_the_author_meta('user_email', $author_id);
return !empty($author_email) ? esc_html($author_email) : 'fallback@example.com';
default:
return $output;
}
}
// Return an empty value if the post ID is not available.
return '';
}
// Default output for tags not matching _post_*.
return $output;
}, 10, 2);Explication :
- Grâce à l'intégration dans
wpcf7_special_mail_tagsnous pouvons traiter chaque jour individuellement. - Les données (
_post_id,_post_author_emailetc.) sont côté serveur récupérées sur la base de l'identifiant postal.
Exemple d'application
- Dans la sidebar :
Liez le formulaire avecdans la sidebar :Erreur : Formulaire de contact non trouvé !
<aside>
<?php echo do_shortcode('[contact-form-7 id="123"]'); ?>
</aside>- Paramètres de messagerie CF7 :
Utilisez les_post_*-balises dans la configuration du courrier :
Post ID: [_post_id]
Post Name: [_post_name]
Post Title: [_post_title]
Post URL: [_post_url]
Post Author: [_post_author]
Post Author Email: [_post_author_email]résultat :
Bien que le formulaire soit intégré dans la sidebar, les valeurs sont correctement complétées.
Conclusion
L'utilisation de balises mail spécifiques au courrier dans Contact Form 7 en dehors du contenu du courrier est problématique par défaut. Grâce aux adaptations décrites, nous pouvons garantir que toutes les données de courrier pertinentes sont également disponibles de manière fiable dans la sidebar ou les widgets. Cette solution est respectueuse de la protection des données, sûre et dynamique - et laisse la _post_*-Les balises de sécurité peuvent à nouveau fonctionner comme d'habitude.
