七月
07

完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>

关于WordPress的评论样式有两种:@悬浮和嵌套回复。

deep然而嵌套回复有一个问题,那就是嵌套的深度不可能无限嵌套下去,因为一般我们为了表现嵌套的视觉样式而选择让子回复向后缩进一段距离,所以随着嵌套深度的增大,子回复的宽度也就越来越小。

如右边图片所示,设置的深度过大的话,会造成最后这样的结果。

然而如果设置的允许嵌套深度太小,则会影响访客之间、访客与博主之间的交流,因为往往因为嵌套的深度到了就不能再继续回复了。

当然,嵌套深度的问题也有解决办法,一种就是jQuery方法:

 

很久以前看到过此篇文章《JQuery为WordPress的嵌套回复添加@reply功能》,文中所讲方法也很简单,就是利用jQuery的 克隆功能(clone())将最后一层的父级评论的回复按钮给copy到最后一层。这样一来,最后一层也会有回复按钮了,但是你点击此按钮,实际上是对倒数倒数第二层评论的回复。所有这些评论都会平级的嵌套在此父级评论下方。即对最后一层的回复都显示在最后一层的下方(不是嵌套,在同一级)。

利用此方法,你可以设置一个较小的嵌套深度,比如只允许嵌套两层,这样一来对第二层评论的回复其实都是对第一层的回复,因为第二层回复的按钮是从父级一层(第一层)克隆过来的。,所以就会顺序排列在第一层回复下方了。如下图效果:

1

但是这个方法也有一个问题,那就是当我点击克隆过来的恢复按钮时,回复框(评论框)并不是在我点击的评论下方,而是都跑到父一级评论下方,比如我要回复上面图片中的Nomessi,我点击他右边的回复按钮,按理说回复框应该在Nomessi下方,但是实际上却会跑到阿修的下方,这样就会造成误扰。如下图:22

为什么会这样呢?

我们看一下回复按钮这个对象的HTML代码:

<a onclick="return addComment.moveForm(&quot;comment-10515&quot;, &quot;10515&quot;, &quot;respond&quot;, &quot;1099&quot;)"
 
href="/wordpress/add-reply-function-in-wordpress-thread-comment-with-jquery.html?replytocom=10515#respond" class="comment-reply-link"
 
rel="nofollow" target="_blank">回复</a>

所以当点击回复按钮时就会调用addComment.moveForm这个JavaScript函数,他有四个参数,分别是

comment-Id:要回复的评论对象所在div的id值
 
id:要回复的评论的编号id
 
'respond':固定值
 
'post-id':即当前评论所属的文章的编号id
 

评论框在哪个位置,是看第一个参数,即要回复的评论的html的ID参数值,我们利用jQuery从父一级克隆过来按钮,所以此值还是父级评论的ID值,所以当点击恢复按钮时,评论框就会跑到父级下方了。

而如果能将此参数改成真正要回复的评论的ID,就可解决评论框跑偏的问题了。利用jQuery,这个一点也不难。

但是,第二个参数一定要是父级评论的ID,这个是设置回复的评论跟在哪一级评论下方的。我们的回复都是要跟在父级下方,所以不能搞错。

至此,这个用jQuery的方法也可以用jQuery给解决了。

但是这个方法需要jQuery,大家都知道,这玩意100来KB呢,并不是每个人都喜欢jQuery,并不是所有的平台都能处理jQuery那么大的函数库,例如一些手机浏览器,对载入jQuery的网页解析尤其费力。我知道的是挪鸡鸭的S60系统自带的浏览器就无法处理jQuery(JavaScript可以)。

所以,解决嵌套深度的问题还有一种方法。此方法是我在制作新主题时无意间想到的,不知道有没有同学想到类似的。这个方法适用于回调自定义评论函数的主题。

此方法无需任何脚本js支持。

一般的评论回调函数,回复按钮都是利用默认函数

<?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
 

生成的。

但其实通过上面我们查看实际生成的HTML代码,它就是调用了一个js函数,所以我们可以直接将HTML代码写过来。

<?php if ($depth == get_option('thread_comments_depth')) : ?>    <!-- 评论深度等于设置的最大深度 -->
 
<!-- 将第二个参数改为父一级评论的id -->
 
    <a onclick="return addComment.moveForm( 'comment-<?php comment_ID() ?>','<?php echo $comment->comment_parent; ?>', 'respond','<?php echo $comment->comment_post_ID; ?>'" href="#comment-<?php comment_ID() ?>" class="comment-reply-link">回复</a>
 
<?php else: ?>
 
<!-- 正常情况 -->
 
    <a onclick="return addComment.moveForm( 'comment-<?php comment_ID() ?>','<?php comment_ID() ?>', 'respond','<?php echo $comment->comment_post_ID; ?>'" href="#comment-<?php comment_ID() ?>" class="comment-reply-link >回复</a>
 
<?php endif; ?>
 
 
 

用这个代码替换默认的代码即可。这样就从根本上解决了嵌套的问题。效果如下,天蓝色线条就是最后一层回复了,对最后一层的评论回复,评论框正常出现在对应评论下方。111

这篇文章写太长咯,关于这段代码的解释等新主题上线后再写。还有如何评论框添加@XXX、评论添加引用quote按钮等。都是有关JavaScript的,非jQuery。

上面那张图是我的最新主题的评论样式,可以看到有回复,有引用,有自动添加@XXX等,都是原生js实现的。

本文标签: , , , , ,

分享

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

这篇文章已经有 81 条评论

Comments (72) Trackbacks (9)
You can leave a response or Trackback this entry .
  1. winy -#1

    终于更新了,沙发了再看。
    BTW:你是PKU的?

  2. winy -#2

    这个方法不错,我也拿去放新主题里。
    另外,虽然原声js效率更高,但主题里面用了jQuery,还是希望博主能顺便写个jQuery的。
    对于我们这种小白来讲还是比原生JS容易 :razz:

  3. 阿邙 -#3

    这个方法好 试试去。 我昨天写的还是改的wp源文件实现的

    • winy --#1

      @ 阿邙 : 他这个和你的还不一样,其实只嵌套了两层

    • 阿邙 --#2

      @ winy : 已经试过发现了. 估计css设定下就能用 不过懒得改了 等蛋疼了再试

    • QiQiBoY --#3

      @ winy : 我文中举的列子是jinwen的博客,他的只是嵌套了两层,其实我这个方法支持无限级嵌套。。比如最后我展示的我的新主题的嵌套,就是五层嵌套

    • 万戈 --#4

      @ 阿邙 : 你们两个方法的结果也不完全一样,各有优点,各取所需

    • QiQiBoY --#5

      @ 万戈 : 我和 阿邙 的方法最后效果都是评论框不会跑偏。。。比纯jQuery人性化些。。

    • QiQiBoY --#6

      @ 阿邙 : 呵呵,没想到大家都写了相同目的的文章。。。
      我去看了你的,你的其实是通过css实现的,并需要改WordPress源文件,我这个直接通过评论回调函数实现,不需要改动css、 JavaScript等内容,原生实现无限嵌套。
      总之各取所需吧。。。哈哈

    • 阿邙 --#7

      @ QiQiBoY : 其实无限嵌套用到的时候并不多 但是为了免得聊的正酣的时候没回复连接而尴尬 还是折腾了

    • QiQiBoY --#8

      @ 阿邙 : 呵呵,没错,正是因为用的少才不想为了这个去添加那么大的一个jQuery库。。。
      原生的,才是好的。。 :grin:

    • brhum --#9

      @阿邙
      测试嵌套~

  4. 丕子 -#4

    刚在某个人看到也写了这个

  5. 小邪 -#5

    。。。JQ帝 !! 太厉害了 ~

    • QiQiBoY --#1

      @ 小邪 : 小邪,你好久不出现,一出现就湿了我一下。。。。。我这篇文章根本没出现jQuery代码呐。。。哈哈 :grin:

    • 小邪 --#2

      @ QiQiBoY : 呵呵,不是说代码啦,你不是在文章中说了原理嘛,什么 clone() 的东东 ~
      。。。为神马我现在还是有 js 恐惧症,杯具 ~

  6. zwwooooo -#6

    js帝!你解决了我一直不满意的地方,而且是js原生的。抽时间折腾一下。

    要是ajax评论提交也能用js解决多好啊

    • QiQiBoY --#1

      @ zwwooooo : Ajax评论这个当然也是可以用原生js实现的,jQuery只不过是JavaScript的一个框架。。。。只不过这个复杂些,要高手来写,否则不一定会比jQuery的方法更好,效率更高。。。。暑假了我试着写来看看。。

  7. Dianso -#7

    wp后台直接开启了就没管过,最高是10层吧

  8. 秦大少 -#8

    讲的很详细,一定要支持! :grin:

  9. A.shun -#9

    呀么你的博客主题换了,很赞啊,比以前清爽。还搞个似模似样的bing搜索框 :roll:

    我用的无限嵌套就是jinwen和zww折腾的,的确是存在你说的问题。

    • QiQiBoY --#1

      @A.shun
      bing搜索是因为我还没来得及修改搜索按钮的那个图片呢。。。现在的是从bing弄来的。。
      目前大家用的jQuery方法都存在这个问题。。我马上会给出解决了这个问题的jQuery方法

  10. 阿修 -#10

    看到一个很熟悉的名字!~

  11. zwwooooo -#11

    囧~由于你的代码错误,我折腾了好久才搞定,正确的应该是
    <?php if ($depth == get_option(‘thread_comments_depth’)) : ?>
    <!– 将第二个参数改为父一级评论的id –>
    <a onclick=”return addComment.moveForm( ‘comment-<?php comment_ID() ?>’,'<?php echo $comment->comment_parent; ?>’, ‘respond’,'<?php echo $comment->comment_post_ID; ?>’ )” href=”?replytocom=<?php comment_ID() ?>#respond” class=”comment-reply-link” rel=”nofollow”>回复</a>
    <?php else: ?>
    <!– 正常情况 –>
    <a onclick=”return addComment.moveForm( ‘comment-<?php comment_ID() ?>’,'<?php comment_ID() ?>’, ‘respond’,'<?php echo $comment->comment_post_ID; ?>’ ) ” href=”?replytocom=<?php comment_ID() ?>#respond” class=”comment-reply-link” rel=”nofollow”>回复</a>
    <?php endif; ?>

    • QiQiBoY --#1

      @zwwooooo
      哪一点错了,跟我说下,我去改过来。。。
      其实文章里的代码跟我用的不一样。为了照顾大多数人,我又修改了之后才贴的,可能哪里搞错了。。哈哈,难为大家了。。。 :grin:

    • zwwooooo --#2

      @QiQiBoY
      你的代码里有target=”_blank”,href是文章地址,点击后立即弹出新标签页

    • QiQiBoY --#3

      @zwwooooo
      啊,对,确实,没发现。。这几天盯代码太久了。。

    • zwwooooo --#4

      @QiQiBoY
      我不太明白reply的链接地址,我试了你这样的…/comment-page-1#comment-2997和我那样的都一样可以工作,哈

    • QiQiBoY --#5

      @zwwooooo
      恩,我将链接改成了个纯锚点链接,纯粹就为了定位评论框,而默认的还传递有值replytocom,是为了万一浏览器不支持JavaScript,点击回复后,页面就会刷新,通过传递的replytocom=< ?php comment_ID() ?>值来定位评论框在页面的位置。。。

      所以说还是默认的好。。。不用改成我的,我的改成那样是因为onclick只能触发一个函数,我的还需要有@回复功能,所以需要通过一个函数去调用其它函数,这样这个函数就不能有返回值,所以不能加return,但这样一来点击回复就会刷新页面,所以我改成了我用的这样。。 :grin:

    • zwwooooo --#6

      @QiQiBoY
      原来如此。 :smile:

    • creolophis --#7

      @zwwooooo
      第6层嵌套…

    • QiQiBoY --#8

      @zwwooooo
      貌似我就看到代码中 href 里不一样,因为onclick后面有个return,其实就是终止后面的执行。。所以href我给改了。。。你可以去掉return试试,会发现每次点击不同的评论回复,浏览器都要刷新一下。。。我讨厌刷新,所以就改了。。 :???:

    • zwwooooo --#9

      @QiQiBoY
      代码我收了 :grin: ,明天写篇文章说一下,解决最近文囧问题 :roll:

  12. BoKeam -#12

    代码看不大懂,但我可以试 :eek:

  13. 海天 -#13

    貌似willin大师的 嵌套回复 早就是这样的啊
    不过你这个样式真的很好看的

    • QiQiBoY --#1

      @海天
      哦?他有弄过无限嵌套回复吗?给个地址我去拜读一下……记忆中貌似他就弄过AJAX评论回复吧

  14. 园子 -#14

    说是楼层太高的话也比较邪恶。

  15. sky -#15

    高手啊

  16. 林木木 -#16

    class="comment-reply-link >回复</a>
    中少了一个”

  17. snowxh -#17

    omment-reply-link 第二个少了个引号- -
    ps..是直接替换就可以了么 为什么我那样做了之后评论框索性不上来了。。

    • QiQiBoY --#1

      @snowxh
      是直接替换就可以了。。。。你是用wordpress的原生嵌套吗?如果原生的嵌套不应该发生这种情况的呀。。。。有没有js报错。。?

  18. zigbee -#18

    最近评论增多遇到这个问题了,wordpress默认10层。

  19. mice -#19

    我是来看嵌套的..

  20. wisfern -#20

    发现此网站有好多东西可以学,先作个记号。

  1. WordPress嵌套评论之无限嵌套之补遗

    [...] + atname + "</a>").focus(); });后记:还可以使用qiqiboy童鞋的方法:完美解决WordPress嵌套回复的层深问题(无限嵌套) 近两天发现我的友情链接页面获取的favicon好多都失败了: [...]

  2. 添加引用按钮——轻松打造属于你的WordPress引用回复功能

    [...] 添加引用按钮——轻松打造属于你的WordPress引用回复功能 15:33 | Categories: WordPress No comments still Leave a comment 之前的《完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>》这篇文章中我讲了自己关于实现WordPress无限嵌套的一个思路。今天又有同学询问引用功能是如何实现的,我就简单说一下,有能力的同学可以折腾试试。 [...]

  3. 【效果测试展示篇】Ajax版即时侧边栏评论回复功能

    [...] 在页面上插入表单很容易,要注意的一点是要阻止表单提交默认行为,开发过表单提交前验证的应该都知道怎么做。有困难的一点是评论嵌套,因为嵌套的深度有深度,而在边栏显示的评论你并不知道它是不是最后一层了,如果你对嵌套的最后一层评论回复了,那么这条新评论就会被当做主评论显示。我之前写过《完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>》,看过的应该都知道,我是通过修改js调用脚本中传递的父级评论id值来使回复最后一层的评论在实际上嵌套到倒数第二层,这样就变相的实现了无限嵌套。 [...]

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

    [...] 评论支持无限级嵌套,评论引用、回复功能。——注:无限嵌套参考《完美解决WordPress嵌套回复的层深问题(无限嵌套)》,引用功能参考《添加引用按钮——轻松打造属于你的WordPress引用回复功能》 [...]

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

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

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

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

  7. Hello WordPress!

    [...] 2010.07 我开始爆发了,我折腾了很多,首先是wordpress无限嵌套的完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>,还有如何通过JS自动处理文中的图片宽高,这个方法我一直在用哦:我是如何处理文章中图片的。想知道我评论框的那么多功能从哪里来的么,你看完这些你也能拥有和我评论框一样强大的功能了:评论框的简单计数器(无需改动模板,附带输入字数限制功能),添加引用按钮——轻松打造属于你的WordPress引用回复功能、为评论框添加文字格式化编辑器、【多彩的评论】:让评论可以插入图片,更改文字大小、颜色、让你的评论框自由粘贴代码、修正关于Ajax comments的一个小问题。还有关于如何创建邮件表单页面的创建一个可设置cookie相关信息的内置Email联系表单;如果你也想要知道wordpress不同页面显示不同的评论数以及楼层的显示,那么这篇文章也许会给你帮助wordpress指定页面评论数+支持分页的楼层显示 [...]

  8. WordPress打造无限嵌套评论

    [...] @QiQiboy:《完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>》 [...]

  9. 杜小白之家

    [...] 《完美解决WordPress嵌套回复的层深问题(无限嵌套)》 《完美解决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: