Currently I'm using Simple Local Avatars on several of my blogs allowing people to upload their own custom avatar.

As far as I know Simple Local Avatars uses get_avatar to check whether a custom avatar is selected, if not defaults to Gravatar.com.

Would it be possible to disable the Gravatar.com bit somehow, disabling Gravatar.com completely and returning just some local hosted image if no custom avatar is selected?

I hope it would be OK to post this here, but this would be the Simple Local Avatars file

Plugin Name: Simple Local Avatars
Plugin URI: http://www.get10up.com/plugins/simple-local-avatars-wordpress/
Description: Adds an avatar upload field to user profiles if the current user has media permissions. Generates requested sizes on demand just like Gravatar! Simple and lightweight.
Version: 1.2.3
Author: Jake Goldman (10up), Oomph Inc
Author URI: http://www.get10up.com

// add field to user profiles
class simple_local_avatars {
    function simple_local_avatars() {
        add_filter('get_avatar', array($this, 'get_avatar'), 10, 5);
        add_action('admin_init', array($this, 'admin_init'));
        add_action('show_user_profile', array($this, 'edit_user_profile'));
        add_action('edit_user_profile', array($this, 'edit_user_profile'));
        add_action('personal_options_update', array($this, 'edit_user_profile_update'));
        add_action('edit_user_profile_update', array($this, 'edit_user_profile_update'));
        add_filter('avatar_defaults', array($this, 'avatar_defaults'));

    function get_avatar($avatar = '', $id_or_email, $size = '96', $default = '', $alt = false) {
        if (is_numeric($id_or_email))
            $user_id = (int) $id_or_email;
        elseif (is_string($id_or_email)) {
            if ($user = get_user_by_email($id_or_email))
                $user_id = $user->ID;
        } elseif (is_object($id_or_email) && !empty($id_or_email->user_id))
            $user_id = (int) $id_or_email->user_id;
        if (!empty($user_id))
            $local_avatars = get_user_meta($user_id, 'simple_local_avatar', true);
        if (!isset($local_avatars) || empty($local_avatars) || !isset($local_avatars['full'])) {
            if (!empty($avatar)) // if called by filter
                return $avatar;
            remove_filter('get_avatar', 'get_simple_local_avatar');
            $avatar = get_avatar($id_or_email, $size, $default);
            add_filter('get_avatar', 'get_simple_local_avatar', 10, 5);
            return $avatar;
        if (!is_numeric($size)) // ensure valid size
            $size = '96';
        if (empty($alt))
            $alt = get_the_author_meta('display_name', $user_id);
        // generate a new size
        if (empty($local_avatars[$size])) {
            $upload_path = wp_upload_dir();
            $avatar_full_path = str_replace($upload_path['baseurl'], $upload_path['basedir'], $local_avatars['full']);
            $image_sized = image_resize($avatar_full_path, $size, $size, true);
            if (is_wp_error($image_sized)) // deal with original being >= to original image (or lack of sizing ability)
                $local_avatars[$size] = $local_avatars['full'];
                $local_avatars[$size] = str_replace($upload_path['basedir'], $upload_path['baseurl'], $image_sized);
            update_user_meta($user_id, 'simple_local_avatar', $local_avatars);
        } elseif (substr($local_avatars[$size], 0, 4) != 'http')
            $local_avatars[$size] = site_url($local_avatars[$size]);
        $author_class = is_author($user_id) ? ' current-author' : '';
        $avatar = "<img alt='" . esc_attr($alt) . "' src='" . $local_avatars[$size] . "' class='avatar avatar-{$size}{$author_class} photo' height='{$size}' width='{$size}' />";
        return $avatar;

    function admin_init() {
        load_plugin_textdomain('simple-local-avatars', false, dirname(plugin_basename(__FILE__)) . '/localization/');
        register_setting('discussion', 'simple_local_avatars_caps', array($this, 'sanitize_options'));
        add_settings_field('simple-local-avatars-caps', __('Local Avatar Permissions', 'simple-local-avatars'), array($this, 'avatar_settings_field'), 'discussion', 'avatars');

    function sanitize_options($input) {
        $new_input['simple_local_avatars_caps'] = empty($input['simple_local_avatars_caps']) ? 0 : 1;
        return $new_input;

    function avatar_settings_field($args) {
        $options = get_option('simple_local_avatars_caps');
        echo '
            <label for="simple_local_avatars_caps">
                <input type="checkbox" name="simple_local_avatars_caps" id="simple_local_avatars_caps" value="1" ' . @checked($options['simple_local_avatars_caps'], 1, false) . ' />
                ' . __('Only allow users with file upload capabilities to upload local avatars (Authors and above)', 'simple-local-avatars') . '

    function edit_user_profile($profileuser) {
        <h3><?php _e('Avatar', 'simple-local-avatars'); ?></h3>
        <table class="form-table">
                <th><label for="simple-local-avatar"><?php _e('Upload Avatar', 'simple-local-avatars'); ?></label></th>
                <td style="width: 50px;" valign="top">
                    <?php echo get_avatar($profileuser->ID); ?>
                    $options = get_option('simple_local_avatars_caps');
                    if (empty($options['simple_local_avatars_caps']) || current_user_can('upload_files')) {
                        wp_nonce_field('simple_local_avatar_nonce', '_simple_local_avatar_nonce', false);
                    <input type="file" name="simple-local-avatar" id="simple-local-avatar" /><br />
                    if (empty($profileuser->simple_local_avatar))
                        echo '<span class="description">' . __('No local avatar is set. Use the upload field to add a local avatar.', 'simple-local-avatars') . '</span>';
                        echo '
                            <input type="checkbox" name="simple-local-avatar-erase" value="1" /> ' . __('Delete local avatar', 'simple-local-avatars') . '<br />
                            <span class="description">' . __('Replace the local avatar by uploading a new avatar, or erase the local avatar (falling back to a gravatar) by checking the delete option.', 'simple-local-avatars') . '</span>
                    } else {
                        if (empty($profileuser->simple_local_avatar))
                            echo '<span class="description">' . __('No local avatar is set. Set up your avatar at Gravatar.com.', 'simple-local-avatars') . '</span>';
                            echo '<span class="description">' . __('You do not have media management permissions. To change your local avatar, contact the blog administrator.', 'simple-local-avatars') . '</span>';
        <script type="text/javascript">
            var form = document.getElementById('your-profile');
            form.encoding = 'multipart/form-data';
            form.setAttribute('enctype', 'multipart/form-data');

    function edit_user_profile_update($user_id) {
        if (!wp_verify_nonce($_POST['_simple_local_avatar_nonce'], 'simple_local_avatar_nonce')) //security
        if (!empty($_FILES['simple-local-avatar']['name'])) {
            $mimes = array(
                'jpg|jpeg|jpe' => 'image/jpeg',
                'gif' => 'image/gif',
                'png' => 'image/png',
                'bmp' => 'image/bmp',
                'tif|tiff' => 'image/tiff'
            $avatar = wp_handle_upload($_FILES['simple-local-avatar'], array('mimes' => $mimes, 'test_form' => false));
            if (empty($avatar['file'])) // handle failures
                switch ($avatar['error']) {
                    case 'File type does not meet security guidelines. Try another.':
                        add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error",__("Please upload a valid image file for the avatar.","simple-local-avatars"));'));
                        add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error","<strong>".__("There was an error uploading the avatar:","simple-local-avatars")."</strong> ' . esc_attr($avatar['error']) . '");'));
            $this->avatar_delete($user_id); // delete old images if successful
            update_user_meta($user_id, 'simple_local_avatar', array('full' => $avatar['url'])); // save user information (overwriting old)
        } elseif (isset($_POST['simple-local-avatar-erase']) && $_POST['simple-local-avatar-erase'] == 1)

    // remove the custom get_avatar hook for the default avatar list output on options-discussion.php
    function avatar_defaults($avatar_defaults) {
        remove_action('get_avatar', array($this, 'get_avatar'));
        return $avatar_defaults;

    // delete avatars based on user_id
    function avatar_delete($user_id) {
        $old_avatars = get_user_meta($user_id, 'simple_local_avatar', true);
        $upload_path = wp_upload_dir();
        if (is_array($old_avatars)) {
            foreach ($old_avatars as $old_avatar) {
                $old_avatar_path = str_replace($upload_path['baseurl'], $upload_path['basedir'], $old_avatar);
        delete_user_meta($user_id, 'simple_local_avatar');

$simple_local_avatars = new simple_local_avatars;
if (!function_exists('get_simple_local_avatar')):
 * more efficient to call simple local avatar directly in theme and avoid gravatar setup
 * @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
 * @return string <img> tag for the user's avatar
    function get_simple_local_avatar($id_or_email, $size = '96', $default = '', $alt = false) {
        global $simple_local_avatars;
        return $simple_local_avatars->get_avatar('', $id_or_email, $size, $default, $alt);

// on uninstallation, remove the custom field from the users and delete the local avatars
register_uninstall_hook(__FILE__, 'simple_local_avatars_uninstall');

function simple_local_avatars_uninstall() {
    $simple_local_avatars = new simple_local_avatars;
    $users = get_users_of_blog();
    foreach ($users as $user)

If you want a super-lightweight solution and don't mind dabbling in a little code, drop this in your functions.php;

function __default_local_avatar()
    // this assumes default_avatar.png is in wp-content/themes/active-theme/images
    return get_bloginfo('template_directory') . '/images/default_avatar.png';
add_filter( 'pre_option_avatar_default', '__default_local_avatar' );

Alternatively, if you want a bit more juice, with the ability to manage everything in the admin, check out Add New Default Avatar.

UPDATE: I wrote a quick plugin to be used alongside Simple Local Avatars.


 * Plugin Name: Disable Default Avatars
 * Plugin URI: http://wordpress.stackexchange.com/questions/17413
 * Description: To be used alongside <a href="http://www.get10up.com/plugins/simple-local-avatars-wordpress/">Simple Local Avatars</a>, disabling all default avatars and falling back to a single image. Use the filter <code>local_default_avatar</code> to set the path of the image.
 * Version: 1.0
 * Author: TheDeadMedic
 * Author URI: http://wordpress.stackexchange.com/users/1685/thedeadmedic

if ( !function_exists( 'get_avatar' ) ) :
 * 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
 * @return string <img> tag for the user's avatar
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
    if ( ! get_option('show_avatars') )
        return false;

    static $default_url; // use static vars for a little caching
    if ( !isset( $default_url ) )
        $default_url = apply_filters( 'local_default_avatar', get_template_directory_uri() . '/images/default_avatar.png' );

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

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

    $avatar = "<img alt='{$safe_alt}' src='{$default_url}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
    return apply_filters( 'get_avatar', $avatar, $id_or_email, $size, $default, $alt );

function __limit_default_avatars_setting( $default )
    return 'local_default';
add_filter( 'pre_option_avatar_default', '__limit_default_avatars_setting' );

if ( is_admin() ) :
function __limit_default_avatars( $defaults )
    return array( 'local_default' => get_bloginfo( 'name' ) . ' Default' );
add_filter( 'avatar_defaults', '__limit_default_avatars' );


The plugin description should be self-explanatory, but essentially the default avatar is http://wordpress-theme-path/images/default_avatar.png, which can be filtered in your theme's functions.php if it exists elsewhere;

function __my_theme_default_avatar( $url )
    return 'http://somewhere/else.jpg';
add_filter( 'local_default_avatar', '__my_theme_default_avatar' );
  • Almost :) This sets a new default avatar, instead of ie. the mystery man. Would it be possible to disable Gravatar support completely as well, and just be able to choose between yours and Simple Local Avatars? – user5424 May 17 '11 at 10:52
  • Check my revised answer. – TheDeadMedic May 19 '11 at 10:37
  • Hi DeadMedic, In short, you're awesome (: More than appreciated! – user5424 May 19 '11 at 17:33

I successfully replaced all gravitar.com avatars with my own locally hosted avatar image by adding this to my theme's function.php file:

define('DEFAULT_AVATAR_URL', get_template_directory_uri() . '/images/user.png');

function no_gravatars( $avatar ) {
    return preg_replace( "/http.*?gravatar\.com[^\']*/", DEFAULT_AVATAR_URL, $avatar );
add_filter( 'get_avatar', 'no_gravatars' );

This assumes you have a local default avatar called user.png in your theme's images subdirectory.

In the discussion settings admin panel, make sure "Show Avatars" is ticked.

I haven't tested this with Simple Local Avatars, but it works great with Basic User Avatars (which is a lightweight fork of Simple Local Avatars).

TIP: If you're designing your own default avatar, I recommend making it 300x300 pixels so it will look good on "retina" screens when WP displays it at "150x150". Then you can significantly reduce the filesize of the image by compressing it at tinyPNG.com.


Remove avatars completely. Put this code in functions.php from your theme in use.

add_action( 'init', 'qmas_remove_avatars' );
if (!function_exists('qmas_remove_avatars')) {
    function qmas_remove_avatars() {
        add_filter( 'bp_core_fetch_avatar', function () { return ''; } );
        add_filter( 'get_avatar', function () { return ''; } );
        add_filter( 'bp_get_signup_avatar', function () { return ''; } );
  • Can you explain a little bit more as how it helps. – bravokeyl Nov 19 '16 at 3:21
  • Replaces the IMG tag with an empty string. Also returns an empty string in the avatar url. Leaving default wordpress assigned – Bryan Contreras Nov 20 '16 at 0:36
  • NOTA I do not know much English, sometimes I use a translator. – Bryan Contreras Nov 20 '16 at 0:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy