WordPress 嵌套回复构成原理

Jul 21st, 2009 Add Comment

在上一篇文章 (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>
声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 嵌套回复构成原理

  1. http://0.gravatar.com/avatar/88704a29f61ed07923707cae3ac06cfa?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    原来来到了‘inove’经典主题作者博客,必须顶!

  2. http://0.gravatar.com/avatar/0d9220121feeb1cdbdad3d2013f8aae6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    学习了

  3. http://0.gravatar.com/avatar/0ab54073cd22c0bea8f88d7ce9c7f8d3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    看完觉得很有帮助谢谢!!

  4. http://0.gravatar.com/avatar/0ab54073cd22c0bea8f88d7ce9c7f8d3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @吖Bee
    我也是主题帮了我..

  5. http://0.gravatar.com/avatar/0ab54073cd22c0bea8f88d7ce9c7f8d3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @chao
    我也发现是这样的.恭喜恭喜!!

  6. http://0.gravatar.com/avatar/0184be6025088ca575f080f23ad6b544?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    看完上一篇来看下一篇

  7. http://0.gravatar.com/avatar/4dfbd693401458acb2f672f2c811fbc3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很有收获 什么时候能个micolog写个评论插件呀 这个插件实现的话能存js吗

  8. http://0.gravatar.com/avatar/e8b0a7282954426791afd33fed9118de?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    “August 3rd, 2009 at 17:28 | #1”确实如此quick comments插件的一下小缺陷,需要刷新页面才能显示正常,有没有谁解决了这个小问题? :grin:

  9. http://0.gravatar.com/avatar/e8b0a7282954426791afd33fed9118de?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    测试一下评论序号为#1的问题。。。 :evil:

  10. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @mg12
    有啥问题呢? 为师兄效劳是应该的 :mrgreen:

  11. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Jutoy
    如果像我这样, 用 @reply 又分页, 其实体验并不是很好.

    @吖Bee
    哈哈~ 合适就好.

    @bolo
    学 吖Bee, 跟主题走, 啥都不想.

    @chao
    WOW, 我用过这个杀毒软件.
    我把鲜果, 有道, 捉虾带到了国外, 它们应该考虑发展海外市场, 更应该资助我一下. 哈哈~

    @Calcifer
    咱们合作做个英文站吧. 有兴趣不?

    @bolo
    因为他们没找我修改. :P

    @dust2k
    iNove 不支持嵌套回复, @reply 倒是一直都支持.

  12. http://0.gravatar.com/avatar/a2d74a6c3b2fc761e99fbc0354022fdb?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个嵌套回复的应用已经放入Inove模板了吗??? 嵌套很好,但如果CSS控制的不好就会显得很乱。。两难啊。。

  13. http://1.gravatar.com/avatar/5b9ccb5538c8e53fb91348e7d995c367?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我也成功了,多谢。

  14. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Calcifer
    真的啊,而且模板改得很难看

  15. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @chao
    真的假的…… 赶快去观望下…… :shock: 居然是真的…… mg12神了……

  16. http://0.gravatar.com/avatar/2a267327144efa9faf5047dce1bec359?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  17. http://1.gravatar.com/avatar/bb8b43a9f49652fa3004e6ce5fa9c0cd?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博客更新得不错也。今天我又到你的博客一读,望回访。握手。

  18. http://0.gravatar.com/avatar/8aa97fe8ca30db7b8b4c992f013736bf?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  19. http://1.gravatar.com/avatar/3ed42d687471dad6b7a60b45ce81955b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    今天无意间发现avast(来自捷克的一款杀毒软件)的官方博客用的你模板了。

    恭喜了。

  20. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  21. http://1.gravatar.com/avatar/9e3139845553b02a3fbffc6b4d0a0bbf?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Jutoy
    恩 如果回复数多 就要找半天了

  22. http://0.gravatar.com/avatar/c0f815ec3411fdfbf57066400f758260?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo
    于是我得令找出路了..

  23. http://1.gravatar.com/avatar/79070495d4c5247f81f802873fac9a29?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  24. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    汗。。。最后那段代码也太抽象了,像在话字符画

  25. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  26. http://0.gravatar.com/avatar/c0f815ec3411fdfbf57066400f758260?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请问mg12, 你用的什么"代码->语法高亮HTML"工具?

  27. http://0.gravatar.com/avatar/c0f815ec3411fdfbf57066400f758260?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请问mg12,你是用什么"代码->含高亮的HTML"工具?

  28. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    正在为新主题使用哪一种回复方式而头疼,希望能发现一个良好的启示

  29. http://1.gravatar.com/avatar/94edba5ccaf4f54d0891cf3a7b1e1280?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很详细的分析

    个人对嵌套回复是又爱又恨~

  30. http://0.gravatar.com/avatar/ee96af3312681bc85af88ec9ebb2d835?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    各有利弊啦!
    青菜蘿蔔各有各的好!

  31. http://1.gravatar.com/avatar/b2a4a8583709521e13d79f8519b07954?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    ~有时候喜欢嵌套回复,有时又不喜欢....最后还是主题帮我决定了~~

  32. http://0.gravatar.com/avatar/09d288a90ae2da168f11cb4c5e49199f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很不喜欢嵌套回复。

  33. http://1.gravatar.com/avatar/78b0fd25b4aadfa50d9dde0ba2cc5d50?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    始终觉得嵌套的层数是一个很大限制因素,@回复也未必不是一个趋势。 :smile:
    尤其是像iNove这样的形式…

  34. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @风残梦
    @LeaFly 正解!

    @LeaFly
    这不是 bug, 是为了防止有人用嵌套回复把编号打乱了. 我是没有用嵌套, 所以改了一下. 现在没有两全其美的方法.

  35. http://0.gravatar.com/avatar/c0f815ec3411fdfbf57066400f758260?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    突然发现一个问题, 刚评论完无论是第几个在评论时间右边都是#1, 刷新以后就对了

  36. http://0.gravatar.com/avatar/c0f815ec3411fdfbf57066400f758260?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @风残梦
    在主题的single.php里加,拿FireBug看一下NeoEase就明白了

  37. http://1.gravatar.com/avatar/79070495d4c5247f81f802873fac9a29?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    趁着楼高提个问题(像在刷评论……)
    声明: 本站遵循 署名-非商业性使用-相同方式共享 3.0 共享协议. 转载请注明转自 NeoEase
    这个是怎么加到网站上的?先表示感谢~

  38. http://1.gravatar.com/avatar/79070495d4c5247f81f802873fac9a29?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我那个激动啊……
    第一次抢到沙发
    感谢mg12的inove~
    一会慢慢研究文章……

  39. http://1.gravatar.com/avatar/79070495d4c5247f81f802873fac9a29?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  1. Loading...