为WordPress添加评论回复邮件通知

2022-12-15 15:01:41 浏览数 (2)

在为WordPress添加评论回复邮件通知功能之前,您需要保证您的WordPress可以正常的发送邮件,否则无法看到效果。

WordPress评论在被其他人(包含管理员)评论时,默认是不会发送邮件通知原评论的作者的,这也就意味着如果我们对某一条用户评论进行评论时(这是一个讨论的场景),原始评论的作者将无法得知我们已经对他的评论做出了回复,一直要等到该用户再次阅读这篇文章并查看评论区时才有可能看到回复信息,这样我们的评论区就真的变了死的留言板,而我们更希望他是一个活的,可以供大家讨论的讨论区,这就需要我们在作出回复时,原评论作者能够及时的了解到自己的留言有了新的动态,这也是评论回复邮件通知的最重要的作用。

WordPress因为用户量很大,所以有各种各样的人群为WordPress打造了不少优秀的插件,我们当然可以利用评论插件来完成此事,但有的站长并不希望依赖过多的插件,有没有不使用插件的方法呢,答案是肯定的,下面我们就来介绍几种可用的方法。

方法一:

该方法是Willin Kan提供的,目前网络中能很轻易的找到这段代码。

该方法不提供任何选项,只要在评论时提供了邮件地址的用户都会受到评论回复通知。

代码语言:javascript复制
/* comment_mail_notify v1.0 by willin kan. (所有回复都发邮件) */
function comment_mail_notify($comment_id) {
  $comment = get_comment($comment_id);
  $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
  $spam_confirmed = $comment->comment_approved;
  if (($parent_id != '') && ($spam_confirmed != 'spam')) {
    $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); //e-mail 发出点, no-reply 可改为可用的 e-mail.
    $to = trim(get_comment($parent_id)->comment_author_email);
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了回复';
    $message = '
    <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px;">
      <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
      <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />'
       . trim(get_comment($parent_id)->comment_content) . '</p>
      <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
       . trim($comment->comment_content) . '<br /></p>
      <p>您可以点击 查看回复完整內容</p>
      <p>欢迎再度光临 ' . get_option('blogname') . '</p>
      <p>(此邮件由系统自动发送,请勿回复.)</p>
    </div>';
      $from = "From: "" . get_option('blogname') . "" <$wp_email>";
      $headers = "$fromnContent-Type: text/html; charset=" . get_option('blog_charset') . "n";
      wp_mail( $to, $subject, $message, $headers );
  }
}
add_action('comment_post', 'comment_mail_notify');
// -- END ----------------------------------------
方法二:

让访客自己选择是否邮件通知

代码语言:javascript复制
/* 开始*/
function comment_mail_notify($comment_id) {
  $admin_notify = '1'; // admin 要不要收回复通知 ( '1'=要 ; '0'=不要 )
  $admin_email = get_bloginfo ('admin_email'); // $admin_email 可改为你指定的 e-mail.
  $comment = get_comment($comment_id);
  $comment_author_email = trim($comment->comment_author_email);
  $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
  global $wpdb;
  if ($wpdb->query("Describe {$wpdb->comments} comment_mail_notify") == '')
    $wpdb->query("ALTER TABLE {$wpdb->comments} ADD COLUMN comment_mail_notify TINYINT NOT NULL DEFAULT 0;");
  if (($comment_author_email != $admin_email && isset($_POST['comment_mail_notify'])) || ($comment_author_email == $admin_email && $admin_notify == '1'))
    $wpdb->query("UPDATE {$wpdb->comments} SET comment_mail_notify='1' WHERE comment_ID='$comment_id'");
  $notify = $parent_id ? get_comment($parent_id)->comment_mail_notify : '0';
  $spam_confirmed = $comment->comment_approved;
  if ($parent_id != '' && $spam_confirmed != 'spam' && $notify == '1') {
    $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 发出点, no-reply 可改为可用的 e-mail.
    $to = trim(get_comment($parent_id)->comment_author_email);
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了回复';
    $message = '
    <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px;">
      <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
      <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />'
       . trim(get_comment($parent_id)->comment_content) . '</p>
      <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
       . trim($comment->comment_content) . '<br /></p>
      <p>您可以点击查看回复的完整內容</p>
      <p>还要再度光临 ' . get_option('blogname') . '</p>
      <p>(此邮件由系统自动发送,请勿回复.)</p>
    </div>';
         $from = "From: "" . get_option('blogname') . "" <$wp_email>";
         $headers = "$fromnContent-Type: text/html; charset=" . get_option('blog_charset') . "n";
         wp_mail( $to, $subject, $message, $headers );
  }
}
add_action('comment_post', 'comment_mail_notify');
 
