当前位置:首页 > 网站建设 > wordpress > WordPress判断Email是否有Gravatar头像

WordPress判断Email是否有Gravatar头像

正文索引[ 隐藏 ]

在前一篇文章中我提到了gravatar头像缓存的两难境地,实际上说到底,最重要的影响因素是验证对应的email是否有gravatar头像,这个验证的快慢直接影响加载速度。

在之前的文章中,我最后没有找到好的办法,不得不妥协,使用了一个相对来说两害相权取其轻的办法(可以参考前面的文章)。这两天我也一直在思考,也许我是有强迫症,总想着弄完美一点,经过一些探索,最终得到了一个更好的解决办法。实际上说起来就是优化了判断函数和缓存函数。

判断是否有Gravatar头像

这个函数来自wordpress的官方推荐,函数非常强大,可以通过id或者email来进行验证是否有gravatar头像:

/**
 * Utility function to check if a gravatar exists for a given email or id
 * @param int|string|object $id_or_email A user ID,  email address, or comment object
 * @return bool if the gravatar exists or not
 */

function validate_gravatar($id_or_email) {
  //id or email code borrowed from wp-includes/pluggable.php
	$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) ) {
		// No avatar for pingbacks or trackbacks
		$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
		if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) )
			return false;

		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;
	}

	$hashkey = md5(strtolower(trim($email)));
	$uri = 'http://www.gravatar.com/avatar/' . $hashkey . '?d=404';

	$data = wp_cache_get($hashkey);
	if (false === $data) {
		$response = wp_remote_head($uri);
		if( is_wp_error($response) ) {
			$data = 'not200';
		} else {
			$data = $response['response']['code'];
		}
	    wp_cache_set($hashkey, $data, $group = '', $expire = 60*5);

	}
	if ($data == '200'){
		return true;
	} else {
		return false;
	}
}

对gravatar头像缓存的优化

利用这个函数的原型,我稍微修改一点内容,然后修改了缓存函数的策略,得到下面的函数:


function jishuzh_validate_gravatar($hashkey) {
 $uri = 'http://www.gravatar.com/avatar/' . $hashkey . '?d=404';
 $data = wp_cache_get($hashkey);
 if (false === $data) {
 $response = wp_remote_head($uri);
 if( is_wp_error($response) ) {
 $data = 'not200';
 } else {
 $data = $response['response']['code'];
 }
 wp_cache_set($hashkey, $data, $group = '', $expire = 60*5);
 }
 if ($data == '200'){
 return true;
 } else {
 return false;
 }
}
function jishuzh_get_cavatar($source) {
 $time = 1209600; //The time of cache(seconds)
 preg_match('/avatar/([a-z0-9]+)?s=(d+)/',$source,$tmp);
 $abs = ABSPATH.'wp-content/themes/jishuzh/avatar/'.$tmp[1].'.jpg';
 $url = get_bloginfo('wpurl').'/wp-content/themes/jishuzh/avatar/'.$tmp[1].'.jpg';
 $default = get_bloginfo('wpurl').'/wp-content/themes/jishuzh/avatar/default.jpg';
 $hashkey=$tmp[1];
 if (!is_file($abs)||(time()-filemtime($abs))>$time){
 if(jishuzh_validate_gravatar($hashkey)){
 copy('http://www.gravatar.com/avatar/'.$tmp[1].'?s=32&d='.$default.'&r=G',$abs);}
 else {$url=$default;}
 }
 //if (filesize($abs)<500) { copy($default,$abs); }
 return '<img alt="" src="'.$url.'" class="avatar avatar-'.$tmp[2].'" width="'.$tmp[2].'" height="'.$tmp[2].'" />';
}
add_filter('get_avatar','jishuzh_get_cavatar');

通过这个函数进行优化后,查询载入的速度能够提升三倍,虽然比不进行判断要慢一点,但是还是可以接受了。

大家有更好的办法欢迎交流!

友荐云推荐
  • «
  • »
  • 作者:
    除非注明,本文原创:技术宅,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.jishuzh.com/web/wp/wordpress-validate-gravatar.html

    4 thoughts on “WordPress判断Email是否有Gravatar头像

    1. lin

      还可以吧

    2. 12356

      评论可以吗??

    3. doudoune abercrombie

      Nice post. I was checking continuously this blog and I’m impressed! Very useful information particularly the last part :) I care for such info a lot. I was looking for this particular information for a very long time. Thank you and good luck.

    4. 微笑生活

      好的办法

    评论已关闭.