2010.7.5 Edit:最新的参考《带头像显示的最新评论代码 - 蛋疼篇》
因为昨天大修了主题的评论样式,从原来的 5 级嵌套改为 2 级嵌套,也保留了以前 5 级嵌套的现示,2级嵌套使用了 Jinwen 的思路,所以 2 级嵌套评论后的评论都是 @ 方式显示跟随在2级后门。
由此问题就来了,一直使用的最新评论代码不能显示或者转换带连接开头的评论内容,致使只要带有链接 @ 方式开头的评论内容显示不了,可 Jinwen 那里的最新评论可以显示带连接的评论内容。
我前几天请教过 Jinwen ,Jinwen说他用的是插件,于是只能自个折腾了,最后在国人开发的 WP Kit CN 这个插件找到了解决办法——加个截断函数。
下面我从头说起,来说明“最新评论代码”完善过程:
我在《用代码武装你的wordpress [part 1]》这篇文章贴过“最新评论代码 - Recent Comments”的代码,这是最基本的“最新评论”代码,支持中文摘录评论长度,代码如下:
<h2>Recent Comments</h2> <ul> <?php global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, SUBSTRING(comment_content,1,16) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' AND user_id='0' ORDER BY comment_date_gmt DESC LIMIT 10"; $comments = $wpdb->get_results($sql); $output = $pre_HTML; foreach ($comments as $comment) {$output .= "\n<li>".get_avatar(get_comment_author_email(), 32).strip_tags($comment->comment_author).":<br />" . " <a href=\"" . get_permalink($comment->ID) ."#comment-" . $comment->comment_ID . "\" title=\"on " .$comment->post_title . "\">" . strip_tags($comment->com_excerpt)."</a>...</li>";} $output .= $post_HTML; echo $output; ?> </ul>
说明:
- comment_date_gmt DESC LIMIT 10 中的 10 是指要显示的评论个数
- SUBSTRING(comment_content,1,16) 中的 16 是指每条评论的中文文字个数
- ('comment_author_email'), 32) 中的 32 是指头像的图片大小
不要迷恋分割线,分割线只是个传说
一直用到上个月底才换为 willin 修改过的最新评论代码,我稍微改了一些如下:
<h2>Recent Comments</h2> <ul class="recentcomments"> <?php global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, SUBSTRING(comment_content,1,18) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != 'zwwooooo' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 10"; $comments = $wpdb->get_results($sql); foreach ($comments as $comment) { $output .= "\n<li>".get_avatar(get_comment_author_email(), 32)."<a href=\"" . get_permalink($comment->ID) ."#comment-" . $comment->comment_ID . "\" title=\"on " .$comment->post_title . "\">" . strip_tags($comment->com_excerpt)."</a>...</li>"; } $output = convert_smilies($output); echo $output; ?> </ul>
说明:
- comment_date_gmt DESC LIMIT 10 中的 10 是指要显示的评论个数
- SUBSTRING(comment_content,1,18) 中的 18 是指每条评论的中文文字个数
- ('comment_author_email'), 32) 中的 32 是指头像的图片大小
- zwwooooo 改为你自己的用户名(就是不显示自己的评论)
- 加了个 class “recentcomments”,可以在css里面定义样式
如果你使用了 Willin 的头像缓存代码,那么可以修改如下:
<h2>Recent Comments</h2> <ul class="recentcomments"> <?php global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, SUBSTRING(comment_content,1,18) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != 'zwwooooo' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 10"; $comments = $wpdb->get_results($sql); foreach ($comments as $comment) { $a= get_bloginfo('wpurl') .'/avatar/'.md5(strtolower($comment->comment_author_email)).'.jpg'; $output .= "\n<li><img src='". $a ."' alt='' title='".$comment->comment_author."' class='avatar' /><a href=\"" . get_permalink($comment->ID) ."#comment-" . $comment->comment_ID . "\" title=\"on " .$comment->post_title . "\">" . strip_tags($comment->com_excerpt)."</a>...</li>"; } $output = convert_smilies($output); echo $output; ?> </ul>
说明:
- comment_date_gmt DESC LIMIT 10 中的 10 是指要显示的评论个数
- SUBSTRING(comment_content,1,18) 中的 18 是指每条评论的中文文字个数
- 头像的图片大小自行在style.css增加个名为“recentcomments”的 class 定义(例如width:32px; height:32px;)
- zwwooooo 改为你自己的用户名(就是不显示自己的评论)
- 参数 $a 是缓存路径
不要迷恋分割线,分割线只是个传说
现在是文章的重点,为了能显示带链接开头的评论,我找了很多插件,都是不能显示带连接开头的评论内容,后来突然想到国产的 WP Kit CN 这个插件,一试它可以显示带连接的评论,这下有眉目了。
经过翻看它的代码,发现它是自定义了一个截断函数:function cut_str($string, $sublen, $start = 0, $code = 'UTF-8'),于是发挥 CP 党的精神直接挪到我的主题 function.php 里面,经测试 is OK!小高兴了一下,所以就有了这篇文章了。
下面是继续贴代码:
第一步:把下面的代码加到主题文件的 function.php 里面
function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') { if($code == 'UTF-8') { $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/"; preg_match_all($pa, $string, $t_string); if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."..."; return join('', array_slice($t_string[0], $start, $sublen)); } else { $start = $start*2; $sublen = $sublen*2; $strlen = strlen($string); $tmpstr = ''; for($i=0; $i<$strlen; $i++) { if($i>=$start && $i<($start+$sublen)) { if(ord(substr($string, $i, 1))>129) $tmpstr.= substr($string, $i, 2); else $tmpstr.= substr($string, $i, 1); } if(ord(substr($string, $i, 1))>129) $i++; } if(strlen($tmpstr)<$strlen ) $tmpstr.= "..."; return $tmpstr; } }
第二步:修改过的最新评论代码(调用第一步的截断函数)
<h2>Recent Comments</h2> <ul class="recentcomments"> <?php global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, comment_content AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != 'zwwooooo' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 12"; $comments = $wpdb->get_results($sql); foreach ($comments as $comment) { $output .= "\n<li>".get_avatar(get_comment_author_email(), 32)."<a href=\"" . get_permalink($comment->ID) ."#comment-" . $comment->comment_ID . "\" title=\"on " .$comment->post_title . "\">" . cut_str(strip_tags($comment->com_excerpt),18)."</a></li>"; } $output = convert_smilies($output); echo $output; ?> </ul>
说明:
- comment_date_gmt DESC LIMIT 12 中的 12 是要显示的评论数量
- cut_str(strip_tags($comment->com_excerpt),18) 中的 18 是每条评论要显示的文字数量
- zwwooooo 是用户名,目的是不显示此用户的评论,改为自己的用户名吧
- recentcomments 为自定义 class
- get_avatar(get_comment_author_email('comment_author_email'), 32) 中的 32 是头像大小
如果你使用 Willin 的头像缓存代码,那么代码如下:
<h2>Recent Comments</h2> <ul class="recentcomments"> <?php global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, comment_content AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != 'zwwooooo' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 12"; $comments = $wpdb->get_results($sql); foreach ($comments as $comment) { $a= get_bloginfo('wpurl') .'/avatar/'.md5(strtolower($comment->comment_author_email)).'.jpg'; $output .= "\n<li><img src='". $a ."' alt='' title='".$comment->comment_author."' class='avatar' /><a href=\"" . get_permalink($comment->ID) ."#comment-" . $comment->comment_ID . "\" title=\"on " .$comment->post_title . "\">" . cut_str(strip_tags($comment->com_excerpt),18)."</a></li>"; } $output = convert_smilies($output); echo $output; ?> </ul>
OK,折腾完,又无聊去了 = =
延伸折腾:不是bug的解决方法《带头像显示的最新评论代码 - 链接 Bug 修正》
- 本文标题:带头像显示的最新评论代码 - 完善篇
- 本文链接:https://zww.me/archives/24736
- 发布时间:2009年12月11日 13:04
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
终于等到沙发看
原来是地板
@zhy
哼哼,偶是沙发王子
坐个沙发先吧。。
我不懂代码。。
我的做法是去掉@上的链接- -
反正是嵌套嘛
等需要的时候再来这发掘
我是特意加上@上的链接,这样才知道你@什么,所以才有这个折腾
收藏之,以备以后折腾!~~
学习了~~~
额……这代码……我还是用我的WP KIT CN插件好了……
一开始搞不定我差点就用WP KIT CN了
我只能说,强悍支持!!!!
@derek 我又瞎折腾了,这个不是很多人需要
必备功能,流行趋势...
@爱.一起.你 哈哈
折腾过,但是感觉和我的主题不搭调,又撤了
@万戈 你说的是最新评论代码还是评论嵌套???
@zwwooooo 最新评论,嵌套我已经搞定了
额,Z大真能折腾啊。我觉得看评论内容就应该看得出回复的是哪一条了。
@纯粹 我现在的嵌套想法是:主评论相当于论坛贴楼主,下面回复的就相当于论坛贴里面的楼层,前面的“@谁”就是告诉你你回复了谁
@zwwooooo 嗯,加个回复对象的链接,感觉不错的样子,不过现在会收到两条邮件提醒:“您在XXX上的评论有了新回复”“您在XXX的评论被XX回复了”
发现是比较高级的应用
@Louis Han 不高级吧,都是CP来的
看着代码,还真够复杂的
@小T 呵呵,纯CP
不要迷恋分割线,分割线只是个传说,哈哈~~
@huangjun
还是不带头像算了
@阿士 懒得话就不用去折腾,直接用插件吧
看不太懂,慢慢看!
太多啦,一时半会还消化不了,Z大的博客侧边栏真是大换血啊。我比较关心侧边栏的最新评论能否像运用WP-RecentComments插件那样进行翻页。话说Z大侧边栏的最新评论跑哪里去了,一时没找到。
@mytion 首页才显示最新评论,相对的首页不显示最新文章
看起来好像很复杂,慢慢研究下。我的侧栏的最新评论现在的确有些问题。
@Vicia 你的侧边栏评论有啥问题?
@zwwooooo 看到你的问题之后,我忽然发现我的侧边栏连最新评论都没了。
之前的那个没有脑袋,而且我自己的评论也在里面。
@zwwooooo 呃,按错回复了。><
@Vicia 那这篇文章你可以参考一下直接CP
@zwwooooo 嗯,我现在已经养成了一折腾主题就往这儿跑的习惯。
@Vicia 哇,听起来真高兴,因为觉得自己折腾的文章能帮到朋友
@zwwooooo 那多更新。我争取哪天能抢个沙发坐坐。
收藏了。。。
@小y 同收藏,留着慢慢学习
@胡一刀 慢慢折腾吧,哈
这个月很忙,我是来凑热闹+混个脸熟的……闪了。
@阿修 记得更新哦,不要让我老白去你那
@阿修
俺也来凑个热闹
@Auston Jary 凑吧,人多才有意思
@zwwooooo 下个月就闲了……
@阿修 下个月做更新狂吧
@zwwooooo 你个更新狂想拉我入伙
@阿修 不要犹豫了,加入狂之列吧
我也来学习啦,现在有别人折腾结果啦。哈哈。话说上次提交主题时候这一段代码官方不给我pass呢,省事我就干脆取消掉了
@jinwen 我也是,我也删了才通过,但我上一个主题又可以