/* 自动加勾选栏 */
function add_checkbox() {
  echo '<input type="checkbox" name="comment_mail_notify" id="comment_mail_notify" value="comment_mail_notify" checked="checked" style="margin-left:20px;" /><label for="comment_mail_notify">有人回复时邮件通知我</label>';
}
add_action('comment_form', 'add_checkbox');
方法三:

让管理员决定什么情况下发邮件

代码语言:javascript复制
/* comment_mail_notify v1.0 by willin kan. (无勾选栏) */
function comment_mail_notify($comment_id) {
  $admin_email = get_bloginfo ('admin_email'); // $admin_email 可改为你指定的 e-mail.
  $comment = get_comment($comment_id);
  $comment_author_email = trim($comment->comment_author_email);
  $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
  $to = $parent_id ? trim(get_comment($parent_id)->comment_author_email) : '';
  $spam_confirmed = $comment->comment_approved;
  if (($parent_id != '') && ($spam_confirmed != 'spam') && ($to != $admin_email) && ($comment_author_email == $admin_email)) {
    /* 上面的判断式,决定发出邮件的必要条件:
    ($parent_id != '') && ($spam_confirmed != 'spam'): 回复的, 而且不是 spam 才可发, 必需!!
    ($to != $admin_email) : 不发给 admin.
    ($comment_author_email == $admin_email) : 只有 admin 的回复才可发.
    可视个人需修改上面的条件.
    */
    $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 发出点, no-reply 可改为可用的 e-mail.
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了回复';
    $message = '
    <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px;">
      <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
      <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />'
       . trim(get_comment($parent_id)->comment_content) . '</p>
      <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
       . trim($comment->comment_content) . '<br /></p>
      <p>您可以点击 查看回复的完整內容</p>
      <p>还要再度光临 ' . get_option('blogname') . '</p>
      <p>(此邮件由系统自动发送,请勿回复.)</p>
    </div>';
         $from = "From: "" . get_option('blogname') . "" <$wp_email>";
         $headers = "$fromnContent-Type: text/html; charset=" . get_option('blog_charset') . "n";
         wp_mail( $to, $subject, $message, $headers );
  }
}
add_action('comment_post', 'comment_mail_notify');
// -- END ----------------------------------------
方法四:

支持嵌套和@用户方式的评论提醒

该方法转载自zww.me,这版本的评论回复通知是支持嵌套和@用户方式的。有什么问题,可到作者页面反馈。

