吵吵   2011-07-02  阅读:3,443

从开始做这个主题到今天也有十多天了,这陆陆续续的十多天总算还是把个主题弄的有个基本框架了。完成了嵌套评论我们要开始完成一个功能,那就是要实现回复评论后的邮件通知了。这个功能用上可以多多聚集一下博客的人气,再者看看自己的邮箱中那么多博主的邮件发来,自己也不甘落后了。

实现该功能的插件好像也不少,最受欢迎的大概算是wp-thread-comment,现在已经到了1.4.9版本了。百度之后,发现要实现这样一个功能也用不上这样子复杂了。我一向以为插件的庞大会降低我速度的,就用上了这段代码,我先贴一下这段代码:

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 = '

Hi !' . trim(get_comment($parent_id)->comment_author) . ',您好!

您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言有了新回复。


说:' . trim(get_comment($parent_id)->comment_content) . '

' . trim($comment->comment_author) . '说:

' . trim($comment->comment_content) . '

您可以点击查看完整的回复內容。

欢迎再度光临 ' . get_option('blogname') . '

(此邮件由系统自动发送,请勿回复。)

';
$from = "From: \"".get_option('blogname')."\" <$wp_email>";
$mail_headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
wp_mail( $to, $subject, $message,$mail_headers);
//echo 'mail to '.$to. $subject.$message; // for testing
}
}
add_action('comment_post', 'comment_mail_notify');
?>

这段代貌似挺长的,但是看上去就是很简单了。一个是add_action()这样子的一个函数。这样的一个函数可能很多人都会叫它hook即钩子,钩子钩什么呢?add_action(‘comment_post’, ‘comment_mail_notify’);这里钩的是comment_post这个动作,即当我们有一条评论发表的时候就会执行comment_mail_notify这个函数,那么后面这个函数执行的就是判断的评论是不是管理员的回复,然后构造邮件把邮件给发出去。
说到这里不由得赞叹一下wordpress的高明之处,人加的php程序写的像vc,连钩子这种概念都用到了。不得不佩服的是他这种十分清晰的全局构架,和精巧的扩展接口。想来以前写的php程序,就是写个小站的程序都是乱的一沓糊涂,全是函数来着,完全就没有从全局上把握住,让别人看的头疼,自己看着也头疼。若作为一个开发者来讲全局概念有多重要,面向对象或者类的概念有多重要啊。
然而当我自己测试的时候发现这个功能没有用,邮件还是发不出去,这个就恼人了。可以肯定的是前面的代码是没问题的,那么问题出现的就是wp_mail这个发邮件的函数了。
wp发邮件在现在这个版本来说应该是完全没有问题了,因为已经支持转发了。什么是转发,我们可以看一下收到的一封邮件件人:
吵吵博客 查看 添加 拒收 自动归档
(由 yiliaoba@ming.dnschina.net 代发) 真实发送地址与宣称的发件人地址不一致,
请谨慎审视邮件内容的真实性。
可以看到像我们这种租用一个php空间的小客户是由服务器的pop3服务转发的,至于怎么弄的可以参考wp-mail.php,这个文件中有pop3转发的代码。
说了这么多也解决不了我们发不出邮件的这个问题啊,但是我想说的就是跟着wp的mail功能我们找到了pluggable.php这个文件,该文件在wp-include下。
我发不出去邮件,但是每次有评论出现了wp却发给了我邮件啊,怎么做到的呢?这个文件中的一个函数
function wp_notify_postauthor( $comment_id, $comment_type = ” ) 即是干这个活的。
略略看了一下这个函数,找到了
@wp_mail( $author->user_email, $subject, $notify_message, $message_headers );
这个与我们上面的函数有区别的就是加了一个@的函数,这个符号的作用是忽略我们错误的代码,也就是说wp_mail在我们回复的时候是有错误的。随便在回复的时候echo一下就发现是和我们在后台回复时候用到的ajax是有冲突的,冲突在header中的问题,这个问题我也不深究了,我也加个@忽略一下吧,毕竟我是在后台回复的,和wp原本的ajax有冲突就有冲突吧,明天我再写一下js代码,完成前台的回复,也不关它什么事情了。
上面的$message_header是我改写后的,之后发出的邮件就没有乱码也没有排版的错误了,但是要记得wp_mail加个@上去哦。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

29条回应:“wp实现邮件评论回复时邮件通知”

  1. 点点外卖说道:

    沙发又是我的!

  2. 天玉有双说道:

    来了就必须顶一下,虽然我用的是非曲直zblog!

  3. kedeng站长说道:

    博主的模板很好看啊。有感觉。

  4. 很支持,记得去我那看看哦!

  5. 官橙宝说道:

    实现这个功能确实对自己博客有好处。回复评论者,回访率提高

  6. 不错,前来学习一下了

  7. 红涛SEO博客说道:

    没有弄这个功能,

  8. 代码方面的东西我不懂。

    • 吵吵说道:

      好吧,我的博客原本就是想做一个技术交流的博客,那就多谢捧场了。

  9. 付付说道:

    我以前刚开始自己做主题时,记录了很多这种技术方面的。后面数据丢了。就没记这些了。呵。不知道博主是否知道willin大师!很多东东他写的还是挺不错的!

  10. 易水寒博客说道:

    评论回复是一个好功能。

  11. 贺昌说道:

    昨天刚刚折腾了WP,实现了这个功能,像博主一样把该功能嵌进主题是很好的想法

  12. 大尚网说道:

    这个周末试试去,呵呵

  13. zh说道:

    这个问题,有些地方我不是很清晰。我想确认下,是否默认通过WP发送的邮件(给管理员或者读者),默认都是由空间商邮件服务器转发的(就是有“代发”字样)?。我用Willin Kan的Comment Mail Notify,而且也在cPanel后台创建了专用邮箱,可是还是被代发了……

  14. 太晚了,明天来试试!第一次来,谢谢楼主分享!

  15. ixwebhosting说道:

    评论回复是非常有用的!我也想装个这种插件呢!

  16. 邓超说道:

    给力啊,向吵吵学习!!努力中

  17. 所以呢说道:

    我现在就用了这样的代码,,感觉很不错!~!~

  18. aleeee说道:

    @wp_mail( $author->user_email, $subject, $notify_message, $message_headers );
    这个与我们上面的函数有区别的就是加了一个@的函数,这个符号的作用是忽略我们错误的代码,也就是说wp_mail在我们回复的时候是有错误的。随便在回复的时候echo一下就发现是和我们在后台回复时候用到的ajax是有冲突的,冲突在header中的问题,这个问题我也不深究了,我也加个@忽略一下吧,毕竟我是在后台回复的,和wp原本的ajax有冲突就有冲突吧,明天我再写一下js代码,完成前台的回复,也不关它什么事情了。
    上面的$message_header是我改写后的,之后发出的邮件就没有乱码也没有排版的错误了,但是要记得wp_mail加个@上去哦。

    这段没看懂,请问需要修改哪个地方才能成功支持 邮件评论回复 ?
    谢谢了,这个问题困扰好久了。

    • 吵吵说道:

      一是要服务器支持,二是试试加上@,否则的话只能通过socket发送邮件了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注