在上一篇《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,具体中有什么问题还可以留言询问,我尽量解决。
