I'm using a plugin called Simple Local Avatars which lets me upload author images which are stored on my server locally (no Gravatar). The plugin works fine and get_avatar returns the local avatar.

However, I need to use that avatar in different ways and different places and for that I need the local avatar image URL instead of the entire HTML tag. I could write a wrapper function for get_avatar that uses RegEx or SimpleXML to pick out and return only the URL, but I was wondering if there's any existing way to do this.

8 Answers 8


Good news for WordPress versions 4.2+

Since version 4.2 the handy get_avatar_url() function, introduced as a feature request in ticket #21195 few years ago, now ships with the core:

 * Retrieve the avatar URL.
 * @since 4.2.0
 * @param mixed $id_or_email The Gravatar to retrieve a URL for. Accepts a user_id, gravatar md5 hash,
 *                           user email, WP_User object, WP_Post object, or comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
 *     @type string $default        URL for the default image or a default type. Accepts '404' (return
 *                                  a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster),
 *                                  'wavatar' (cartoon face), 'indenticon' (the "quilt"), 'mystery', 'mm',
 *                                  or 'mysterman' (The Oyster Man), 'blank' (transparent GIF), or
 *                                  'gravatar_default' (the Gravatar logo). Default is the value of the
 *                                  'avatar_default' option, with a fallback of 'mystery'.
 *     @type bool   $force_default  Whether to always show the default image, never the Gravatar. Default false.
 *     @type string $rating         What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are
 *                                  judged in that order. Default is the value of the 'avatar_rating' option.
 *     @type string $scheme         URL scheme to use. See set_url_scheme() for accepted values.
 *                                  Default null.
 *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args
 *                                  plus a "found_avatar" guess. Pass as a reference. Default null.
 * }
 * @return false|string The URL of the avatar we found, or false if we couldn't find an avatar.
function get_avatar_url( $id_or_email, $args = null ) {
    $args = get_avatar_data( $id_or_email, $args );
    return $args['url'];

where get_avatar_data() is also a new helper function.

It contains this code part:

... CUT ...

 * Filter whether to retrieve the avatar URL early.
 * Passing a non-null value in the 'url' member of the return array will
 * effectively short circuit get_avatar_data(), passing the value through
 * the {@see 'get_avatar_data'} filter and returning early.
 * @since 4.2.0
 * @param array             $args          Arguments passed to get_avatar_data(), after processing.
 * @param int|object|string $id_or_email   A user ID, email address, or comment object.
$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
    /** This filter is documented in wp-includes/link-template.php */
    return apply_filters( 'get_avatar_data', $args, $id_or_email );

... CUT ...

where we can see that when the url parameter is set, the available filters are pre_get_avatar_data and get_avatar_data.

After upgrading to 4.2 recently, I had a problem with a theme that defined it's own version of get_avatar_url(), without any function name prefixing or a function_exists() check. So this is an example of why that's important ;-)


The answer above seems comprehensive, but I just wrote a wrapper function and moved on. Here it is if you need it (put this in functions.php):

function get_avatar_url($get_avatar){
    preg_match("/src='(.*?)'/i", $get_avatar, $matches);
    return $matches[1];

and then use it wherver you need it in the template files like this:

<img src="<? echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />

It's just simpler.

Using RegEx to parse HTML in this case is okay, because this will only be parsing one img tag, so it won't be too costly.

  • 5
    A small change... the get_avatar function puts the src within " not ' so the match will be null. The regex should be preg_match('/src="(.*?)"/i', $get_avatar, $matches);
    – spdaly
    Sep 17, 2014 at 12:43
  • thanks @spdaly - i hope commenting would make the author to edit ;) - thanks aalaap
    – Sagive
    Dec 21, 2014 at 3:04
  • If you answered your own question please mark it as the accepted answer.
    – user9447
    Aug 1, 2016 at 17:20
  • @Darth_Vader I haven't gone back to this since I posted the question, so I'm no longer sure if this is the ideal way to do it. I think the new answer about 4.2+ is better.
    – aalaap
    Aug 2, 2016 at 4:02

