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;
}
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.