终于把「评论有回复时邮件通知」给弄出来了

用 WordPress 原生的评论系统,当某条评论下有回复时,评论者是不会收到任何通知的。这就导致博主兴致盎然地对某条评论大肆发表看法的时候,原评论者也许根本就不知道这里发生了什么…… 这一点绝对是我难以容忍的,不说访问流量不说用户体验,让我费尽口舌说一番没人看得见的话这种事我才不干。

之前花了好长时间搜索这个解决方案,由于我不愿意用 Disqus 或者多说之类的第三方评论系统,只能想办法用代码来解决。而不通过插件来实现评论回复邮件通知大多采用的是 Willin Kan(不用点了这个博客已经停止运营了)的代码,具体代码可以在这里找到,我就懒得贴过来了。不过郁闷的是这段代码在我这里怎么都不能正常工作,而我又对 PHP 一窍不通,只能把这事暂且搁下,只能希望谁在这留过言的过一段再自觉地回来看看……(补充一下:主机不支持 mail() 函数,但是已经用了 WP Mail SMTP,并且新评论邮件通知和找回密码邮件通知都可以正常工作)昨天逛博客的时候无意在「【记录】给wordpress添加评论回复发邮件通知功能」这篇文章里看到作者详细记录下了解决这个问题的办法,于是觉得这事不能再这么拖下去,必须立刻解决否则迟早给逼出强迫症来。

仔细研究了一下发现代码中有一句

$wp_email = 'no-reply@' .preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); //e-mail 发出点,no-reply 可改为可用的 e-mail.

想了想终于知道为什么之前老是发不出提醒邮件了。代码中指定的邮件发送者为 no-reply@域名,对于我的 WordPress,发送邮箱就应该是 no-reply@ridiqulous.com, 但是我根本就还没申请这个邮箱啊!!! 相当于指定了一个根本就不存在的发件人账号,这通知邮件要能发得出去就怪了…… 想明白了问题所在就好办了,直接把上面那一行改成

$wp_email = 'me@ridiqulous.com';

这样问题就解决了,me@ridiqulous.com 是我在 WP Mail SMTP 中设定的发件方账号。其实最好的建议还是申请一个 no-reply@域名 的邮箱,这样通知邮件可以看起来正式一点,而且从代码的可移植性来讲最好使用一个通用的邮箱地址。另外我也不知道

.preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME']));

这一句是什么意思,但是如果仅仅把 no-reply 改为 me 而不强制输入域名的话,也是不能工作的。

终于发得了邮件之后就要完善一下邮件的内容了。Willin Kan 的那段代码只能实现发邮件的功能,但邮件的内容却很不利于收信人阅读,没有提供任何跳转链接,相当于仅仅发送了一个通知,还要收信人自己想办法找到当时评论的那个页面。对于这个问题常阳时光对代码进行了一些完善,同时在邮件的样式上也做了一些修改,大大提高了邮件的可读性。代码如下:

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){ //对每个子匹配都进行邮件发送操作
            comment_send_email($parent_id,$comment);
        }
    }elseif($comment->comment_parent!='0'){ //以防万一,有人故意删了@回复,还可以通过查找父级评论id来确定邮件发送对象
        $parent_id=$comment->comment_parent;
        comment_send_email($parent_id,$comment);
    }else return;
}
add_action('comment_post', 'comment_mail_notify');

function comment_send_email($parent_id,$comment){
    $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 = 'me@ridiqulous.com'; // e-mail 發出點, no-reply 可改為可用的 e-mail.
        $subject = '您在 ' . get_option("blogname") . ' 博客的评论有了新回复';
        $message = '
        <div style="background-color:#fff; border:2px solid #ebebeb; color:#222; -moz-border-radius:8px; -webkit-border-radius:8px; -khtml-border-radius:8px; border-radius:8px; width:640px; margin:30px auto 15px auto; margin-top:10px;">
        <div style="background:#fff; width:100%; height:60px; -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; ">
        <h2 style="border-bottom:2px solid #ebebeb;font-size:16px;font-weight:blod;padding:5px 0 20px 30px;"> 您在<a style="text-decoration:none;color: #43626d;" href="' . get_option('home') . '"> ' . get_option("blogname") . ' </a>博客上的留言有回复啦!</h2></div>
            <div style="width:94%; margin:20px auto 25px auto">
                <p style="font-size:14px;padding:0 10px;line-height:110%;">' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
                <p style="font-size:14px;padding:0 10px;line-height:110%;">您曾在文章《 <a style="text-decoration:none;font-weight:bold; color:#53757f" href="'. htmlspecialchars(get_comment_link($parent_id,array("type" => "all"))) . '">' . get_the_title($comment->comment_post_ID) . '</a> 》中发表过评论:<br />
                <p style="background-color: #F6F6F6;border: 1px solid #DDD;font-size:13px;padding: 10px 20px;border-radius:4px;margin: 15px 0;">'. trimget_comment($parent_id)->comment_content) . '</p>
                <p style="font-size:14px;padding:0 10px;line-height:110%;">' . trim($comment->comment_author) . ' 给您的回复:<br />
                <p style="background-color: #F6F6F6;border: 1px solid #DDD;font-size:13px;padding: 10px 20px;border-radius:4px;margin: 15px 0;">'.trim($comment->comment_content) . '</p>
                <p style="font-size:14px;padding:0 10px;line-height:110%;">您也可以<a style="text-decoration:none;font-weight:bold;color:#53757f" href="' .htmlspecialchars(get_comment_link($parent_id, array('type' => 'comment'))) . '">点击这里查看完整内容</a>。同时欢迎<a style="text-decoration:nonefont-weight:bold;color:#53757f" href="https://feedpress.me/ridiqulous">订阅 RSS</a>。</p>
                <p style="font-size:14px;padding:0 10px;line-height:110%;">此邮件由系统自动发出, 请勿直接回复。</p>
            </div>
        </div>';
        $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
        $headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
        wp_mail( $to, $subject, $message, $headers );
    }
}

把这段放到 function.php 中的 <?php?> 之间就行了,记得把发送邮箱地址改掉。

把评论回复邮件通知这事儿给解决之后总算没有心理负担了…… 欢迎在下面评论等我回复的时候看看效果。最后再感谢一下常阳时光, 第一时间提供帮助。

About the author

Jueqin

本作品以 CC BY-NC-ND 许可协议进行发布。

如果您认为文章对您有用的话,不妨请我喝一杯咖啡?

21 comments