You can use the filter get_avatar for get all data to the avatar, also the url inside the markup. I think, WP don`t have an function for return only the url if the avatar image.

$avatar = "<img alt='{$safe_alt}' src='{$default}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";

apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);

Also you can rewrite this function inside an plugin or theme, the function is onyl active, if this function name is not on other place defined.

if ( ! function_exists( 'get_avatar' ) ) :

So it is possible to add an param for return only the url of the image, like this, use the param $url with TRUE and you get only the url.

 * Retrieve the avatar for a user who provided a user ID or email address.
 * @since 2.5
 * @param int|string|object $id_or_email A user ID,  email address, or comment object
 * @param int $size Size of the avatar image
 * @param string $default URL to a default image to use if no avatar is available
 * @param string $alt Alternate text to use in image tag. Defaults to blank
 * @param boolean $url, true for get only the url of the image, no markup
 * @return string <img> tag for the user's avatar
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false, $url = FALSE ) {
    if ( ! get_option('show_avatars') )
        return false;

    if ( false === $alt)
        $safe_alt = '';
        $safe_alt = esc_attr( $alt );

    if ( !is_numeric($size) )
        $size = '96';

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

    if ( empty($default) ) {
        $avatar_default = get_option('avatar_default');
        if ( empty($avatar_default) )
            $default = 'mystery';
            $default = $avatar_default;

    if ( !empty($email) )
        $email_hash = md5( strtolower( trim( $email ) ) );

    if ( is_ssl() ) {
        $host = 'https://secure.gravatar.com';
    } else {
        if ( !empty($email) )
            $host = sprintf( "http://%d.gravatar.com", ( hexdec( $email_hash[0] ) % 2 ) );
            $host = 'http://0.gravatar.com';

    if ( 'mystery' == $default )
        $default = "$host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('[email protected]')
    elseif ( 'blank' == $default )
        $default = includes_url('images/blank.gif');
    elseif ( !empty($email) && 'gravatar_default' == $default )
        $default = '';
    elseif ( 'gravatar_default' == $default )
        $default = "$host/avatar/?s={$size}";
    elseif ( empty($email) )
        $default = "$host/avatar/?d=$default&amp;s={$size}";
    elseif ( strpos($default, 'http://') === 0 )
        $default = add_query_arg( 's', $size, $default );

    if ( !empty($email) ) {
        $out = "$host/avatar/";
        $out .= $email_hash;
        $out .= '?s='.$size;
        $out .= '&amp;d=' . urlencode( $default );

        $rating = get_option('avatar_rating');
        if ( !empty( $rating ) )
            $out .= "&amp;r={$rating}";

        if ( $url )
            $avatar = $out;
            $avatar = "<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
    } else {
        if ( $url )
            $avatar = $out;
            $avatar = "<img alt='{$safe_alt}' src='{$default}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);

Another small variant is, that you create the url with the rule of Gravatar.

function get_gravatar_url( $email ) {

    $hash = md5( strtolower( trim ( $email ) ) );
    return 'http://gravatar.com/avatar/' . $hash;

use this on your source with the emails of authors and you get the url of there image.


I think this a better version of aalaap's answer:

// In your template ...
$avatar_url = get_avatar_url ( get_the_author_meta('ID'), $size = '50' ); 

// Get src URL from avatar <img> tag (add to functions.php)
function get_avatar_url($author_id, $size){
    $get_avatar = get_avatar( $author_id, $size );
    preg_match("/src='(.*?)'/i", $get_avatar, $matches);
    return ( $matches[1] );
get_user_meta($userId, 'simple_local_avatar');

Simple Local Avatars uses meta fields to store the avatar, so you can simply retrieve the value(s) by calling get_user_meta and grabbing the 'simple_local_avatar' field. You'll get returned an array like so:

  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'

alaap's method doesn't work anymore in Wordpress 4.2

I came up with a solution. Here it is and it's working good:

 function my_gravatar_url() { // Get user email
$user_email = get_the_author_meta( 'user_email' );
// Convert email into md5 hash and set image size to 80 px
$user_gravatar_url = 'http://www.gravatar.com/avatar/' . md5($user_email) . '?s=80';
echo $user_gravatar_url; } 

in Template just use:

<?php my_gravatar_url() ?>

Notice: it must be used inside a loop.


When the avatar has been uploaded locally, WP, returns the img tag with the src attribute in double quotes, so I found this pattern worked better:

preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);

A few hours ago, I was wondering how to do that too. But, soon I got the solution and made a plugin, please check whether get_avatar_url($user_id, $size) works for you or not. Thanks..

Plugin code:

Plugin Name: Get Avatar URL
Plugin URI: https://github.com/faizan1041/get-avatar-url
Description: get_avatar returns image, get_avatar_url will give you the image src.
Author: Faizan Ali
Version: 1.0
Author URI: https://github.com/faizan1041/
License: GPL v2+

function get_avatar_url($user_id, $size) {
    $avatar_url = get_avatar($user_id, $size);
    $doc = new DOMDocument();
    $xpath = new DOMXPath($doc);
    $src = $xpath->evaluate("string(//img/@src)");
    return $src;

function sc_get_avatar_url( $atts ) {
    $atts = shortcode_atts( array(
        'email' => '',
        'size' => 150
    ), $atts, 'avatar_url' );

    return get_avatar_url($atts['email'],$atts['size']);
add_shortcode( 'avatar_url', 'sc_get_avatar_url' );


Calling the function:

get_avatar_url( get_the_author_meta( 'user_email'), 150);

Using Shortcode:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.