评论回复邮件功能前面有篇文章已经介绍了,也就相关问题进行了解答,这次的代码与网络流传的不一样,是从某全站ajax主题上扒下来的。
回复发邮件的功能大体都一样,原理是利用wp_mail函数来发送

@wp_mail ( $to_email, $subject, $message, $headers );

触发wp_mail函数可以利用php的mail函数,也可以用smtp。所以只要php支持mail函数或者smtp都可以实现这个功能。


那么就要在functions.php里面写一个函数,用add_action与wp挂钩即可。这个函数主要是判断是否要回复发送邮件,如果要则执行wp_mail,如果否则不执行。 其中wp_mail函数里面的参数变量意思如下:

  • $to_email: 要通知的邮箱
  • $subject:邮件标题
  • $message:邮件内容(可以分几行来完成)
  • $headers: 邮件头部(设置编码格式)
下面是完整的函数inlo_reply_mail_notify()
// 评论回复邮件通知
add_action ( 'comment_post', 'inlo_reply_mail_notify' );
function inlo_reply_mail_notify($comment_id) {
    // 下面这些在if判断前的变量都是为邮件内容准备的
    $comment = get_comment ( $comment_id ); // 该评论id
    $parent_id = $comment->comment_parent;
    if (! empty ( $_POST ['reply_mail_notify'] ) && $_POST ['reply_mail_notify'] == 'Y') { // 若input表单中name="reply_mail_notify"的值不为空并且为Y
        add_comment_meta ( $comment_id, 'reply_mail_notify', 'Y' );
    }
    $post_title = get_the_title ( $comment->comment_post_ID ); // 获取文章标题
    $post_link = get_permalink ( $comment->comment_post_ID ); // 文章链接
    $comment_link = get_comment_link ( $comment->comment_parent ); // 评论链接
    $blog_name = get_option ( 'blogname' ); // 博客标题
    $charset = get_option ( 'blog_charset' ); // 文章编码格式
    $from_email = 'no-reply@' . preg_replace ( '/(.*\.)(.*\.\w+)/', '${2}', $_SERVER ['HTTP_HOST'] ); // 来源email
    $from = "From: \"" . $blog_name . "\" <{$from_email}>"; // 来源
    $headers = "{$from}\nContent-Type: text/html; charset=" . $charset . "\n"; // 邮件头部
    set_time_limit ( 0 ); // 设置发送时限
    if (! empty ( $parent_id )) { // 若父级id不为空
        $parent_comment = get_comment ( $parent_id ); // 父级评论内容
        $is_mail_notify = get_comment_meta ( $parent_comment->comment_ID, 'reply_mail_notify', true ); // 是否需要邮件通知
        if ($is_mail_notify ['reply_mail_notify'] == 'Y' && $comment->comment_approved == '1') { // 若需要邮件通知并且评论已审核
            $to_email = trim ( $parent_comment->comment_author_email ); // 要通知的邮箱(删除邮箱的空格)
            $subject = '你在[' . $blog_name . ']上的留言有了新的回复'; // 邮件标题
            // 邮件内容
            $message = '<div style="width:800px;padding:10px 20px;font-family: 微软雅黑;color: #777;background-color: #fafafa;border: 1px solid #e3e3e3;border-top: 4px solid #1e8cbe;">';
            $message .= '<p style="padding-bottom: 10px;border-bottom: 1px solid #E3E3E3;font-size:18px">嗨,' . $parent_comment->comment_author . ',你在<a href="' . $post_link . '" style="text-decoration: underline;color: #278DBC;">《' . $post_title . '》</a>中的评论有了回复</p>';
            $message .= '<p style="padding: 10px;color:#444;"><span style="display: block;padding-bottom: 15px;color: #aaa;">' . $comment->comment_author . '给你的回复:</span>“' . $comment->comment_content . '”</p>';
            $message .= '<p style="border-top: 2px solid #20A3CC;padding: 10px;"><span style="color: #aaa;padding-bottom: 15px;display: block;">你的评论:</span>“' . $parent_comment->comment_content . '”</p>';
            $message .= '<p><a href="' . $comment_link . '" style="font-style: oblique;color: #278DBC;text-decoration: underline;">查看详细</a></p><p style="color: #f00;font-size: 12px;">PS:此邮件由系统自动发送,请勿回复!</p>';
            $message .= '<p><a style="font-size: 12px;" title="前往首页" href="' . home_url () . '">' . $blog_name . '</a></p></div>';
            @wp_mail ( $to_email, $subject, $message, $headers ); // 执行wp_mail函数,可以用php的mail函数或smtp来触发执行wp_mail函数
        }
    }
    // 下面这个if判断是为后台设置而准备的。
    if (inlo_options ( 'is_email_msg' ) == 'Y') {
        $to_email = get_bloginfo ( 'admin_email' );
        $subject = $blog_name . '上有了新的评论';
        $message = '<div style="width:800px;padding:10px 20px;font-family: 微软雅黑;color: #777;background-color: #fafafa;border: 1px solid #e3e3e3;border-top: 4px solid #1e8cbe;">';
        $message .= '<p style="padding-bottom: 10px;border-bottom: 1px solid #E3E3E3;font-style: oblique;"><a href="' . $post_link . '" style="text-decoration: none;color: #278DBC;">《' . $post_title . '》</a>有新的评论</p>';
        $message .= '<p style="padding: 10px;color:#444;"><span style="display: block;padding-bottom: 15px;color: #aaa;">' . $comment->comment_author . '的评论:</span>“' . $comment->comment_content . '”</p>';
        $message .= '<p><a href="' . $comment_link . '" style="font-style: oblique;color: #278DBC;text-decoration: underline;">查看详细</a></p>';
        $message .= '</div>';
        @wp_mail ( $to_email, $subject, $message, $headers );
    }
    return $comment_id;
}
comments.php里面需要添加的构件

一个是真实的开关,是隐藏的input表单,必须放在form表单之内

<input type="hidden" name="reply_mail_notify" id="reply_mail_notify" value="Y" />

另一个是虚假的开关,是显示出来给访客点击选择的这个也为了下面的js控制而准备,可以放在提交按钮旁边

<span class="mail_notify_box<?php echo  ' mail_on' ; ?>" id="mail_notify_box" title="是否接收评论回复邮件通知"></span>
虚假开关的CSS样式

采用fa字体图标

.comment-form-submit .mail_notify_box:before{font-family:'FontAwesome';content:"\f003";font-size:20px;color:#ccc}
.comment-form-submit .mail_on:before{font-family:'FontAwesome';content:"\f0e0";font-size:20px;color:#737f99}
JS控制两个开关
// 邮件回复
$('#main').on('click','#mail_notify_box', // #main改为对应的容器id
function() {
    if( $(this).hasClass('mail_on') ){ // 若存在mail_on类
        $(this).removeClass('mail_on'); // 则移除mail_on类(即移除了css样式-邮件图标变暗)
        $('#reply_mail_notify').val(''); // 设置input表单的值为空(即不触发发送邮件函数)
    } else { // 若不存在mail_on类
        $(this).addClass('mail_on'); // 则添加mail_on类 (即添加css样式-邮件图标变亮) 
        $('#reply_mail_notify').val('Y'); // 设置input表单的值为Y(即触发发送邮件函数)
    }
});

完成以上步骤就OK了。而且这个邮件回复不需要在commernts.php里面加这两句代码:

<?php comment_id_fields(); ?>
 <?php do_action( 'comment_form', $post->ID ); ?>

基本的触发流程在此解释一下:开关有两个通过js来控制,访客点击邮件图标开关,js就会控制它变亮/变淡,与此同时会为另一个真实隐藏的input开关填值:空/Y,functions.php里面自定义的inlo_reply_mail_notify()函数会根据input的值来判断是否发送邮件,input表单为空则不发送,为Y则发送。That's All .