八月
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. liuqiqi -#1

    唉,美美的沙发。。。 :cry:

  2. 小闇 -#2

    板凳

  3. 小闇 -#3

    乾脆來個地板好了 :cry:

  4. Bee君 -#4

    面对着技术文,我一般都不知道说什么 = =

    • QiQiBoY --#1

      @Bee君
      额。。。。可以这么,看不懂也要对作者说,你这位文章太棒啦。。。 :grin:

  5. Max -#5

    我使用邮件回复插件,应该没有问题。

  6. Alan -#6

    个人觉得嵌套太多好烦

  7. mice -#7

    还真没碰到这种情况 :mrgreen:

    • QiQiBoY --#1

      @mice
      你的嵌套是使用插件的吧。。。有没这个问题你可以测试一下

  8. 江流 -#8

    多重嵌套

  9. 超人 -#9

    太技术了。。完全看不懂了~~悲哀

  10. MOPVHS -#10

    你这位文章太棒啦。。。 :arrow:

  11. ZH CEXO -#11

    无限嵌套还是很牛X的,哈哈

  12. IM路人 -#12

    无线套是不理论的,到最后个套不是宽度不够了?

    • QiQiBoY --#1

      @IM路人
      无限嵌套是相对于wordpress的默认嵌套来说的。
      wordpress的默认嵌套只能最大嵌套10层,然后就不能继续嵌套了,我的方法可以使继续对最后一层进行回复,无限的嵌套回复下去。最后的宽度够不够你按我说的方法去试试就知道够不够了。

    • IM路人 --#2

      @QiQiBoY
      恩,了解了

  13. 赵宏 -#13

    你好,请问你用的是什么主题?

    • QiQiBoY --#1

      @赵宏
      你二B呀。。
      (心情不好,放个spam出来骂两句放松一下 :roll: )

    • winy --#2

      @QiQiBoY
      :shock: 真看不出是spam

    • QiQiBoY --#3

      @winy
      你点击它的头像看看浏览器头信息记录,只有浏览器,没有操作系统记录。。。
      。。其实它说的话早就是spam们用臭了的话,主题信息就在底部写着,是个正常人都应该会看到。

    • winy --#4

      @QiQiBoY
      我要用手机回复,一样看不见OS,因为数据库里没有windows mobile ,这种spam倒没遇到过

    • QiQiBoY --#5

      @winy
      如果不是山寨机,使用自带的手机浏览器都是可以检测到的。
      这条spam是akismet拦截的,再说它的浏览器是IE6,手机上怎么会有IE6?手机也是看不到我的这个主题的,手机浏览的是wap版

    • winy --#6

      @QiQiBoY
      是说spam没错,手机能检测那倒未必,我在木木那里用手机留言就没监测到 :grin: 再说手机上有opera mobile和苹果的safari,能看全版的主题

    • QiQiBoY --#7

      @winy
      在我这里如果不伪装,所有手机浏览器都会被转到wap版,虽然底部有查看完整版的链接,但是由于我的页面都是ajax装载,所以即使进入完整版,由于wap版手机主题没有ajax响应,会造成ajax请求回来的数据都是wap版的页面,导致页面变形、错位、无法浏览。。。
      安卓、ios、黑莓就不说了,这个是肯定能检测的。至少我知道挪鸡鸭的s60自带浏览器可以正常检测出手机操作系统和浏览器。

  14. zwwooooo -#14

    我用的是mail to commenter这个插件,貌似不用折腾也ok

  15. 小邪 -#15

    。。。。。。一直没注意原来willin的那个函数不能回复多人哇 ~ ╮( ̄▽ ̄)╭

  16. QiQiBoY -#16

    @winy

    winy :@zwwooooo
    @QiQiBoY
    @小邪
    这才叫测试~~

    我猜我的这条回复只有你能收到!! :grin:

  17. 小闇 -#17

    SF

  18. Page -#18

    无限嵌套是永恒的话题阿

  19. Firm -#19

    真正的大师呀

  20. 学夫子 -#20

    感觉这个嵌套回复也不是很好看啊,感觉好乱
    我也期望emlog的官方能够出来嵌套回复

  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: