八月
13

【原理指导篇】无时不在的评论 侧边栏即时回复功能

在上一篇Ajax版即时侧边栏评论回复功能》中我简单介绍了我最新给博客加入的一个功能,那就是在侧边栏能够即时回复评论。我现在就说一下我的这个功能的一些关键点及相关原理。

1.在评论下插入“回复”按钮

这个当然是能够直接从后台输出页面时加上最好了。就拿现在最流行的那个带头像最新评论来说,可以在foreach循环输出部分的加入回复按钮。这个按钮包含的动作处理就用“onclick”,所以要在此添加

   1: <a id="rc_comment-reply-link" href="javascript:void(0)" onclick="rc_reply(arg1,arg2(,...))">回复</a>

调用函数rc_reply()中我们要传递进去一些需要的参数,那么需要什么呢?因为点击回复按钮后我们是要在此插入评论的表单,而wordpress的发表评论表单包含用户名(author)、邮箱(email)、网址(url)和评论框(comment),但是除此之外,其实还有两个参数,他们是隐藏的input,分别是评论所在页面ID(comment_post_ID)和嵌套时父级评论ID(comment_parent)。这两个参数是必不可少的,author email url则不是必须的,如要你要实现自动填入cookie中访客相关信息,则可以将这三个也当做参数传递。所以,完整的回复按钮如下

   1: <;a id="rc_comment-reply-link" href="javascript:void(0)" onclick="rc_reply('<?php $comment->comment_ID ?>', '<?php $comment->comment_post_ID ?>')">回复</a>

 

2.点击回复后在评论下插入评论表单

这个表单插入到页面上你有两种选择,一是预先在页面上输出一个完整的评论表单,如在footer.php处,注意要在<body>标签闭合前,然后设置display:none,使之在页面上隐藏。二是直接将表单以串形式赋值到一个js变量,点击回复后直接在页面中插入。这两种方法各有各的好,我是使用第二种,这种方法·较第一种更好接受参数。

一个完整的大致的表单如下:

   1: <div id="rc_respond">
   2:     <form id="rc_commentform" method="post" action="http://你的域名/wp-comments-post.php"><!--你的域名最好手写上去如果使用第一种方法则可以通过wp的the_bloginfo获取博客地址使用第二种方法则可用window.location.host等建议直接写上自己的博客地址-->
   3:         <p><input type="text" tabindex="1" size="22" value="" id="rc_author" name="author"><label for="author"><small>Name</small></label></p>
   4:         <p><input type="text" aria-required="true" tabindex="2" size="22" value="" id="rc_email" name="email"><label for="email"><small>Mail</small></label></p>
   5:         <p><input type="text" tabindex="3" size="22" value="'" id="rc_url" name="url"><label for="url"><small>Website</small></label></p>
   6:         <p><textarea tabindex="4" rows="5" cols="35" id="rc_comment" name="comment"></textarea></p>
   7:         <p><input type="submit" value="Submit" tabindex="5" id="rc_submit" name="submit">
   8:         <input type="hidden" id="rc_comment_post_ID" value="'" name="comment_post_ID">
   9:         <input type="hidden" value="" id="rc_comment_parent" name="comment_parent"></p>
  10:     </form>
  11: </div>

使用第种方法你就将这个表单所在的div#rc_respond加上style=”displaynone“。如果是使用第二种方法,则可以在js中将这个变成字符串形式交给一个变量。

3.相关JS处理部分

本来想要贴一段代码的,但是后来发现这段代码和具体的页面结构结合很深。由于大家的模板千变万化,所以直接贴出某一具体的代码很可能会误导一些人,所以我就说一下JS里需要处理的部分。首先是要将表单插入到正确的位置,如果你的表单预先输出在页面上,此时就可以使用结点操作将表单移动到需要的位置(如js的appendChild、insertBefore等,以及jQuery的一些结点操作);如果你的表单还是一窜字符串存在js变量里,则可用innerHTML方式写入到页面的位置上或者是jQuery的html()方法。当然,最重要的是向表单中的comment_post_ID和comment_parent=中填入相关参数,这两个参数值已经是作为函数的参数传递进来了,只需要将值填入即可。

4.解决嵌套问题

边栏的最新评论你并不知道是不是最后一层回复了,即使知道,我们也要想办法能够对其进行回复。如果不对嵌套做相关处理,如果是最后一层评论,你即使回复了,也是无效的,仍然会被当做主评论显示。所以我们要知道一条评论目前的所在层深。怎么取得呢?我们可以循环查询数据库中一条评论表中的commet_parent键值,如果不为0,则说明他有父级评论,则再去查询它的父级评论的comment_parent键值,依次循环。

   1: //这段代码依然是加在后台foreach循环中
   2: $comment_depth = 1;//层深初始化为1
   3: $tmp_c = $comment;$comment_parent
   4: while($tmp_c->;comment_parent != 0){//循环查询
   5:     $comment_depth++;
   6:     $tmp_c = get_comment($tmp_c->comment_parent);
   7: }
   8: //关键处,这里依然是用了父级ID替换方法,将对最后一层的回复替换为对倒数第二层的回复
   9: if($comment_depth <; get_option('thread_comments_depth'))
  10:     $comment_parent=$comment->;comment_ID;
  11: else $comment_parent=get_comment($comment->;comment_parent)->comment_ID;

然后你就可以用$comment_parent去替换第一步中的$comment->comment_ID。

做完以上四步,基本上边栏回复的雏形就完成了。当然,此时你回复后点击提交会跳转刷新页面,并不是ajax方式,其实这个也简单,你甚至可以照搬你文章评论处的ajax提交方式,只需改改相关id值即可。

OK,具体中有什么问题还可以留言询问,我尽量解决。

 边栏回复

本文标签: , , , ,

分享

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

这篇文章已经有 26 条评论

Comments (24) Trackbacks (2)
You can leave a response or Trackback this entry .
  1. liuqiqi -#1

    美美的沙发。。。 :grin:

  2. winy -#2

    板凳围观下

  3. Bee君 -#3

    太多折腾啦~~啊…..人生啊

  4. 流年 -#4

    人生啊

  5. MOPVHS -#5

    !!又分享出来了,3Q~~

  6. zwwooooo -#6

    太复杂鸟,折腾不来

  7. Page -#7

    哇哦 这是一个很不错的想法和实现

  8. 减肥药 -#8

    我勒个去!

  9. Alan -#9

    支持折腾

  10. 江流 -#10

    这个挺实用的 不过我不折腾了- -

  11. 超人 -#11

    这功能有点奢侈了。。 基本用不上啦~

    • QiQiBoY --#1

      @超人
      额。。我试用后觉得很方便的功能。。
      有了这个,我回复你这三条不在一个页面的评论,在侧边栏不用翻页就可以全部回复了。。

    • 超人 --#2

      @QiQiBoY
      哈哈。。你在ad

  12. earui -#12

    真不错····

  1. 【SimPaled篇】Introduce My Blog Theme For You

    [...] 边栏的最新评论支持翻页浏览、单条评论查看、即时ajax回复等功能。其中最新文章(recent post)部分支持more无限下滚查看。——注:边栏回复参考《无时不在的评论 侧边栏即时回复功能》 [...]

  2. 颠覆你的wordpress体验

    [...] 【原理指导篇】无时不在的评论 侧边栏即时回复功能 (24)这个表单插入到页面上你有两种选择,一是预先在页面上输出一个完整的评论表单,如在footer.php处,注意要在<body>标签闭合前,然后设置display:none,使之在页面上隐藏。二是直接… [...]

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: