get_avatar_data

The timeline below displays how wordpress function get_avatar_data has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to use instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @type string $default        URL for the default image or a default type. Accepts:
 *                                  - '404' (return a 404 instead of a default image)
 *                                  - 'retro' (a 8-bit arcade-style pixelated face)
 *                                  - 'robohash' (a robot)
 *                                  - 'monsterid' (a monster)
 *                                  - 'wavatar' (a cartoon face)
 *                                  - 'identicon' (the "quilt", a geometric pattern)
 *                                  - 'mystery', 'mm', or 'mysteryman' (The Oyster Man)
 *                                  - 'blank' (transparent GIF)
 *                                  - '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' (suitable for all audiences)
 *                                  - 'PG' (possibly offensive, usually for audiences 13 and above)
 *                                  - 'R' (intended for adult audiences above 17)
 *                                  - 'X' (even more mature than above)
 *                                  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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized.
 *                                  Default empty.
 * }
 * @return array {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool         $found_avatar True if an avatar was found for this user,
 *                                      false or not set if none was found.
 *     @type string|false $url          The URL of the avatar that was found, or false.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // If used, should be a reference.
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    $args = apply_filters('pre_get_avatar_data', $args, $id_or_email);
    if (isset($args['url'])) {
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters('get_avatar_data', $args, $id_or_email);
    }
    $email_hash = '';
    $user = false;
    $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (str_contains($id_or_email, '@md5.gravatar.com')) {
            // MD5 hash.
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // Email address.
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User object.
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post object.
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        if (!is_avatar_comment_type(get_comment_type($id_or_email))) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 6.3

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to use instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool         $found_avatar True if an avatar was found for this user,
 *                                      false or not set if none was found.
 *     @type string|false $url          The URL of the avatar that was found, or false.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // If used, should be a reference.
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    $args = apply_filters('pre_get_avatar_data', $args, $id_or_email);
    if (isset($args['url'])) {
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters('get_avatar_data', $args, $id_or_email);
    }
    $email_hash = '';
    $user = false;
    $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (str_contains($id_or_email, '@md5.gravatar.com')) {
            // MD5 hash.
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // Email address.
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User object.
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post object.
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        if (!is_avatar_comment_type(get_comment_type($id_or_email))) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 6.1

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to use instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool         $found_avatar True if an avatar was found for this user,
 *                                      false or not set if none was found.
 *     @type string|false $url          The URL of the avatar that was found, or false.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // If used, should be a reference.
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    $args = apply_filters('pre_get_avatar_data', $args, $id_or_email);
    if (isset($args['url'])) {
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters('get_avatar_data', $args, $id_or_email);
    }
    $email_hash = '';
    $user = false;
    $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // MD5 hash.
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // Email address.
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User object.
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post object.
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        if (!is_avatar_comment_type(get_comment_type($id_or_email))) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 5.4

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // If used, should be a reference.
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    $args = apply_filters('pre_get_avatar_data', $args, $id_or_email);
    if (isset($args['url'])) {
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters('get_avatar_data', $args, $id_or_email);
    }
    $email_hash = '';
    $user = false;
    $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // MD5 hash.
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // Email address.
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User object.
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post object.
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        if (!is_avatar_comment_type(get_comment_type($id_or_email))) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 5.3

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
 *                           user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // if used, should be a reference
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    $args = apply_filters('pre_get_avatar_data', $args, $id_or_email);
    if (isset($args['url'])) {
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters('get_avatar_data', $args, $id_or_email);
    }
    $email_hash = '';
    $user = false;
    $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // md5 hash
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // email address
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User Object
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post Object
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        if (!is_avatar_comment_type(get_comment_type($id_or_email))) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user ID, Gravatar MD5 hash,
     *                           user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 5.1

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
 *                            user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array $processed_args {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // if used, should be a reference
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    $args = apply_filters('pre_get_avatar_data', $args, $id_or_email);
    if (isset($args['url'])) {
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters('get_avatar_data', $args, $id_or_email);
    }
    $email_hash = '';
    $user = $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // md5 hash
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // email address
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User Object
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post Object
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        if (!is_avatar_comment_type(get_comment_type($id_or_email))) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 4.6

/**
 * Retrieves default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
 *                            user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array $processed_args {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // if used, should be a reference
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * Filters 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 mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_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);
    }
    $email_hash = '';
    $user = $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // md5 hash
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // email address
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User Object
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post Object
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        /**
         * Filters the list of allowed comment types for retrieving avatars.
         *
         * @since 3.0.0
         *
         * @param array $types An array of content types. Default only contains 'comment'.
         */
        $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)) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filters the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filters the avatar data.
     *
     * @since 4.2.0
     *
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 4.4

/**
 * Retrieve default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
 *                            user email, WP_User object, WP_Post object, or WP_Comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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 'mysteryman' (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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array $processed_args {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // if used, should be a reference
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * 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 mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_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);
    }
    $email_hash = '';
    $user = $email = false;
    if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        $id_or_email = get_comment($id_or_email);
    }
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // md5 hash
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // email address
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User Object
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post Object
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif ($id_or_email instanceof WP_Comment) {
        /**
         * Filter the list of allowed comment types for retrieving avatars.
         *
         * @since 3.0.0
         *
         * @param array $types An array of content types. Default only contains 'comment'.
         */
        $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)) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filter the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string $url         The URL of the avatar.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filter the avatar data.
     *
     * @since 4.2.0
     *
     * @param array  $args        Arguments passed to get_avatar_data(), after processing.
     * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,
     *                            user email, WP_User object, WP_Post object, or WP_Comment object.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 4.3

/**
 * Retrieve default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to check the data against. 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 image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array $processed_args {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // if used, should be a reference
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * 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);
    }
    $email_hash = '';
    $user = $email = false;
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // md5 hash
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // email address
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User Object
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post Object
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        // Comment Object
        /**
         * Filter the list of allowed comment types for retrieving avatars.
         *
         * @since 3.0.0
         *
         * @param array $types An array of content types. Default only contains 'comment'.
         */
        $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)) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    if (is_ssl()) {
        $url = 'https://secure.gravatar.com/avatar/' . $email_hash;
    } else {
        $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    }
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filter the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string            $url         The URL of the avatar.
     * @param int|object|string $id_or_email A user ID, email address, or comment object.
     * @param array             $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filter the avatar data.
     *
     * @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.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}

WordPress Version: 4.2

/**
 * Retrieve default data about the avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to check the data against. 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 image file in pixels. Default 96.
 *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.
 *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.
 *     @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.
 *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.
 * }
 * @return array $processed_args {
 *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.
 *
 *     @type bool   $found_avatar True if we were able to find an avatar for this user,
 *                                false or not set if we couldn't.
 *     @type string $url          The URL of the avatar we found.
 * }
 */
function get_avatar_data($id_or_email, $args = null)
{
    $args = wp_parse_args($args, array(
        'size' => 96,
        'height' => null,
        'width' => null,
        'default' => get_option('avatar_default', 'mystery'),
        'force_default' => false,
        'rating' => get_option('avatar_rating'),
        'scheme' => null,
        'processed_args' => null,
        // if used, should be a reference
        'extra_attr' => '',
    ));
    if (is_numeric($args['size'])) {
        $args['size'] = absint($args['size']);
        if (!$args['size']) {
            $args['size'] = 96;
        }
    } else {
        $args['size'] = 96;
    }
    if (is_numeric($args['height'])) {
        $args['height'] = absint($args['height']);
        if (!$args['height']) {
            $args['height'] = $args['size'];
        }
    } else {
        $args['height'] = $args['size'];
    }
    if (is_numeric($args['width'])) {
        $args['width'] = absint($args['width']);
        if (!$args['width']) {
            $args['width'] = $args['size'];
        }
    } else {
        $args['width'] = $args['size'];
    }
    if (empty($args['default'])) {
        $args['default'] = get_option('avatar_default', 'mystery');
    }
    switch ($args['default']) {
        case 'mm':
        case 'mystery':
        case 'mysteryman':
            $args['default'] = 'mm';
            break;
        case 'gravatar_default':
            $args['default'] = false;
            break;
    }
    $args['force_default'] = (bool) $args['force_default'];
    $args['rating'] = strtolower($args['rating']);
    $args['found_avatar'] = false;
    /**
     * 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);
    }
    $email_hash = '';
    $user = $email = false;
    // Process the user identifier.
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', absint($id_or_email));
    } elseif (is_string($id_or_email)) {
        if (strpos($id_or_email, '@md5.gravatar.com')) {
            // md5 hash
            list($email_hash) = explode('@', $id_or_email);
        } else {
            // email address
            $email = $id_or_email;
        }
    } elseif ($id_or_email instanceof WP_User) {
        // User Object
        $user = $id_or_email;
    } elseif ($id_or_email instanceof WP_Post) {
        // Post Object
        $user = get_user_by('id', (int) $id_or_email->post_author);
    } elseif (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
        // Comment Object
        /**
         * Filter the list of allowed comment types for retrieving avatars.
         *
         * @since 3.0.0
         *
         * @param array $types An array of content types. Default only contains 'comment'.
         */
        $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)) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters('get_avatar_data', $args, $id_or_email);
        }
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', (int) $id_or_email->user_id);
        }
        if ((!$user || is_wp_error($user)) && !empty($id_or_email->comment_author_email)) {
            $email = $id_or_email->comment_author_email;
        }
    }
    if (!$email_hash) {
        if ($user) {
            $email = $user->user_email;
        }
        if ($email) {
            $email_hash = md5(strtolower(trim($email)));
        }
    }
    if ($email_hash) {
        $args['found_avatar'] = true;
        $gravatar_server = hexdec($email_hash[0]) % 3;
    } else {
        $gravatar_server = rand(0, 2);
    }
    $url_args = array('s' => $args['size'], 'd' => $args['default'], 'f' => $args['force_default'] ? 'y' : false, 'r' => $args['rating']);
    $url = sprintf('http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash);
    $url = add_query_arg(rawurlencode_deep(array_filter($url_args)), set_url_scheme($url, $args['scheme']));
    /**
     * Filter the avatar URL.
     *
     * @since 4.2.0
     *
     * @param string            $url         The URL of the avatar.
     * @param int|object|string $id_or_email A user ID, email address, or comment object.
     * @param array             $args        Arguments passed to get_avatar_data(), after processing.
     */
    $args['url'] = apply_filters('get_avatar_url', $url, $id_or_email, $args);
    /**
     * Filter the avatar data.
     *
     * @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.
     */
    return apply_filters('get_avatar_data', $args, $id_or_email);
}