WordPress 2.7内置了threaded comment之后,原来主题的comments.php文件中繁琐的评论循环简化成了一个函数调用:wp_list_comments.
然而不加任何参数调用该函数的话,它输出的HTML结构是固定的。尽管它给每个元素都提供了丰富的class name供CSS样式使用,但是CSS并不足够灵活(除非使用一些我认为不是太好的方式,比如大量绝对定位),可以任意显示固定的DOM结构。某些情况下,我们还是希望能够自己来定义DOM结构。
WordPress开发者当然考虑到了这一点,在Codex上的文档页就给出了一个例子。实际上就是wp_list_comments接收的数组参数中可以传入两个回调函数。一个是callback,负责输出一条评论的主体部分。另一个是end-callback,负责输出评论的结束部分。
解释一下。threaded comments实际上在内部就是一个“森林”,每一条顶层评论和它的所有回复、回复的回复构成一棵树。wp_list_comments对每棵树做一次遍历,首先调用参数callback指定的函数,然后递归遍历其子节点(输出回复评论),完成之后再调用参数end-callback指定的函数。如果不指定这两个函数,WordPress就会输出默认的结构,实际上大家都是把默认输出复制到自己的回调函数中,然后修改一下结构。简单的说,就是callback输出一个块的开头加上该评论自己的内容,end-callback输出这个块的结尾,中间是子评论。如下图所示的遍历顺序,偏下的箭头表示调用callback,偏上的箭头表示调用end-callback.
以上提到的关键代码都在wp-includes/comment-template.php中。
Leave a Reply