高亮作者评论在嵌套评论中的非插件实现
如何高亮作者评论,前人已有不少赘述,一类如 How to: Style author comments in WordPress 2.7 ,介绍了通过css样式表实现高亮作者评论;另一类如 WordPress高亮作者和文章置顶的实现,讨论稍多,前半部分将如何标记作者评论,后半段则同样是通过css样式表实现高亮作者评论。但是这种方法并不适用于用于嵌套评论系统(Threaded Comments)的主题,本文则着力讨论作者评论高亮在嵌套评论中的非插件实现。
原因
为何css样式表无法实现嵌套评论的作者高亮呢?
通常情况下,css样式表都是如下写法
- 本博客主题作者写法,实现作者评论底色变色
.bypostauthor .comment-meta {
background-color:#e4ebed; color:#000
}
li.bypostauthor {
/* CSS styles for author comments */
}
- WordPress高亮作者和文章置顶的实现一文写法,实现作者头像边框变色
.children li.comment-author-admin span.avatarx{
background: #C04019;
padding: 4px;
}
但是无论哪种方法都难以实现嵌套评论高亮作者回复,会出现类似于以下的效果。
一旦有作者回复,之后的回复无论是否为作者回复都一样会变色,原因就在在于嵌套回复的代码结构问题。以本主题留言系统的代码框架为例。
<li class="comment even thread-even depth-1" id="li-comment-259"> <div id="comment-259"> <div class="comment-avatar">...</div> <div class="comment-meta commentmetadata">...</div> <div class="recover"></div> </div> <ul class='children'> <li class="comment byuser comment-author-admin bypostauthor even depth-2" id="li-comment-260"> <div id="comment-260"> <div class="comment-avatar">...</div> <div class="comment-meta commentmetadata">...</div> <div class="recover"></div> </div> <ul class='children'> <li class="comment" id="li-comment-261"> <div id="comment-261"> <div class="comment-avatar">...</div> <div class="comment-meta commentmetadata">...</div> <div class="recover"></div> </div> </ul> </li> </ul> </li>
第8行代码表明了,第一层回复(第7行以下)为作者回复(第8行.byauthotpost表明),则根据css该li下的comment-meta应该变色为#e4ebed,但是作者回复的楼下<ul class="children">(14行以后)虽然非作者回复(15行class属性表明),但是这一楼的comment-meta依然满足css中.bypostauthor .comment-meta的匹配规则,则回复作者这一楼也会像作者回复一样变色。
问题的关键就在于.bypostauthor .comment-meta没有对.bypostauthor中到.comment-meta的li层数做限定,写过嵌套评论每嵌套一层就缩进一点的童鞋都知道,可以使用.commentlist li.depth-x(x=1,2,3,4,5…)的形式对li层数做出限定,但是无奈从来都没有li.depth-0,.bypostauthor .comment-meta也就无以限定对象为最接近.bypostauthor的,一层li都没有的.comment-meta了。
解决方案
解决方案简单点说,就是不仅仅要依靠评论的头部class表明该评论是否是作者回复,还要在需要在作者回复高亮属性上表明该回复是否属于作者回复,这在带有多级<ul class="children">的嵌套评论系统中是十分必须的。
就具体问题而言,就是要在.comment-meta上标明.byauthorpost(本主题),或者在.avatarx上标明.byauthorpost(WordPress高亮作者和文章置顶的实现)。
很多文章都介绍了如何实现类似与.byauthorpost属性的实现,如如何高亮你的评论背景色以及WordPress高亮作者和文章置顶的实现,其实大可不必自己写函数这么麻烦,从Wordpress 2.7开始,系统内置了判断评论类型的函数comment_class()。
大家可以在主题文件夹里的comment.php中(如果你的主题很屌,callback了主题作者编写评论函数,则有可能出现在主题文件夹里的functions.php中)看到这样一句,其中完成了对comment_class()的调用
<li <?php comment_class("comment"); ?> id="comment-<?php comment_ID() ?>">
Worpress官方给出的
comment_class()用法如下
- comment/pingback:comment类型和pingback类型
- even/odd:偶数和奇数
- depth-1/2/3/n:当前评论所属的嵌套层数,除了depth-1以外都是子评论
- bypostauthor:该评论是当前文章的作者发表的
- comment-author-admin:评论的发表者是博客的管理员
- byuser:评论的发表者是博客的注册用户
鉴于本主题的中要作者高亮的部分是<div class="comment-meta commentmetadata">...</div>,本身即有class属性,则我们将官方自带的comment_class()稍加修改,将以下函数添加于主题的functions.php中。
<?php
/**
* Add semantic classes for each comment element in existing class attribute
*
* @since 2.7.0 mod by logicmd
*
* @param string|array $class One or more classes to add to the class list
* @param int $comment_id An optional comment ID
* @param int $post_id An optional post ID
* @param bool $echo Whether comment_class should echo or return
*/
function add_comment_class( $class = '', $comment_id = null, $post_id = null, $echo = true ) {
// Separates classes with a single space, collates classes for comment DIV
$class = join( ' ', get_comment_class( $class, $comment_id, $post_id ) ) ;
if ( $echo)
echo $class;
else
return $class;
}
?>
完成后在function tbf1_comment($comment, $args, $depth)做以下修改即可(若未回调自制函数则在wp_list_comments()中对应位置修改)
<div class="comment-meta commentmetadata <?php add_comment_class(); ?>">
总结
前面废话讲的比较多,主要是把思路说清楚,想快速修改的的童鞋,遵循一下步骤
高亮属性
挑选一种你要高亮的部分,是要给作者头像改一种边框色还是改变作者评论背景色,etc
调用函数
根据你要挑选的高亮部分,调用返回评论类型的函数,如果该div无class,果断使用官方调用的样例<li <?php comment_class("comment"); ?> id="comment-<?php comment_ID() ?>">,若有class,则仿照我前面写的<div class="comment-meta commentmetadata <?php add_comment_class(); ?>">在class内调用。
添加css
最后别忘了css样式表,样例在文章开头已经给出。

