北极寒流 » 网络资源 » WordPress免插件读者墙改进版 - 2010.08.16

WordPress免插件读者墙改进版

这是续上篇WordPress免插件读者墙之后的改进版本,是在网上无意中发现的,一块CP过来以备自己以后参考。 上版WordPress免插件读者墙的代码据说是按照作者名把评论数量归类相加的,这就出现个问题,就是当作者名称一样的时候,网站和邮箱不一样,或者没有填写邮箱的时候,评论数量会增加到已经存在的作者上.这样对后来的同名留言者就显得很不公平。另一个问题类似:是有些评论者今天叫这个名字,明天又改了名字,但是邮箱和网址不变,就变成两个人展示出来了.

于是就有高手整理出解决上述问题的新代码来了,WordPress读者墙免修改版代码如下:

<h2>Most Active Friends</h2> //标题,可根据需要增加样式
<ul>
<?php
$my_email = "'" . get_bloginfo ('admin_email') . "'";
//获取管理员邮箱
$counts = $wpdb->get_results("
SELECT COUNT(comment_author) AS cnt, comment_author, comment_author_url, comment_author_email FROM (SELECT * FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->posts.ID=$wpdb->comments.comment_post_ID) WHERE comment_date > date_sub( NOW(), INTERVAL 1 MONTH )
//1 MONTH就是一个月之内的排行
AND user_id='0'
AND comment_author_email != $my_email //根据邮箱判断,输出非博主的数据.
AND post_password=''
AND comment_approved='1'
AND comment_type='') AS tempcmt
AS tempcmt GROUP BY comment_author_email
//按同一作者邮箱把评论数量归类相加
ORDER BY cnt
DESC LIMIT 12"); //最后一个数字12就是显示头像的数量。
foreach ($counts as $count) {
$c_url = $count->comment_author_url;
$mostactive .= '<li>' . '<a href="'. $c_url . '" title="' . $count->comment_author . ' ('. $count->cnt . 'comments)">' . get_avatar($count->comment_author_email, 40) . '</a></li>';
}</div>
echo $mostactive;
?>
</ul>

由于主题的不同,可能部分地方需要自己修改一下CSS,关于css定义,可参考上篇WordPress免插件读者墙

注:上面代码中标注出了INTERVAL 1 MONTH )
//1 MONTH就是一个月之内的排行,这个可以修改成1 YEAR ,意思是一年内的排行,如果修改成1 DAY 或者 24 HOUR 就会显示1天内或24小时内留言的朋友的头像,

如果需要根据评论的最后时间排列的.
这就需要将上面代码中ORDER BY cnt
改为 ORDER BY comment_date_gmt
然后删除掉DESC LIMIT 12,因为我们并不知道24小时内有多少人会留言.
所以就不需要限定显示的数量了.

同时推荐上述代码配合Gravatar 头像緩存来使用,效果更佳。

Gravatar 头像緩存实现方法:

先在你的网站 wp-content 的同级目录建立资料夹: /avatar 权限:755, 这是准备 gravatar 缓存的路径.准备一张适合你模板尺寸的默认头像, 名为"default.jpg" 放在此路径.

将下列代码 copy 到模板的 functions.php

function my_avatar($avatar) {
$tmp = strpos($avatar, 'http');
$g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);
$tmp = strpos($g, 'avatar/') + 7;
$f = substr($g, $tmp, strpos($g, "?", $tmp) - $tmp);
$w = get_bloginfo('wpurl');
$e = ABSPATH .'avatar/'. $f .'.jpg';
$t = 1209600; //設定14天, 單位:秒
if ( !is_file($e) || (time() - filemtime($e)) > $t ) { //當頭像不存在或文件超過14天才更新
copy(htmlspecialchars_decode($g), $e);
} else $avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.jpg'));
if ( filesize($e) < 500 ) copy($w.'/avatar/default.jpg', $e);
return $avatar;
}
add_filter('get_avatar', 'my_avatar');

上面这个Gravatar头像緩存代码是将 my_avatar() 挂勾在 get_avatar() 後面, 将 get_avatar() 的输出再进行处理.
这个缓存方式不必改模板, 而且连後台都可用缓存头像, 但有些缺点是: 多了程序会较耗资源和速度, 而且後台的头像比较小, 缓存的头像在前台比较难看.
另外, 你也许已发现, 代码中有两个可用正则匹配的地方, 故意改用字串函数, 目的是加快执行速度.

注意: 因为这方法是挂在 get_avatar() 後面, 所以必须在 get_avatar() 定义 $default,
例: echo get_avatar( $id_or_email, $size = '42', $default = get_bloginfo('wpurl') . '/avatar/default.jpg' );
其中 $id_or_email 的部份要看你模板怎麽写, 後面的 $default 所带的就是默认头像.

以前的版本在第一次 copy 头像时不能显示头像 (因为缓存没有头像), 这新版在第一次没头像时, 会直接显示 gravatar 的头像.

WordPress免插件读者墙改进版代码来自:http://amangs.com/wordpress-reader-wall.html
Gravatar 头像緩存代码来自:http://kan.willin.org/?p=1320

评论关闭