评论回复就是说如果你在一个博客或者网站上留了言,当有人回复你的时候,系统就会自动发一封邮件通知你。我最早在万戈那里留言的时候,就体会到的评论回复在用户体验上是很友好的。最近逛的博客多了,才发现几乎所有的博客都有评论回复功能。那好吧,我就也给小站增加一个邮件回复的功能。

最快最方便的方法就是使用插件,这样的插件很多,就不在这里多说了,再说我也没有使用过,也不好评价那一个插件好用。本文介绍的是自己动手,添加一些代码实现邮件回复的功能。

wp_mail函数简介

不知道大家有没有注意过,在wordpress安装成功后,会向你的邮件中发送一封邮件。从这一点就可以看出worpress自带有发送邮件的功能。而且控制台里也可以设置当日志有新评论的时候邮件通知。就是从这里下手,我找到了这个wp_mail函数,它的功能就是发送邮件。该函数定义在wp-includes目录下的plaggable.php文件中,其原型为

wp_mail( $to, $subject, $message, $headers = '', $attachments = array() )

其中参数$to代表收件人,$subject是邮件主题。通过$header可以设置发件人信息,比如发件人名称、email地址(Name <email@address.com>)等,还可以设置邮件的文本格式,默认是text/plain,该格式不支持html格式。如果想使用html格式,就要设置为text/html。具体设置的方法是传递一个字符串,如

$headers = "from:Domety <ddbug@domety.com>\n content-type:text/html"

注意中间是以\n隔开。或者传递一个数组,如

$headers = array("from" => "Domety <ddbug@domety.com>","content-type" = "text/html" );

最后还可以通过$attachments参数来发送附件。

action : wp_insert_comment

有了发送邮件的函数,就可以说是万事具备,只欠东风了。我们需要准确的知道在什么时候要发送邮件,我觉得至少要符合以下条件:

  1. 在有人发表评论的时候,这时候wordpress会调用wp_insert_comment函数。
  2. 该评论不是直接对日志的评论,而是回复的另一个评论。也就是这个评论一定要有parent.
  3. 该评论是通过审核的评论。也就是说approved == 1
  4. 被回复的评论要有email地址。

wp_inset_comment函数为开发人员提供了一个叫做wp_insert_comment的action,通过它我们可以很方便的完成对以上条件的审查工作。我们首先定义一个 dm_notify_commentauthor($comment_id,$comment)函数,用来处理邮件通知用户。然后增加一个action

add_action('wp_insert_comment','dm_notify_commentauthor',10,2);

这样一来,当有用户回复另一个人的评论的时候,就会邮件通知另一个人。至此我们的全部工作就做完了。以下是完整代码,添加到functions.php文件中即可生效。

function dm_notify_commentauthor($comment_id,$comment) {
 if($comment->comment_approved != 1 || $comment->comment_type == 'trackback' || $comment->comment_type == 'pingback' || $comment->comment_parent == 0 )
  return $comment_id;
 $parent = get_comment($comment->comment_parent);
 if(empty($parent->comment_author_email))
  return $comment_id;
 $post = get_post($comment->comment_post_ID);
 $to = $parent->comment_author_email;
 $from_name = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);s;
 $from_email = "ddbug@domety.com";
 $mail_content_type = "text/html";
 $mail_headers = "from:$from_name <$from_email>\ncontent-type:$mail_content_type";
 $parent_name = empty($parent->comment_author) ?  '无名仕' : $parent->comment_author;
 $cur_name = empty($comment->comment_author) ?  '无名仕' : $comment->comment_author;
 $title = $cur_name.'回复了您在Domety.com的评论';

 $msg = '<p>'.$parent_name.',您好!</p>';
 $msg .= '您在<a href="'.get_permalink($post).'" style="text-decoration:none; color: #007EC4;">《'.$post->post_title.'》</a>的评论:';
 $msg .= '<p style="margin-left:50px; background:#fff;border:1px dashed #7C98B1;padding:10px 30px;">'.$parent->comment_content.'</p>';
 $msg .= '<p><a href="'.$comment->comment_author_url.'" style="text-decoration:none; color: #007EC4;">'.$cur_name.'</a>对您的回复:</p>';
 $msg .= '<p style="margin-left:50px; background:#fff;border:1px dashed #7C98B1;padding:10px 30px;">'.$comment->comment_content.'</p>';
 $msg .= '<p><a href='.get_comment_link($comment).' style="text-decoration:none; color: #007EC4;">点此查看原始回复内容</a></p>';
 $msg .= "<p style='font-weight:bold'>衷心的感谢您对 <a href='http://domety.com/' style='text-decoration:none; color: #007EC4;'>Domety</a> 的关注和支持,欢迎 <a href='http://feed.domety.com/' style='text-decoration:none; color: #007EC4;'>订阅本站</a>,以获取最新信息。</p>";
 $msg = '<div style="border:1px solid #7C98B1; background:#f1f1f1; padding:50px;font-size:16px;">'.$msg.'</div>';
 @wp_mail($to,$title,$msg,$mail_headers);
 return $comment_id;
}
add_action('wp_insert_comment','dm_notify_commentauthor',10,2);
添加评论

15 条评论

  1. 1 F

    路大侠

    2010-04-20 星期二 23:15

    来学习了~

    回复
  2. 2 F

    友情链接

    2010-04-20 星期二 23:38

    感觉很复杂的

    回复
  3. 3 F

    SKYOY

    2010-04-21 星期三 19:19

    这个貌似要开启嵌套评论哦? 如果是Mail to Commenter的非插件版本就好了。

    回复
    • DDBug

      2010-04-21 星期三 19:53

      多谢提醒,等我测试一下是否需要开启嵌套评论。

      回复
  4. 4 F

    ifenwen

    2010-05-06 星期四 10:28

    还是能用插件就好了~~~~

    回复
  5. 5 F

    2010-05-25 星期二 11:03

    这个大师也有介绍http://kan.willin.org/?p=1295&cpage=3#comments

    回复
  6. 6 F

    某人

    2010-05-27 星期四 15:32

    有插件可以做啊

    回复
  7. 7 F

    lveyo

    2010-07-06 星期二 14:12

    看起来确实挺复杂的

    回复
  8. 8 F

    merror

    2010-07-18 星期天 18:17

    有空试试
    我上次用插件 不过貌似没用

    回复
  9. 9 F

    iwobz

    2010-08-15 星期天 20:15

    你这个代码加在文件中的哪个位置啊

    回复
  10. 10 F

    iwobz

    2010-08-15 星期天 21:37

    你这个中文有乱码呀,在邮件里显示不出来

    回复
  11. 11 F

    Mercury

    2010-08-18 星期三 13:43

    o o# 我竟然没有plaggable.php这个文件~ 3.0.1版本的~ 奇怪

    回复
  12. 12 F

    晨光博客

    2011-01-28 星期五 00:08

    看得不是很懂!

    回复
  13. 13 F

    番茄

    2011-03-15 星期二 00:02

    这个方法看来还的试试看了,代码好多哦。

    回复
  14. 14 F

    番茄

    2011-05-06 星期五 22:32

    我安装过这种代码,但没实现这种功能,安装了相关插件也没成功,真不晓得那种插件才适合我的博客。

    回复

添加评论