3

I've added functionality to upload profile picture by following THIS guide.

I can't find an online guide or any documentation about WP hooks.. How to replace Gravatar profile pictures (in comment section) with custom uploaded images?

I don't want to force my users to register Gravatar in order to change their profile picture on my site.

  • Have you considered Buddypress? – Arctoran Nov 23 '15 at 6:38
  • so you prefer to force them potentially to upload an image on every site? I am not a fan of gravatar but this is exactly the one (and only) problem that it solves. – Mark Kaplun Nov 23 '15 at 8:37
  • @MarkKaplun using get_avatar filter, users can still use gravatar. See my answer. I usually don't recomend third party plugins, even less if it has not been update for a long time, but local simple avatar does a good job and it also adds audience ratings to local avatars given a complete solution. It can be a very good starting point for your own plugin. – cybmeta Nov 23 '15 at 10:05
  • @cybmeta, sure it is possible and useful, I just question the logic of doing it in the context of the question. It is probably easier to get an image on gravater than whatever @ Noob will use as his implementation. If the reason is not related to privacy or moderation then I don't see how a local solution can be better then gravatar. To me today it makes more sense to let the user use his FB, twitter or google avatar if your main concern is just user convenience.. – Mark Kaplun Nov 23 '15 at 10:19
  • 1
    No one said it is better ;). Personally I like the idea to not force your users to use a third party service, gravatar, facebook or any other, if they want to have a full experience in your site. Of course using popular social networks services can be a gain for your site, but offer a full experience to your users also. It is not better or worst, just a choice that we can take as owner of the website. And the context of the question was not to force to upload local avatars, it was the opposite, to not force to use gravatar (it can be extended to not force the use of a third party service). – cybmeta Nov 23 '15 at 10:23
-2

If you are set your custom or uploaded profile picture and need to see on front end, you can use below function .

<?php echo get_avatar( $id_or_email, $size, $default, $alt, $args ); ?> 

If you have to change your gravatar to custom profile picture you can refer below link : http://www.wpbeginner.com/wp-tutorials/how-to-change-the-default-gravatar-on-wordpress/

  • 4
    downvoted as basically the answer is "go read some external resource" which might be useful at the time of writing, but not available later. Answers should be self contained as much as possible. – Mark Kaplun Nov 16 '17 at 15:46
6

Presuming that the user has their avatar saved, as the ID of an attachment, store in user meta, as the field field_with_custom_avatar_id, you could do this to show that attachment if the value is saved:

add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {

    //If is email, try and find user ID
    if( ! is_numeric( $id_or_email ) && is_email( $id_or_email ) ){
        $user  =  get_user_by( 'email', $id_or_email );
        if( $user ){
            $id_or_email = $user->ID;
        }
    }

    //if not user ID, return
    if( ! is_numeric( $id_or_email ) ){
        return $avatar;
    }

    //Find ID of attachment saved user meta
    $saved = get_user_meta( $id_or_email, 'field_with_custom_avatar_id', true );
    if( 0 < absint( $saved ) ) {
        //return saved image
        return wp_get_attachment_image( $saved, [ $size, $size ], false, ['alt' => $alt] );
    }

    //return normal
    return $avatar;

}

Or, if it is saved as a URL of the image, in the user meta field field_with_custom_avatar -

add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {

    //If is email, try and find user ID
    if( ! is_numeric( $id_or_email ) && is_email( $id_or_email ) ){
        $user  =  get_user_by( 'email', $id_or_email );
        if( $user ){
            $id_or_email = $user->ID;
        }
    }

    //if not user ID, return
    if( ! is_numeric( $id_or_email ) ){
        return $avatar;
    }

    //Find URL of saved avatar in user meta
    $saved = get_user_meta( $id_or_email, 'field_with_custom_avatar', true );
    //check if it is a URL
    if( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
        //return saved image
        return sprintf( '<img src="%" alt="%" />', esc_url( $saved ), esc_attr( $alt ) );
    }

    //return normal
    return $avatar;

}
  • 1
    ... the dreaded $id_or_email ;-) Hopefully we can make it easier to handle, with the proposed changes in #41544. – birgire Nov 16 '17 at 16:47
  • Hello. I make your snippet for get_avatar_url filter. It works all places without comment_list. It says strlen() expects parameter 1 to be string, object given in /home/my_theme/public_html/wp-includes/formatting.php on line 2891 – bilimokur Dec 25 '18 at 13:34
4

The hook you need is the get_avatar filter. It returs the image HTML element representing the user avatar.

add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {

    // Replace $avatar with your own image element, for example
    // $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"

    return $avatar;

}

Note that using this filter, you can still let users use gravatar. You could check if the user has uploaded an avatar to your site, then use it, it not you return normal $avatar, which will be from gravatar if user has one. (If you add to question the code you are using to store user avatars, I can give a exact working code):

add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {

    if( "user_has_uploaded_a_local_avatar" ) {
       // Replace $avatar with your own image element, for example
       // $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
    }

    // if user didn't upload a local avatar,
    // normal avatar will be used, which can be from gravatar
    return $avatar;

}
0

This is a "me too" comment but with a solution :)

So when I enabled comments section I got an error from is_email($id_or_email).

Here's the error

strlen() expects parameter 1 to be string, object given in /home/my_theme/public_html/wp-includes/formatting.php on line 2891

Error happens, cause $id_or_email contains actually an object and not a string.

I found a workaround by fetching email string from the object $id_or_email->comment_author_email

So I changed $id_or_email to $id_or_email->comment_author_email and now I get the right avatar picture to the comments and no errors.

  • You should edit your answer for clarity. When I started reading this, it almost sounded like it was not an answer, but rather a "me too" problem. Thus, I almost flagged it as not an answer. You could edit this to be more direct in addressing an older question. Older questions often times need updated answers as code continues to move forward, so it's certainly normal to add late answers - just make it clear that's what it is ;-) (And welcome to WPSE) – butlerblog Jan 8 at 19:50
  • Yeah, I tried to write this first as a comment to bilimokur, but I need 50 reputation points in order to make a comment :( I'll edit this to clarify that it's actually a "me too" comment but with a solution :) – atonus Jan 8 at 20:38

Your Answer

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

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