Check whether a Gravatar exists for a specific e-mail

Published January 29, 2021
Check whether a Gravatar exists for a specific e-mail

Gravatar is a great tool for getting avatars and profile images associated with a specific e-mailaddress. By default, if somebody has specified an image for their e-mail, that image can easily be retrieved. If the user doesn’t have an e-mail, Gravatar will return a standard image.

But what if you don’t want that default image? Gravatar has no easy option to check whether an image exists. WordPress has a function for this, called has_avatar(), but that function is not much of a use, because it also returns true when Gravatar gives you the standard image.

Fortunately, there’s a smart way in PHP to check if a Gravatar exists for a specific e-mailaddress. The method could come in very handy if you’re in WordPress and want to output comments in a custom format.

Anyway, let’s get started!

Function to validate an e-mail

To check whether a Gravatar exists, we’ll write a function that can be reused. The function is called validate_gravatar($email) and it takes the e-mailaddress needed to validate as a parameter.

The function sends a request to the Gravatar database. If the request returns a custom avatar, the $has_valid_avatar will be set to true. If not, the $has_valid_avatar will be set to false.

Finally, the function returns the value of the $has_valid_avatar variable. This means that the function output will always be a simple boolean.

function validate_gravatar($email) {
	// Craft a potential url and test its headers
	$hash = md5(strtolower(trim($email)));

	$uri = 'http://www.gravatar.com/avatar/' . $hash . '?d=404';
	$headers = @get_headers($uri);

	if (!preg_match("|200|", $headers[0])) {
		$has_valid_avatar = false;
	} else {
		$has_valid_avatar = true;
	}

	return $has_valid_avatar;
}

You should place the above function in the file you need to use it in. So if you’re using it in functions.php, place it there.

Using the validate Gravatar e-mail with the WordPress comments – example

Now that we have a handy function to check if a Gravatar exists, how do we use it? I like to define the following three variables when I want to use this in WordPress when I’m creating a custom WordPress comments walker.

First, we’ll get the email of the comment author. Then, we’ll check whether that person has his own Gravatar. Now you can use the $rjs_has_gravatar variable with a simple php if-statement. Last, we’ll get the avatar and store it in a variable.

$rjs_comment_email = get_comment_author_email(); 
$rjs_has_gravatar = validate_gravatar($rjs_comment_email); 
$rjs_gravatar = get_avatar( $rjs_comment_email, 160 );

Note: the third step is optional. I like to do it like this, because it makes the code more clear.

If you’ve declared those three variables, you could use them like this to display the avatar <img> tag. The get_avatar() function gets that tag (function in Codex).

<?php if ($rjs_has_gravatar) { echo $rjs_gravatar; } ?>

You could also use it to show or hide the <img> tag plus a container.

<?php if (get_option('show_avatars', true) && $rjs_has_gravatar) : ?>

<div class="rjs-comment-authorimage"> <!-- Container -->
	<?php if ($rjs_gravatar) { echo $rjs_gravatar; } ?> <!-- <img> tag -->
</div> <!-- Container closing tags -->

<?php endif; ?>

Conclusion

As you see, it’s very easy to check with PHP and/or WordPress whether there exists a Gravatar. The technique can be used both on WordPress and non-WordPress situations, so it’s very versatile. If you’re using this code in a non-WordPress situation, make sure to check whether the functions used in the examples are available.

Image Ralph J. Smit
Ralph is a designer gone developer. He happily lives in the Netherlands. His passion for good design drove him towards development, because he felt that no-code tools were too limiting. On this blog, Ralph writes the articles he would've wanted to have during his continual developer journey. → Follow on Twitter

Comments

Leave a reply

Your email address will not be published. Required fields are marked *