代码语言:javascript复制
/* 邮件通知 by Qiqiboy */
 function comment_mail_notify($comment_id) {
     $comment = get_comment($comment_id);//根据id获取这条评论相关数据
     $content=$comment->comment_content;
     //对评论内容进行匹配
     $match_count=preg_match_all('/<a href="#comment-([0-9] )?" rel="nofollow">/si',$content,$matchs);
     if($match_count>0){//如果匹配到了
         foreach($matchs[1] as $parent_id){//对每个子匹配都进行邮件发送操作
             SimPaled_send_email($parent_id,$comment);
         }
     }elseif($comment->comment_parent!='0'){//以防万一,有人故意删了@回复,还可以通过查找父级评论id来确定邮件发送对象
         $parent_id=$comment->comment_parent;
         SimPaled_send_email($parent_id,$comment);
     }else return;
 }
 add_action('comment_post', 'comment_mail_notify');
 function SimPaled_send_email($parent_id,$comment){//发送邮件的函数 by Qiqiboy.com
     $admin_email = get_bloginfo ('admin_email');//管理员邮箱
     $parent_comment=get_comment($parent_id);//获取被回复人(或叫父级评论)相关信息
     $author_email=$comment->comment_author_email;//评论人邮箱
     $to = trim($parent_comment->comment_author_email);//被回复人邮箱
     $spam_confirmed = $comment->comment_approved;
     if ($spam_confirmed != 'spam' && $to != $admin_email && $to != $author_email) {
         $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 發出點, no-reply 可改為可用的 e-mail.
         $subject = '您在 [' . get_option("blogname") . '] 的留言有了回應';
         $message = '<div style="background-color:#eef2fa;border:1px solid #d8e3e8;color:#111;padding:0 15px;-moz-border-radius:5px;-webkit-border-radius:5px;-khtml-border-radius:5px;">
             <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
             <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />'
             . trim(get_comment($parent_id)->comment_content) . '</p>
             <p>' . trim($comment->comment_author) . ' 给你的回复:<br />'
             . trim($comment->comment_content) . '<br /></p>
             <p>您可以点击 <a href="' . htmlspecialchars(get_comment_link($parent_id,array("type" => "all"))) . '">查看回复的完整內容</a></p>
             <p>欢迎再度光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
             <p>(此邮件有系统自动发出, 请勿回复.)</p></div>';
         $from = "From: "" . get_option('blogname') . "" <$wp_email>";
         $headers = "$fromnContent-Type: text/html; charset=" . get_option('blog_charset') . "n";
         wp_mail( $to, $subject, $message, $headers );
     }
 }
方法五:

说是方法五,其实是根据前面几种方法修改和优化而来(中间加了很多注释),这也是yii主题使用的方法。

主题在评论提交按钮下方提供了一个复选框(参考方法二自动添加),使得该方法支持让用户选择是否接收评论回复通知;为了防止垃圾邮件侵扰用户,该方法增加了评论需要是审核通过后才发送邮件通知。

代码语言:javascript复制
// 不需要审核的评论,在评论发表后发送邮件通知
add_action('comment_post', 'yi_comment_reply_notify', 20, 2);
// 需要审核的评论,待博主审核后再发送邮件通知
add_action('wp_set_comment_status', 'yi_comment_reply_notify', 20, 2);

function yi_comment_reply_notify($comment_id){
    $admin_notify = '0';// 管理员是否接收回复通知 ( '1'=要 ; '0'=不要 )
    $admin_email = get_bloginfo('admin_email');// 管理员邮件地址,可改为你指定的邮箱。
    $charset = get_option('blog_charset');// 网站文件编码
    $comment = get_comment($comment_id);
    $comment_author_email = $comment->comment_author_email;//当前评论的评论者邮箱
    $spam_confirmed = $comment->comment_approved;//评论许可,0-待审,1-批准,spam-垃圾邮件
    $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
    //插入数据表字段,以支持选择是否在评论被回复时接收邮件通知
    global $wpdb;
    if(!($wpdb->query("Describe {$wpdb->comments} comment_mail_notify"))) {
        $wpdb->query("ALTER TABLE {$wpdb->comments} ADD COLUMN comment_mail_notify TINYINT NOT NULL DEFAULT 0;");
    }
    // 设置该评论是否接收回复通知
    if(($comment_author_email != $admin_email && isset($_POST['comment_mail_notify'])) || ($comment_author_email == $admin_email && $admin_notify == '1')) {
        $wpdb->query("UPDATE {$wpdb->comments} SET comment_mail_notify='1' WHERE comment_ID=$comment_id");
    }
    $notify = $parent_id ? get_comment($parent_id)->comment_mail_notify : '0';//设置接收通知的状态
    if (($parent_id != '') && ($spam_confirmed === '1') && $notify == '1'){
        // $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); //e-mail发出点, no-reply可改为可用的 e-mail.
        $wp_email = 'service@yiven.vip';
        $to = trim(get_comment($parent_id)->comment_author_email);
        $subject = "您在 [".get_bloginfo("name")."] 的留言有了新的回复";
        // $message = get_template_part('template/mail-notify');//载入模板
        $message = "<div style='background-color:#fff; box-sizing: border-box; border:1px solid #f2f2f2; color:#111; -moz-border-radius:8px; -webkit-border-radius:8px; -khtml-border-radius:8px; border-radius:8px; font-size:12px; width:90%; min-width:702px; margin:0 auto; margin-top:10px; font-family: 微软雅黑, Microsoft YaHei, Arial, sans-serif;'>";
            $message .= "<div style='background:#666666; width:100%; height:60px; color:white; -moz-border-radius:6px 6px 0 0; -webkit-border-radius:6px 6px 0 0; -khtml-border-radius:6px 6px 0 0; border-radius:6px 6px 0 0; '>";
                $message .= "<span style='height:60px; line-height:60px; margin-left:30px; font-size:12px;'>";
                $message .= "您在博客<a style='text-decoration:none; color:#00bbff;font-weight:600;' href='".home_url()."'>".get_bloginfo('name')."</a>上的留言有回复啦!";
                $message .= "</span>";
            $message .= "</div>";
            $message .= "<div style='width:90%; margin:0 auto'>";
                $message .= "<div style='padding: 5px;'>";
                    $message .= "<p><strong>".trim(get_comment($parent_id)->comment_author)."</strong>, 您好!</p>";
                    $message .= "您曾在<a style='text-decoration:none; color:#00bbff' href='".home_url()."'>[".get_bloginfo('name')."]</a>的文章<a style=text-decoration:none; color:#00bbff' href='".get_the_permalink($comment->comment_post_ID)."' >《".get_the_title($comment->comment_post_ID)."》</a>中发表评论:";
                    $message .= "<p style='background-color: #EEE;border: 1px solid #DDD; padding: 20px;margin: 15px 0;'>";
                    $message .= nl2br(get_comment($parent_id)->comment_content);
                    $message .= "</p>";
                $message .= "</div>";
                $message .= "<div style='padding: 5px;'>";
                    $message .= "<span>".trim($comment->comment_author)."</span>给您的回复如下:";
                    $message .= "<p style='background-color: #EEE;border: 1px solid #DDD;padding: 20px; margin: 15px 0;'>";
                    $message .= nl2br($comment->comment_content);
                    $message .= "</p>";
                $message .= "</div>";
                $message .= "<p style='padding: 5px;'>";
                $message .= "您可以点此<a style='text-decoration:none; color:#00bbff' href='".htmlspecialchars(get_comment_link($parent_id))."'>查看完整的回复內容</a>";
                $message .= "</p>";
                $message .= "<p style='padding: 5px;'>";
                $message .= "欢迎再次光临 <a style='text-decoration:none; color:#00bbff' href='".home_url()."'>".get_bloginfo('name')."</a>";
                $message .= "</p>";
                $message .= "<p style='padding: 5px;'>此邮件由系统自动发出, 请勿回复!!<span style='float:right'>&copy;&nbsp;".date("Y")."&nbsp;".bloginfo('name')."</span></p>";
            $message .= "</div>";
        $message .= "</div>";
        $message = convert_smilies($message);//翻译表情
        $from = "From: "".get_bloginfo('name')."" <".$wp_email."> ";
        $message_header = $from."n"."Content-Type: text/html; charset=".$charset."n";
        // $message_header = "Content-Type: text/html; charset="".get_option('blog_charset').""n";
        // 邮箱为空的,不执行邮件发送
        if($to != ''){
            @wp_mail($to, $subject, $message, $message_header);
        }
    }
}

提示:

发送邮件,需要主机支持 mail() 函数,如果你发现没办法收到邮件,可以询问你的主机商。由于每个人的主机环境不一样,有些朋友在添加这个功能的时候,总是不能成功,这时候,你可以试试 SMTP 发送邮件的方式,此方式可使用WP SMTP插件轻松完成,如果您使用本站提供的yii主题,该插件已经在主题中集成,只需简单设置即可使用。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:

原文出处:Yiiven https://cloud.tencent.com/developer/article/2193237

0 人点赞