八月
23

完美解决wordpress无限嵌套<二> 【邮件发送相关问题】

我曾在《完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>》中分享了我对wordpress中嵌套深度有限的应对解决办法。有同学注意到了我标题中的<一>,所以问我<二>何时出来。我回答说,没有二了,因为这个已经是完美的了,标题中的一是无意中加进去的。

但是,后来出现一个问题,让我不得不重新思考无限嵌套这一方式,从而也就有了本文——《完美无限嵌套<二>》。这个问题就是邮件回复问题。了解我实现无限嵌套原理的,应该的都知道其实在对最后一层进行回复时,是在变相的对倒数第二层进行回复。很多人可能在使用willin修改的邮件发送方式,即是通过hookcomment_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>标签内容里的内容呢?否则,被引用人所回复的那个人不是也会被发送一封邮件吗?这些不是本文内容,所以不在此讨论,仅作提醒。


转载注明本文地址,谢谢

本文标签: , , , , ,

分享

本文短网址: http://qiqi.boy.im/7n

这篇文章已经有 84 条评论

Comments (81) Trackbacks (3)
You can leave a response or Trackback this entry .
  1. Bubuto -#21

    偶是来学习的,你这里可真漂亮

  2. david -#22

    怎么看起来有点乱啊。。
    我觉得我博客上的那个嵌套还比较清淅呀。。嘿嘿。。

  3. winy -#23

    我嵌套999层,不会乱吧,懒得改了,没有多重@不会乱

    • QiQiBoY --#1

      @winy
      嵌套100层也能正确发送。。。 :grin:

    • winy --#2

      @QiQiBoY
      没说清楚,我的意思是如果嵌套层数足够深,就不会出现

      变相地对倒数第二层进行回复,所以此时邮件全部发送到倒数第二层那里去了。

      这种情况了,是不是?

    • QiQiBoY --#3

      @winy
      嵌套层数足够深,就不会出现邮件发送混乱问题。你的不用改了。

      变相地对倒数第二层进行回复,所以此时邮件全部发送到倒数第二层那里去了。

      这句在我这里是指如果你对第五层进行回复,其实是在对第四层进行回复,所以如果使用wilin原来的邮件回复,就会发送到第四层那个人那里去了。

    • QiQiBoY --#4

      @winy
      我是说嵌套1000层也能发送。。。
      没有使用我的那个无限嵌套方法,而是通过修改wordpress嵌套层数来达到无限嵌套的,就没必要用我这个邮件发送了,因为每条回复总有一个唯一的父级评论。

    • winy --#5

      @QiQiBoY
      就是这个意思 :lol:

  4. zwwooooo -#24

    折腾了,文章代码有个小错误,第3行代码:$content=comment->comment_content;少了$

  5. wisfern -#25

    正好是我要的功能,有时间再回头研究。

  1. 安装VnstatVPS流量监控与伪无限嵌套

    [...] > 完美解决WordPress嵌套回复的层深问题 – http://www.qiqiboy.com/2010/07/07/erfe…s.html > 完美解决wordpress无限嵌套 – http://www.qiqiboy.com/2010/08/23/perfect-solut..ted-2.html [...]

  2. WordPress打造无限嵌套评论

    [...] @QiQiboy:《完美解决wordpress无限嵌套<二> 【邮件发送相关问题】》 [...]

  3. 杜小白之家

    [...] 《完美解决wordpress无限嵌套 【邮件发送相关问题】》 [...]

Leave a Reply

Hi , say something.

  • :?:
  • :razz:
  • :sad:
  • :evil:
  • :!:
  • :smile:
  • :oops:
  • :grin:
  • :eek:
  • :shock:
  • :???:
  • :cool:
  • :lol:
  • :mad:
  • :twisted:
  • :roll:
  • :wink:
  • :idea:
  • :arrow:
  • :neutral:
  • :cry:
  • :mrgreen: