Commentaires : être notifié·e d’une réponse par mail


Commentaires

·

6–9 minutes

Juste remarque de Matoo Watoo : savoir qu’une réponse à un commentaire avait été déposée sur le site était impossible à moins d’y revenir expressément. Un bout de code permet dorénavant d’être notifié par mail. Partage ici de la stratégie.

Plugin ou bout de code ?

Messagedematoo

Petit rappel, le site est sous WordPress. Il existe en effet un plugin dédié qui permet de répondre à la problématique. « Comment Reply Email Notification » fait le boulot. Enfin bizarrement pas sur ce site. Peut-être à cause du thème FSE et de conditions posées pour améliorer la lisibilité des commentaires, je l’ai testé sans succès.

Testez le plugin à l’occasion !

Mais de toutes façons à chaque fois que je peux éviter un plugin, je cherche si du code ferait l’affaire en lieu et place.

Les règles du jeu

  • que ce soit léger
  • que ça n’ajoute pas de cookie
  • que le RGPD puisse être respecté

J’ai passé commande à l’automatisation probabiliste via deux simulateurs de conversation

Je n’ai pas trouvé la réponse à ma question dans un forum ou sur le net et je ne suis pas assez doué pour faire ça tout seul. En revanche, demander deux productions d’IA permet de les comparer entre elles et si besoin de les inciter à se corriger mutuellement.

J’ai obtenu ce code. Il semble ne pas trop alourdir.

Pour le mettre en place puisque c’est du PHP j’utilise WP Code. L’avantage c’est que la mise à jour de WordPress ne viendra pas le faire sauter. Si jamais un « bout de code » ou snippet faisait souci, ça reste facile à désactiver.

/**
 * Notification de réponse aux commentaires — sans plugin, sans cookie
 * Version consolidée (compatible thème FSE + envoi corrigé + apostrophes typographiques)
 */

// 1. Cases à cocher, juste avant le bouton d'envoi (compatible thème FSE)
add_filter('comment_form_submit_field', 'ajouter_checkbox_subscription_comment');
function ajouter_checkbox_subscription_comment($submit_field) {

    $html  = '<p class="comment-form-subscribe">';
    $html .= '<input id="cren_subscribe_to_comment" name="cren_subscribe_to_comment" type="checkbox" value="on" />';
    $html .= '<label for="cren_subscribe_to_comment">Me notifier par email des réponses à mon commentaire</label>';
    $html .= '</p>';

    $html .= '<p class="comment-form-gdpr">';
    $html .= '<input id="cren_gdpr" name="cren_gdpr" type="checkbox" value="yes" required />';
    $html .= '<label for="cren_gdpr">J’accepte que mon email soit utilisé pour m’envoyer les notifications de réponses (<a href="/mentions-legales/" target="_blank">Politique de confidentialité</a>)</label>';
    $html .= '</p>';

    return $html . $submit_field;
}

// 2. Enregistrer l'abonnement quand le commentaire est posté
add_action('comment_post', 'enregistrer_abonnement_comment');
function enregistrer_abonnement_comment($comment_id) {
    if (isset($_POST['cren_subscribe_to_comment']) && $_POST['cren_subscribe_to_comment'] === 'on') {
        add_comment_meta($comment_id, 'cren_subscribe_to_comment', 'on');
    } else {
        add_comment_meta($comment_id, 'cren_subscribe_to_comment', 'off');
    }
}

// 3. Envoyer la notification quand le commentaire passe "approuvé"
//    (se redéclenche à chaque changement de statut, y compris une approbation manuelle a posteriori)
add_action('transition_comment_status', 'envoyer_notification_reponse', 10, 3);
function envoyer_notification_reponse($new_status, $old_status, $comment) {

    if ($new_status !== 'approved' || $old_status === 'approved') return;
    if ((int) $comment->comment_parent === 0) return;

    $parent_comment = get_comment($comment->comment_parent);
    if (!$parent_comment) return;

    $subscribe = get_comment_meta($parent_comment->comment_ID, 'cren_subscribe_to_comment', true);
    if ($subscribe !== 'on') return;

    $email = $parent_comment->comment_author_email;
    if (strtolower($email) === strtolower($comment->comment_author_email)) return;

    $subject = '[' . get_bloginfo('name') . '] Nouvelle réponse à votre commentaire';

    $message  = "Bonjour,\n\n";
    $message .= "Une nouvelle réponse a été postée à votre commentaire sur : " . get_permalink($comment->comment_post_ID) . "\n\n";
    $message .= "Auteur de la réponse : " . $comment->comment_author . "\n";
    $message .= "Contenu : \n" . $comment->comment_content . "\n\n";
    $message .= "Lien direct : " . get_comment_link($comment->comment_ID) . "\n\n";
    $message .= "Pour ne plus recevoir de notifications : " .
                add_query_arg(['cren_unsubscribe' => $parent_comment->comment_ID, 'key' => wp_create_nonce('cren_unsub')], home_url());

    wp_mail($email, $subject, $message);
}

// 4. Gestion du désabonnement via le lien dans l'email
add_action('init', 'gestion_desabonnement');
function gestion_desabonnement() {
    if (isset($_GET['cren_unsubscribe'])) {
        $comment_id = intval($_GET['cren_unsubscribe']);
        if (wp_verify_nonce($_GET['key'] ?? '', 'cren_unsub')) {
            update_comment_meta($comment_id, 'cren_subscribe_to_comment', 'off');
            wp_die('Vous avez été désabonné des notifications pour ce commentaire. Merci !');
        }
    }
}

Il faudra certainement adapter en fonction de votre site, de son thème. Attention à modifier le lien vers votre politique de confidentialité.

Je me suis moi même rendu compte que si une personne ne voulait pas être notifiée et souhaitait répondre simplement, ce n’était plus possible. Le problème venait de l’attribut « required » sur la case qui RGPD bloquait tout commentaire tant qu’elle n’était pas cochée, alors qu’elle ne devrait être obligatoire que si la personne coche aussi la case d’abonnement. Donc correction :

/**
 * Notification de réponse aux commentaires — sans plugin, sans cookie
 * Version consolidée (compatible thème FSE + envoi corrigé + case RGPD non bloquante)
 */

// 1. Cases à cocher, juste avant le bouton d'envoi (compatible thème FSE)
add_filter('comment_form_submit_field', 'ajouter_checkbox_subscription_comment');
function ajouter_checkbox_subscription_comment($submit_field) {

    $html  = '<p class="comment-form-subscribe">';
    $html .= '<input id="cren_subscribe_to_comment" name="cren_subscribe_to_comment" type="checkbox" value="on" />';
    $html .= '<label for="cren_subscribe_to_comment">Me notifier par email des réponses à mon commentaire</label>';
    $html .= '</p>';

    $html .= '<p class="comment-form-gdpr">';
    $html .= '<input id="cren_gdpr" name="cren_gdpr" type="checkbox" value="yes" />';
    $html .= '<label for="cren_gdpr">J’accepte que mon email soit utilisé pour m’envoyer les notifications de réponses, si je coche la case ci-dessus (<a href="/politique-de-confidentialite" target="_blank">Politique de confidentialité</a>)</label>';
    $html .= '</p>';

    return $html . $submit_field;
}

// 2. Enregistrer l'abonnement quand le commentaire est posté
//    (n'enregistre "on" que si les deux cases sont cochées ensemble)
add_action('comment_post', 'enregistrer_abonnement_comment');
function enregistrer_abonnement_comment($comment_id) {
    $subscribe_ok = isset($_POST['cren_subscribe_to_comment']) && $_POST['cren_subscribe_to_comment'] === 'on';
    $gdpr_ok      = isset($_POST['cren_gdpr']) && $_POST['cren_gdpr'] === 'yes';

    if ($subscribe_ok && $gdpr_ok) {
        add_comment_meta($comment_id, 'cren_subscribe_to_comment', 'on');
    } else {
        add_comment_meta($comment_id, 'cren_subscribe_to_comment', 'off');
    }
}

