整合侧边最新评论和评论框中的 Gravatar 缓存 (代码版)

昨天写了一篇关于 Gravatar 缓存的文章,这里只是缓存日常文章评论框中的 Gravatar 的头像。如果你主页中有多处调用了 Gravatar 头像的话(读者墙、侧边栏带头像最新评论)那么你可以试一下如下方法。这个方法也是 Willan 大师新出的 Gravatar 缓存方法。(如果你用了我昨天提供的方法,麻烦你将代码改回来。。。。)

前提:先在你的网站 wp-content 的同級目录建立文件夹: /avatar 权限: 755,這是准备 Gravatar 缓存的路径
准备一张适合你模板尺寸的默认头像,名为“default.jpg”放在此文件夹里面。

1. 把下面的代码扔进主题的 functions.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
/* Mini Gavatar Cache by Willin Kan. */
function my_avatar( $email, $size = '42', $default = '', $alt = false ) {
$alt = (false === $alt) ? '' : esc_attr( $alt );
$f = md5( strtolower( $email ) );
$w = get_bloginfo('wpurl');
$a = $w. '/avatar/'. $f. '.jpg';
$e = ABSPATH. 'avatar/'. $f. '.jpg';
$t = 1209600; //設定14天, 單位:秒
if ( empty($default) ) $default = $w. '/avatar/default.jpg';
if ( !is_file($e) || (time() - filemtime($e)) > $t ){ //當頭像不存在或文件超過14天才更新
$r = get_option('avatar_rating');
$g = sprintf( "http://%d.gravatar.com", ( hexdec( $f{0} ) % 2 ) ). '/avatar/'. $f. '?s='. $size. '&d='. $default. '&r='. $r;
copy($g, $e);
}
if (filesize($e) < 500) copy($default, $e);
$avatar = "<img title='{$alt}' alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
return apply_filters('my_avatar', $avatar, $email, $size, $default, $alt);
}
// -- END ----------------------------------------
?>

上面第一行的 $size 可先定義好.
然後將所有 get_avatar() 改 my_avatar(), 大概是 functions.php, comments.php, sidebar.php, comments-ajax.php 會有頭像的地方有這 get_avatar() 函數.

注意這 my_avatar() 的方法和 get_avatar() 有一點差別.(一定要注意这里,要把原来WP调用的格式改一下,否则会出现错误)
get_avatar() 可用 id 或 email, 可寫成 get_avatar($comment, $size= ...
而 my_avatar() 只能用 email, 要改成 my_avatar($comment->comment_author_email, $size= ...
使用參數如下:

1
 <?php echo my_avatar( $email, $size, $default, $alt ); ?>

好了,这样你的评论框 Gravatar 头像缓存就改造完成了,接下来是侧边栏最新评论中的头像缓存了。

将下列代码扔到你的 Sidebar.php 中的适当位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<h3>Recent Comments</h3>
<ul class="recentcomments">
<?php //2010/4/25 更新 by willin
$limit_num = '8'; //这里定义显示的评论数量
$my_email = "'" . get_bloginfo ('admin_email') . "'"; //这里是自动检测博主的邮件,实现博主的评论不显示
$rc_comms = $wpdb->get_results("
 SELECT ID, post_title, comment_ID, comment_author,  comment_author_email, comment_content
 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 comment_author_email != $my_email
 ORDER BY comment_date_gmt
 DESC LIMIT $limit_num
 "
);
$rc_comments = '';
foreach ($rc_comms as $rc_comm) { //get_avatar($rc_comm,$size='50')
$rc_comments .= "<li>" . my_avatar($rc_comm->comment_author_email,$size='40')
. "<span  class='zsnos_comment_author'>".$rc_comm->comment_author.": </span><a href='"
. get_permalink($rc_comm->ID) . "#comment-" . $rc_comm->comment_ID
//. htmlspecialchars(get_comment_link(  $rc_comm->comment_ID, array('type' => 'comment'))) // 可取代上一行,  会显示评论分页ID, 但较耗资源
. "' title='on " . $rc_comm->post_title . "'>" . strip_tags($rc_comm->comment_content)
. "</a></li>\n";
}
$rc_comments = convert_smilies($rc_comments);
echo $rc_comments;
?>
</ul>

然后,加上如下 CSS

1
2
3
#sidebar .recentcomments img.avatar{width:16px;height:16px;float:left;position:relative;border:1px solid #ddd;margin:0 5px 0 0;padding:1px;}
#sidebar ul.recentcomments{list-style:none;padding-left:0;}
#sidebar ul.recentcomments li{margin:5px 0 0;line-height:20px;height:20px;overflow:hidden;}

搞定,收工。。