用 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
与 ?>
之间就行了,记得把发送邮箱地址改掉。
把评论回复邮件通知这事儿给解决之后总算没有心理负担了…… 欢迎在下面评论等我回复的时候看看效果。最后再感谢一下常阳时光, 第一时间提供帮助。
感谢博主分享。
请问,博主评论框里默认的背景提示文字是怎么实现的?
看起来很不错。
修改主题下的 comments.php 就行,有一项 comment_field
测试一下
酷哦
测试邮件
[…] 我在网上翻了很多资料,大多都是同样的内容,就是对权限有所控制,但对于收发信功能实现来说,都是相同的,所以对我遇到的问题没有参考意义。后来看到一个博客,博主说把发件人那里直接改为: […]
你这个不是多说吧?
看到上面有个熟人 我想问一下博主ho 我用了你提供的这段代码然后邮箱修改成我经常用的那个 然后服务器报500错误了。
有的主机默认不支持邮件发送,可以自己安装WP Mail SMTP插件试试
为什么我按照你的做了,还是没有成功,stmp发信能够成功
测试下
[…] Disqus 一段,主要是因为自己搞不定有回复自动发邮件提醒这件事,后来解决了就又把 Disqus […]
测试下。。。。
你为什么不去 Gravatar 设置一个头像?
懒得翻墙。没有wordpress.com的帐号。
架梯子是必备技能啊,没头像看着好难受
而且多说可以自动调用 Gravatar 的资料
你这主题很不错,大气。
你是说过什么不该说的话被加入 Akismet 的黑名单了吗?还好我把你拖出来了
我没说啥啊,你小子这过滤的也太狠了吧
就是 Akismet 的默认过滤啊,你得小心了…… 估计其他地方你评论也要被拦了
喏