以前一直挂着 mg12 的 WP-RecentComments,此插件功能十分强大,可以说是最新评论插件中的精品。然后我该说但是了,加载这么一个插件:需要一个未压缩 12KB 的 JS 和 1KB 左右的 CSS,还有额外的一个 PNG,对于我这么一个小破站,网速又不够快,也没多少人关注,真的是一点必要都没有。回过头来想想,我当时为什么采用这个插件:因为 WordPress 自带的近期评论小工具无法显示评论内容,只有“[评论者] 在 [文章名] 上的评论”这么一种用处不大的显示方式,真是屌用没有 = =

为了对博客提速,精简掉不必要的插件算是很重要的一个环节,于是打算对自带的近期评论小工具进行改造:

其代码位于wp-includes\default-widgets.php约596行到662行(WordPress 3.1.3)

较核心的源代码如下:

if ( ! $number = absint( $instance['number'] ) )
$number = 5;//定义评论显示的数量
 
$comments = get_comments( array( 'number' => $number, 'status' => 'approve', 'post_status' => 'publish' ) );//定义评论显示的条件
$output .= $before_widget;
if ( $title )
	$output .= $before_title . $title . $after_title;
 
$output .= '<ul id="recentcomments">';//小工具 html 代码开始
if ( $comments ) {//评论输出循环开始
	foreach ( (arrayforeach ( (array) $comments as $comment) {
		$output .=  '<li class="recentcomments">' . get_comment_author_link() . ' - <a href="' . esc_url(get_comment_link($comment->comment_ID)) . '">' . mb_strimwidth(get_the_title($comment->comment_post_ID), 0, 20,"...") . '</a>' . '<br/>' . mb_strimwidth(strip_tags($comment->comment_content), 0, 32,"...") . '</li>';
	}
}//评论输出循环结束
$output .= '</ul>';
$output .= $after_widget;//小工具 html 代码结束


定义评论显示数量
这部分就不用说了,其在 WordPress 后台控制即可。

定义评论显示的条件
array( 'number' => $number, 'status' => 'approve', 'post_status' => 'publish' )
这是默认的代码,number为显示的数量,在这之前已经定义过。
status是评论的状态,默认为只显示获准过的评论,如果需要显示所有的评论,那么就把'status' => 'approve'这段代码删除。
post_status是文章状态,一般情况下肯定不希望私密文章的评论被显示,所以就用'publish'即可。
定义评论显示类型:默认情况下,pingback也会被显示,所以同理,只要自己加上一段'type' => 'comment'变为
array( 'number' => $number, 'status' => 'approve', 'post_status' => 'publish', 'type' => 'comment' )即可。
判断条件还有:

  • post_ID 单独显示某一篇文章的最新评论
  • author 依据评论者昵称单独显示最新评论
  • author_email 依据评论者 email 单独显最新评论
  • author_url 依据评论者网址单独显示最新评论
  • user_id 依据评论者的 ID 显示,所有未注册的评论者的user_id都为0,可以加上此条件不显示管理员的评论。

定义最近评论的输出格式
重要:此文件中如果添加了非英文字符请将文件转换为 UTF noBOM 格式!
稍微懂点 PHP 和 HTML 的话,按自己的意愿修改输出很简单,不过最先要做的就是把源代码中的sprintf()函数和_e()函数去掉,这俩函数是对输出的评论进行格式化,并加上语言文件中的翻译。如果我们懒得去编译 po 文件的话,就直接删除掉这俩函数,直接在文件中按我们的意愿控制输出即可。
目前我的侧边栏的最新评论代码如下:

if ( $comments ) {
	foreach ( (array) $comments as $comment) {
		$output .=  '<li class="recentcomments">' . get_comment_author_link() . ' - <a href="' . esc_url(get_comment_link($comment->comment_ID)) . '">' . mb_strimwidth(get_the_title($comment->comment_post_ID), 0, 20,"...") . '</a>' . '<br/>' . mb_strimwidth(strip_tags($comment->comment_content), 0, 32,"...") . '</li>';
	}
 }

其显示出来的效果为:
[评论者] - [文章名]
[评论内容]

相关的有用的函数:

  • strip_tags($comment->comment_content)函数可以显示评论的内容。
  • mb_strimwidth(str,0,34,"...")也是一个非常有用的函数,可以截取指定字数的内容,保持输出的美观。第一个参数 str 可以替换成需要显示内容的函数,以我的代码为例,就是把评论内容进行了截取;第二三个参数制定了截取开始的位置和长度(英文一个字节,中文占两个字节),最后一个参数制定了截取后在尾部显示的内容,我这儿用的省略号。反正这个函数可以截取过长的用户名、过长的文章名、这俩加起来过长了也可以再截取一下,很简单。
  • get_avatar(esc_attr(get_comment_author_email()),'32') 可以显示评论者头像,最后的 32 为 gravatar 头像的大小。这个怎么显示,就仁者见仁智者见智了,靠 CSS 修饰一下就哦了!
  • get_comment_date()get_comment_time(),这俩函数可以显示评论日期和时间,括号内的参数可以填写如'h:m:s'或'y.m.d'这样的时间格式参数,具体还请参看 PHP 的手册。

非代码框内的代码,一定要注意引号哦,它已经被转换为中文引号了。
其实经过这么一番处理,WordPress 自带的近期评论 widget 也应该能焕发焕发第二春,毕竟为了实现简单的功能而去用繁冗的插件是极大的浪费。
此文也仅仅是抛砖引玉,靠一些代码可以将这个小工具变得更加强大。

  1. 博主的评论系统是用的什么插件吗?请问叫什么名字,我很喜欢这个评论系统!请问可以直接复制替换主题里面的 comments.php 吗?

  2. 为什么加了'user_id'=>'0' 还是显示了管理员的评论?

  3. 如果能添加不显示自己的评论会更好一些

  4. 说的非常详细,正好要用到,对该写近期评论非常有用。

  5. 问下,如何在前面加一个判断,屏蔽自己的回复。

    知道了,3Q

  6. 还有这里

    $comments = get_comments( array( 'number' => $number, 'status' => 'approve', 'post_status' => 'publish','type' => 'comment','user_id' => 0 ) );

  7. 请教一下,很奇怪,我用了代码之后在标签那里多了两个。 。 的奇怪标签,点击进去是评论。 你能帮我看看吗? 我是新手不太熟悉 你可以在我网页右边的侧边栏里的标签看到。

    我修改的代码是这样的,有问题吗?

    $output .= '' . get_comment_author_link() . ' : <a>comment_ID() . '">' . '' . mb_strimwidth(strip_tags($comment->comment_content), 0, 32,"...") . '';

    如果能回复, 十分感谢

    • @BE
      你这个<a>标签没有关闭,comment_ID()也不能这样单独使用,而且你把 HTML 代码和 PHP 代码写混了,这么说可能你不太理解,下面标有草绿色的代码为 PHP 代码,其内容是根据评论变化的;天蓝色的代码是 HTML 代码,其内容决定了评论的显示格式:

      $output .= '<li class="recentcomments">' . get_comment_author_link() . ': <a href="' . esc_url(get_comment_link($comment->comment_ID)) . '">' . mb_strimwidth(strip_tags($comment->comment_content), 0, 32,"...") . '</a></li>';

      显示效果为:[评论者] : [评论内容],点击评论内容跳转到文章页面,点击评论者跳转到评论者网站。
      你评论中的内容有的错误被我修改了,其实我不应该改的,所以请你仔细看一下...

    • @小虾
      十分感谢你的回复呢。真的修正过来了。太谢谢了。
      我贪心地多问一个问题,如果我想把评论者的名字改个颜色突出以下,如何实现呢?

    • @BE
      HTML:
      $output .= '<li class="recentcomments"><span class="authorname">' . get_comment_author_link() . '</span> : <a href="' . esc_url(get_comment_link($comment->comment_ID)) . '">' . mb_strimwidth(strip_tags($comment->comment_content), 0, 32,"...") . '</a></li>';

      CSS:
      .authorname, .authorname a{color:red}
      这样就可以了,颜色这块自己修改一下就可以了,不明白可以问我。

  8. 很好很详细! 留个记号先