WordPress 嵌套回复构成原理
在上一篇文章 (WordPress 嵌套回复) 中, 我已经介绍了嵌套回复的利弊, 制作方法等等. 本文将简单说明嵌套回复构成的原理.
本文中提及的 4 个方法均来自 Walker_Comment 类, 该类继承自 Walker, 是构建嵌套回复的核心部分. 另外, WordPress 中的子页面和子分类也是使用 Walker 的子类来实现的. 如果你想对 WordPress 的嵌套同能了解更多, 可以查阅 WordPress Codex 中关于 Walker 类的说明.
打开 wp-includes/comment-template.php, 查找 Walker_Comment 类. 以下展开介绍这 4 个方法.
start_lvl
子菜单列表的开始标签, 默认是 <ul>, 在第一个子条目之前生成.
end_lvl
对应 start_lvl 的子菜单列表的结束标签, 默认是 </ul>, 在最后一个子条目之后生成.
start_el
条目的前半部分, 包括开始符号和评论内容. 开始符号是 <div> 或者 <li> (外层是 ol 或 ul 的情况下是 <li>); 评论内容就是评论的相关信息显示, WordPress 向我们提供了可即用的布局, 但也可以通过 callback 方法改变评论内容的结构. 调用回调函数的部分代码示意如下:
function start_el(&$output, $comment, $depth, $args) { $depth++; $GLOBALS['comment_depth'] = $depth; // 如果定义了回调函数, 则调用其回调函数, 并终止后面的处理. if ( !empty($args['callback']) ) { call_user_func($args['callback'], $comment, $args, $depth); return; } // 如果没有定义回调函数, 则执行本方法中后面的处理, 生成默认的评论布局. ... }
我们所谓的自定义嵌套回复, 就是创建一个 callback 方法, 并在 wp_list_comments 方法中调用这个它生成自定义的评论结构. 也可以认为是定义一个新的方法, 取代 start_el 方法内部的默认布局.
end_el
条目的后半部分, 其实就一个结束符号. 这里也提供一个名为 end-callback 的回调方法, 原理和 start_el 一样, 是一个自定义的处理方式. 但是 end-callback 并不常用, 因为 end_el 只生成一个简单的结束符号, 实在没必要为此再定义一个方法.
我觉得只有在需要复杂的评论结构时, 才有必要用到 end-callback. 如: 要在评论的上方和下方都添加背景图效果, 评论框内可能需要多一个 DIV 层, 则可能用上 end-callback. 在 callback 方法中以 <div class="comment"><div class="inner"> 作为开始, 而 end-callback 中以 </div></div> 结束掉.
例子
下面我将以一个嵌套回复的例子来证明上述内容.
现有评论嵌套结构如下:
comment (1)
comment (1.1)
comment (1.2)
comment (1.2.1)
comment (2)
依照上述方法, 执行顺序如下:
start_el (1)
start_lvl (1)
start_el (1.1)
end_el (1.1)
start_el (1.2)
start_lvl (1.2)
start_el (1.2.1)
end_el (1.2.1)
end_lvl (1.2)
end_el (1.2)
end_lvl (1)
end_el (1)
start_el (2)
end_el (2)
假设方法配置都是默认的, 则:
start_lvl 为 <ul>
end_lvl 为 </ul>
start_el 为 <li> 和内容部分
end_el 为 </li>
又设 "..." 为评论内容, 则代码生成如下:
<li> ... (1) <ul> <li> ... (1.1) </li> <li> ... (1.2) <ul> <li> ... (1.2.1) </li> </ul> </li> </ul> </li> <li> ... (2) </li>
原来来到了‘inove’经典主题作者博客,必须顶!
学习了
看完觉得很有帮助谢谢!!
@吖Bee
我也是主题帮了我..
@chao
我也发现是这样的.恭喜恭喜!!
看完上一篇来看下一篇
很有收获 什么时候能个micolog写个评论插件呀 这个插件实现的话能存js吗
“August 3rd, 2009 at 17:28 | #1”确实如此quick comments插件的一下小缺陷,需要刷新页面才能显示正常,有没有谁解决了这个小问题?
测试一下评论序号为#1的问题。。。
@mg12
有啥问题呢? 为师兄效劳是应该的
@Jutoy
如果像我这样, 用 @reply 又分页, 其实体验并不是很好.
@吖Bee
哈哈~ 合适就好.
@bolo
学 吖Bee, 跟主题走, 啥都不想.
@chao
WOW, 我用过这个杀毒软件.
我把鲜果, 有道, 捉虾带到了国外, 它们应该考虑发展海外市场, 更应该资助我一下. 哈哈~
@Calcifer
咱们合作做个英文站吧. 有兴趣不?
@bolo
因为他们没找我修改.
@dust2k
iNove 不支持嵌套回复, @reply 倒是一直都支持.
这个嵌套回复的应用已经放入Inove模板了吗??? 嵌套很好,但如果CSS控制的不好就会显得很乱。。两难啊。。
我也成功了,多谢。
@Calcifer
真的啊,而且模板改得很难看
@chao
居然是真的…… mg12神了……
真的假的…… 赶快去观望下……
慢慢学习ing...
博客更新得不错也。今天我又到你的博客一读,望回访。握手。
@chao
哈哈~~mg12强大
今天无意间发现avast(来自捷克的一款杀毒软件)的官方博客用的你模板了。
恭喜了。
果然够深奥
@Jutoy
恩 如果回复数多 就要找半天了
@bolo
于是我得令找出路了..
@LeaFly
成功了,感谢~
汗。。。最后那段代码也太抽象了,像在话字符画
@LeaFly
wp-syntax
请问mg12, 你用的什么"代码->语法高亮HTML"工具?
请问mg12,你是用什么"代码->含高亮的HTML"工具?
正在为新主题使用哪一种回复方式而头疼,希望能发现一个良好的启示
很详细的分析
个人对嵌套回复是又爱又恨~
各有利弊啦!
青菜蘿蔔各有各的好!
~有时候喜欢嵌套回复,有时又不喜欢....最后还是主题帮我决定了~~
很不喜欢嵌套回复。
始终觉得嵌套的层数是一个很大限制因素,@回复也未必不是一个趋势。
尤其是像iNove这样的形式…
@风残梦
@LeaFly 正解!
@LeaFly
这不是 bug, 是为了防止有人用嵌套回复把编号打乱了. 我是没有用嵌套, 所以改了一下. 现在没有两全其美的方法.
突然发现一个问题, 刚评论完无论是第几个在评论时间右边都是#1, 刷新以后就对了
@风残梦
在主题的single.php里加,拿FireBug看一下NeoEase就明白了
趁着楼高提个问题(像在刷评论……)
声明: 本站遵循 署名-非商业性使用-相同方式共享 3.0 共享协议. 转载请注明转自 NeoEase
这个是怎么加到网站上的?先表示感谢~
我那个激动啊……
第一次抢到沙发
感谢mg12的inove~
一会慢慢研究文章……
会不会沙发?