// 3. Envoyer la notification quand le commentaire passe "approuvé"
add_action('transition_comment_status', 'envoyer_notification_reponse', 10, 3);
function envoyer_notification_reponse($new_status, $old_status, $comment) {

    if ($new_status !== 'approved' || $old_status === 'approved') return;
    if ((int) $comment->comment_parent === 0) return;

    $parent_comment = get_comment($comment->comment_parent);
    if (!$parent_comment) return;

    $subscribe = get_comment_meta($parent_comment->comment_ID, 'cren_subscribe_to_comment', true);
    if ($subscribe !== 'on') return;

    $email = $parent_comment->comment_author_email;
    if (strtolower($email) === strtolower($comment->comment_author_email)) return;

    $subject = '[' . get_bloginfo('name') . '] Nouvelle réponse à votre commentaire';

    $message  = "Bonjour,\n\n";
    $message .= "Une nouvelle réponse a été postée à votre commentaire sur : " . get_permalink($comment->comment_post_ID) . "\n\n";
    $message .= "Auteur de la réponse : " . $comment->comment_author . "\n";
    $message .= "Contenu : \n" . $comment->comment_content . "\n\n";
    $message .= "Lien direct : " . get_comment_link($comment->comment_ID) . "\n\n";
    $message .= "Pour ne plus recevoir de notifications : " .
                add_query_arg(['cren_unsubscribe' => $parent_comment->comment_ID, 'key' => wp_create_nonce('cren_unsub')], home_url());

    wp_mail($email, $subject, $message);
}

// 4. Gestion du désabonnement via le lien dans l'email
add_action('init', 'gestion_desabonnement');
function gestion_desabonnement() {
    if (isset($_GET['cren_unsubscribe'])) {
        $comment_id = intval($_GET['cren_unsubscribe']);
        if (wp_verify_nonce($_GET['key'] ?? '', 'cren_unsub')) {
            update_comment_meta($comment_id, 'cren_subscribe_to_comment', 'off');
            wp_die('Vous avez été désabonné des notifications pour ce commentaire. Merci !');
        }
    }
}

Et voici une dernière version, car en réalité, une seule case à cocher suffit :

/**
 * Notification de réponse aux commentaires — sans plugin, sans cookie
 * Version consolidée (compatible thème FSE + envoi corrigé + case unique)
 */

// 1. Case à cocher unique (souhait de notification + consentement RGPD réunis)
add_filter('comment_form_submit_field', 'ajouter_checkbox_subscription_comment');
function ajouter_checkbox_subscription_comment($submit_field) {

    $html  = '<p class="comment-form-subscribe">';
    $html .= '<input id="cren_subscribe_to_comment" name="cren_subscribe_to_comment" type="checkbox" value="on" />';
    $html .= '<label for="cren_subscribe_to_comment">Me notifier par email des réponses à mon commentaire (mon email sera conservé pour cet usage uniquement — <a href="/politique-de-confidentialite" target="_blank">politique de confidentialité</a>)</label>';
    $html .= '</p>';

    return $html . $submit_field;
}

// 2. Enregistrer l'abonnement quand le commentaire est posté
add_action('comment_post', 'enregistrer_abonnement_comment');
function enregistrer_abonnement_comment($comment_id) {
    if (isset($_POST['cren_subscribe_to_comment']) && $_POST['cren_subscribe_to_comment'] === 'on') {
        add_comment_meta($comment_id, 'cren_subscribe_to_comment', 'on');
    } else {
        add_comment_meta($comment_id, 'cren_subscribe_to_comment', 'off');
    }
}

// 3. Envoyer la notification quand le commentaire passe "approuvé"
add_action('transition_comment_status', 'envoyer_notification_reponse', 10, 3);
function envoyer_notification_reponse($new_status, $old_status, $comment) {

    if ($new_status !== 'approved' || $old_status === 'approved') return;
    if ((int) $comment->comment_parent === 0) return;

    $parent_comment = get_comment($comment->comment_parent);
    if (!$parent_comment) return;

    $subscribe = get_comment_meta($parent_comment->comment_ID, 'cren_subscribe_to_comment', true);
    if ($subscribe !== 'on') return;

    $email = $parent_comment->comment_author_email;
    if (strtolower($email) === strtolower($comment->comment_author_email)) return;

    $subject = '[' . get_bloginfo('name') . '] Nouvelle réponse à votre commentaire';

    $message  = "Bonjour,\n\n";
    $message .= "Une nouvelle réponse a été postée à votre commentaire sur : " . get_permalink($comment->comment_post_ID) . "\n\n";
    $message .= "Auteur de la réponse : " . $comment->comment_author . "\n";
    $message .= "Contenu : \n" . $comment->comment_content . "\n\n";
    $message .= "Lien direct : " . get_comment_link($comment->comment_ID) . "\n\n";
    $message .= "Pour ne plus recevoir de notifications : " .
                add_query_arg(['cren_unsubscribe' => $parent_comment->comment_ID, 'key' => wp_create_nonce('cren_unsub')], home_url());

    wp_mail($email, $subject, $message);
}

