Gravatar在中国使用的人很少,所以评论里常常会看见顶着Gravatar的丑丑的默认头像的人。但是,这部分人有很多都使用QQ邮箱,于是我想到了可以用他们的QQ头像代替。
三年前我写了一个放在functions.php里的小函数来实现这个功能,但是有些Bug。今天终于重写了一下,大家可以拿去用。
具体功能就是将没有Gravatar但使用QQ邮箱的用户的头像替换为QQ头像,我使用的是 http://q2.qlogo.cn(q2可以换成q1, q3, ...)来获取,但是我没有辨别出它对于QQ邮箱那个参数使用的加密方式,所以只能以明文的形式去请求QQ头像(貌似本来是同时支持加密和明文的)。因此,为了保护用户隐私,我只能将这些头像按照加密的文件名存到本地,顺便也就添加了Gravatar的缓存功能。
关于如何使用大家可以看GitHub页面,也可以看这。
使用方法+注意事项:
- 把"default.jpg"(就是默认头像,自己找一张)放在该目录下: ABSPATH . 'avatar/' (这其实也是缓存路径)。
- 把<?php" 和 "?>" 之间的内容加到你的主题的 "functions.php" 中。
- 确保exec()函数已启用,wget已安装。
代码:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
<?php /** * Replace the Gravatar by QQ avatar for those who do not have a Gravatar, * and cache all the avatars. * Location of cache: ABSPATH . 'avatar/' . * Please make sure that exec() is enabled. */ function my_get_avatar($avatar, $id_or_email, $size) { // Get the author's email. $email = ''; if ( is_numeric($id_or_email) ) { $id = (int) $id_or_email; $user = get_userdata($id); if ( $user ) $email = $user->user_email; } elseif ( is_object($id_or_email) ) { if ( !empty($id_or_email->user_id) ) { $id = (int) $id_or_email->user_id; $user = get_userdata($id); if ( $user) $email = $user->user_email; } elseif ( !empty($id_or_email->comment_author_email) ) { $email = $id_or_email->comment_author_email; } } else { $email = $id_or_email; } // Get the url of avatar $pattern = '/(?=http)[-\w:\/\.?&#;=]+/'; $url_count = preg_match_all($pattern, $avatar, $original_avatar_url); $avatar_size = array(); $avatar_url = array(); $pattern = '/(?<=s=)\d+/'; for ( $i = 0; $i < $url_count; ++$i) { preg_match($pattern, $original_avatar_url[0][$i], $size_array); $avatar_url[$i] = $original_avatar_url[0][$i]; $avatar_size[$i] = $size_array[0]; } // Check if the author has a gravatar. $hashkey = md5(strtolower(trim($email))); $test_url = 'http://www.gravatar.com/avatar/' . $hashkey . '?d=404'; $data = wp_cache_get($hashkey); if ( false === $data ) { $response = wp_remote_head($test_url); if( is_wp_error($response) ) { $data = 'not200'; } else { $data = $response['response']['code']; } wp_cache_set($hashkey, $data, $group = '', $expire = 60*5); } if ( $data != '200' ) { // The author doesn't have a gravatar. if ( stripos($email,"@qq.com") ) { // If he uses QQ mail, let WordPress use his QQ avatar instead. // Set the size of QQ avatar. for ( $i = 0; $i < $url_count; ++$i) { if ( $avatar_size[$i] <= 100 ) $qq_avatar_size = 100; elseif ( $size <= 140 ) $qq_avatar_size = 140; elseif ( $size <= 240 ) $qq_avatar_size = 240; else $qq_avatar_size = 640; // q1.qlogo.cn, q3.qlogo.cn, q4.qlogo.cn also work. $avatar_url[$i] = 'http://q2.qlogo.cn/g?b=qq&nk=' . $email . '&s=' . $qq_avatar_size; } } } // Unfortunately I don't know what encrypt method the QQ avatar interface accepts. // So to protect the author's privacy, I have to cache the avatars. $wp_url = get_bloginfo('wpurl'); // Caching. for ( $i = 0; $i < $url_count; ++$i) { $file_path = ABSPATH . 'avatar/' . $hashkey . '-' . $avatar_size[$i] . '.jpg'; // 1209600s = 14d, the avatars will be cached for 2 weeks. You can change the period. $lifetime = 1209600; if ( !is_file($file_path) || (time() - filemtime($file_path) ) > $lifetime) { // If the file doesn't exist or it has been out of date, then update it. // It's necessary to use "-N --no-use-server-timestamps". exec("wget -N --no-use-server-timestamps -O '" . $file_path . "' '" . $avatar_url[$i] . "' > /dev/null &"); } else $avatar = str_replace($original_avatar_url[0][$i], $wp_url . '/avatar/' . $hashkey . '-' . $avatar_size[$i] . '.jpg', $avatar); if ( filesize($file_path) < 500 ) copy($wp_url . '/avatar/default.jpg', $file_path); } return $avatar; } add_filter( 'get_avatar', 'my_get_avatar', 10, 3); ?> |
欢迎大家前来反馈!
支持一下,博主会不会看到
看看效果
测试一下效果
不起作用并向你丢了一个500
确认目录的权限配置正确了吗?
我想应该设置不了
我指的时存放头像的目录 (“WordPress 目录/avatar”) 是否具有读写权限。不过问题也很有可能是 exec() 函数被禁用导致调用的时候 500. 如果还有问题的话你贴一下详细的报错信息吧。