web-dev-qa-db-fra.com

Remplacer Gravatar par images téléchargées?

J'ai ajouté une fonctionnalité permettant de télécharger une photo de profil en suivant CE guide .

Je ne trouve pas de guide en ligne ni de documentation sur WP hooks .. Comment remplacer les images de profil Gravatar (dans la section commentaire) par des images téléchargées personnalisées?

Je ne veux pas forcer mes utilisateurs à enregistrer Gravatar afin de changer la photo de leur profil sur mon site.

2
N00b

En supposant que l'utilisateur ait son avatar enregistré, en tant qu'ID de pièce jointe, stocké dans la méta de l'utilisateur, en tant que champ field_with_custom_avatar_id, vous pouvez le faire pour afficher cette pièce jointe si la valeur est enregistrée:

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;

}

Ou, s'il est enregistré en tant qu'URL de l'image, dans le champ méta de l'utilisateur 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;

}
5
JPollock

Le crochet dont vous avez besoin est le filtre get_avatar . Il reprend l'élément HTML image représentant l'avatar de l'utilisateur.

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;

}

Notez qu'en utilisant ce filtre, vous pouvez toujours laisser les utilisateurs utiliser Gravatar. Vous pouvez vérifier si l'utilisateur a téléchargé un avatar sur votre site, puis l'utiliser, il ne vous retournera pas le $avatar normal, qui proviendra de gravatar si l'utilisateur en a un. (Si vous ajoutez à la question le code que vous utilisez pour stocker les avatars des utilisateurs, je peux donner un code exact qui fonctionne):

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;

}
4
cybmeta

C'est un "moi aussi" mais avec une solution :)

Ainsi, lorsque j'ai activé la section des commentaires, j'ai eu une erreur de is_email($id_or_email).

Voici l'erreur

strlen () attend que le paramètre 1 soit string, objet donné dans /home/my_theme/public_html/wp-includes/formatting.php à la ligne 2891

Une erreur survient, car $id_or_email contient en fait un objet et non une chaîne.

J'ai trouvé une solution de contournement en récupérant une chaîne de courrier électronique à partir de l'objet $id_or_email->comment_author_email

J'ai donc changé $id_or_email en $id_or_email->comment_author_email et maintenant je reçois la bonne image d'avatar pour les commentaires et aucune erreur.

0
atonus