// 4. Gestion du désabonnement via le lien dans l'email
add_action('init', 'gestion_desabonnement');
function gestion_desabonnement() {
    if (isset($_GET['cren_unsubscribe'])) {
        $comment_id = intval($_GET['cren_unsubscribe']);
        if (wp_verify_nonce($_GET['key'] ?? '', 'cren_unsub')) {
            update_comment_meta($comment_id, 'cren_subscribe_to_comment', 'off');
            wp_die('Vous avez été désabonné des notifications pour ce commentaire. Merci !');
        }
    }
}

Nota : n’oubliez pas de valider les commentaires de test si vous voulez que ça fonctionne au niveau de votre administration et de vider le cache !

Je déposerai ce bout de code dans Codeberg.

Modifier la politique de confidentialité

Le site est sans cookie et ne conserve les adresses mails qu’en lien avec les commentaires ou les courriers reçus.

Il fallait tout de même clarifier :

Si vous cochez la case « Me notifier par email des réponses à mon commentaire » en publiant un commentaire, votre adresse e-mail est conservée dans la base de données du site, associée à ce commentaire, dans le seul but de vous avertir si quelqu’un vous répond. Cette conservation repose sur votre consentement explicite, recueilli par une case à cocher dédiée et non cochée par défaut. Aucun cookie n’est déposé pour cette fonctionnalité. Votre adresse est conservée jusqu’à ce que vous vous désabonniez via le lien présent dans chaque e-mail de notification, ou jusqu’à suppression du commentaire concerné. Elle n’est ni partagée avec un tiers, ni réutilisée à d’autres fins.

Ce que la personne reçoit

Reponse

Lorsqu’une personne laisse un commentaire, elle trouve des cases à cocher, vous les voyez en bas de cet article.

Une fois que la personne a reçu une réponse à son propre commentaire, un mail l’en informe avec le nom de l’auteur de la réponse, un lien pour retrouver l’ensemble et un lien de désinscription.


Je précise que les commentaires sont approuvés manuellement, que je demande le mail et le nom (mais ils pourraient être faux), que pour la légèreté de l’affichage je ne prends pas les avatars de Gravatar (mais ceux du Fédiverse passent). J’ai fait aussi des réglages pour veiller à la lisibilité. J’évite les plugins lourds. Pour partager un article un lien est proposé vers une page externe. Reste à s’assurer que tout fonctionne à terme mais a priori j’ai testé avec quatre mails différents.


Je vis en pays de Rouergue. Je partage ici chaque jour ou presque, un journal, de la fiction, de la poésie ou des chansons. Garanti « fait » à la main, ce site ne vous piste pas. Si vous aimez, partagez !


VOUS POURRIEZ AIMER AUSSI

dernières publications

Les commentaires

Commentez, ou publiez une réponse sur votre blog (avec un lien vers cet article) ou sur le Fediverse (Mastodon, etc.) : elle apparaîtra ici.

5 réponses à « Commentaires : être notifié·e d’une réponse par mail »

  1. Avatar de Matoo
    Matoo

    Ah mais c’est intéressant ton code dis-donc, je vais le tester aussi du coup !! 🙂 Je me suis développé aussi des petits trucs comme cela, quand les plugins étaient trop complexes et lourds par rapport à mon besoin. Mais c’est toujours un peu flippant de mettre en ligne comme cela des choses vibe-codées, la maintenance peut en être vraiment erratique ou même dangereuse.

    1. Avatar de Vincent Breton

      ça me permet de comprendre un peu comment ça fonctionne tout ça 😉

      1. Avatar de Matoo
        Matoo

        Ecoute ça fonctionne, mais j’ai testé sans cocher la seconde case avec la politique de confidentialité. Il me semble qu’elles devraient être indisociables sinon ça ne sert à rien ? L’acceptation du service de réception par email de commentaires est assujettie aux conditions… En tout cas, je n’ai pas coché, et j’ai reçu le mail, donc ?

        1. Avatar de Vincent Breton

          oui, une seule case suffit et l’opt-in est respecté ! je viens de corriger ! bien vu

          1. Avatar de Matoo
            Matoo

            Parfait. Bravo !! *\o/* (C’est une pompom girl old school ^-^’)

Un mot en retour ?

Vous souhaitez citer cet article sur votre site ? Indiquez simplement votre lien ici.