我曾在《完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>》中分享了我对wordpress中嵌套深度有限的应对解决办法。有同学注意到了我标题中的<一>,所以问我<二>何时出来。我回答说,没有二了,因为这个已经是完美的了,标题中的一是无意中加进去的。
但是,后来出现一个问题,让我不得不重新思考无限嵌套这一方式,从而也就有了本文——《完美无限嵌套<二>》。这个问题就是邮件回复问题。了解我实现无限嵌套原理的,应该的都知道其实在对最后一层进行回复时,是在变相的对倒数第二层进行回复。很多人可能在使用willin修改的邮件发送方式,即是通过hook到comment_post,获取新评论的父级评论ID,如果ID不为0,说明这是一条子评论,然后就将邮件发送给父级评论。父级评论的邮箱是来自get_comment()函数获取数据库查询。前面已经说了,对最后一层的回复是变相地对倒数第二层进行回复,所以此时邮件全部发送到倒数第二层那里去了。
我注意到上面的问题,来自于一次我在开发自己的ajax评论时对我在最后一层的评论进行回复测试时,结果zww跑来跟我说,收到一大堆我的邮件。我研究了一下,发现存在上述问题,在搁置了N天后,今天我终于解决了它。
这个问题的解决需要换个思路,不能还是局限于通过查询一条评论的父级ID来判断需不需要发送邮件。我注意到我的每条评论中都有@回复链接,而其中的href中就包含了被回复者的评论id,所以我就从这里着手,想通过获取评论中的存在的@回复来进行邮件发送。而且这种方式,你可以一次回复多个人,比如你想在一条评论里同时回复A、B、C三个人,你只需要依次点击A、B、C下面的reply按钮(如果不想让评论框出现在这三人任何一人下方,则点击一下取消回复,评论框会回到底部,这条回复会被当做一条主评论。但是,别担心,评论框内容不会清空,你的回复依然会通过邮件发送至这三人),然后书写回复内容即可。
主要代码如下:
1: function comment_mail_notify($comment_id) {
2: $comment = get_comment($comment_id);//根据id获取这条评论相关数据
3: $content = $comment->;comment_content;
4: //对评论内容进行匹配
5: $match_count=preg_match_all('/<;a href="#comment-([0-9]+)?" rel="nofollow">/si',$content,$matchs);
6: if($match_count>;0){//如果匹配到了
7: foreach($matchs[1] as $parent_id){//对每个子匹配都进行邮件发送操作
8: SimPaled_send_email($parent_id,$comment);
9: }
10: }elseif($comment->;comment_parent!='0'){//以防万一,有人故意删了@回复,还可以通过查找父级评论id来确定邮件发送对象
11: $parent_id=$comment->;comment_parent;
12: SimPaled_send_email($parent_id,$comment);
13: }else return;
14: }
15: add_action('comment_post', 'comment_mail_notify');
然后就是发送邮件的函数,简单给个思路
1: function SimPaled_send_email($parent_id,$comment){
2: $admin_email = get_bloginfo ('admin_email');//管理员邮箱
3: $parent_comment=get_comment($parent_id);//获取被回复人(或叫父级评论)相关信息
4: $author_email=$comment->;comment_author_email;//评论人邮箱
5: $to = trim($parent_comment->;comment_author_email);//被回复人邮箱
6: $spam_confirmed = $comment->;comment_approved;
7: if ($spam_confirmed != 'spam' &;& $to != $admin_email && $to != $author_email) {
8: ....//自由发挥
9: wp_mail( $to, $subject, $message, $headers );
10: }
11: }
至此,就完美解决了邮件发送混乱这一问题。你可以在我这里测试,你的任何回复都会准确无误的发送至你要回复的人。
需要注意的是,对评论内容进行匹配@回复相关内容时,你的@回复需要符合上面正则里的规则。我建议,在向评论框里添加@回复时,依照此格式
1: <;a href="comment-"$id>@XXX </a>
你不用画蛇添足去往里面添加什么rel=”nofollow”,因为wordpress会自动给评论里的链接添加这一属性。
然后,当然,只以上部分两段代码就完了吗?如果有人引用了另外一条带@回复的评论,是不是也应该先剥离<blockquote>标签内容里的内容呢?否则,被引用人所回复的那个人不是也会被发送一封邮件吗?这些不是本文内容,所以不在此讨论,仅作提醒。
转载注明本文地址,谢谢。