web-dev-qa-db-fra.com

Comment ne rien afficher (à la place par défaut) quand aucun gravatar d'utilisateur n'est présent?

Existe-t-il un moyen de ne pas afficher de gravatar dans la liste des commentaires pour les commentateurs qui ne sont pas enregistrés sur gravatar.com? Autant que j'ai vu, gravatar.com ne renvoie pas de code spécial si aucun avatar n'est enregistré.

La solution temporaire, pas si élégante que j'ai appliquée pour le moment affiche un gif 1x1px transparent, mais j'aimerais ne renvoyer aucune image si possible.

J'ai aussi essayé 3-4 plugins gravatar mais aucun ne le fait correctement.

1
pax

Ce plugin masque toutes les images d'avatar et les précharge en Javascript, côté client, ce qui devrait activer le cache du navigateur. Si l'image existe, l'avatar est remplacé et rendu visible. S'il n'existe pas, rien ne se passe et l'image de l'avatar reste cachée. Testé dans Safari et Firefox sur Mac.

<?php
/*
Plugin Name: WPA 3366
Plugin URI: http://wordpress.stackexchange.com/questions/3366/how-to-display-nothing-instead-default-when-no-user-gravatar-is-present
Description: How to display nothing (instead default) when no user gravatar is present?
Version: 1.0
Author: Jan Fabry
*/

$avatar_collection = array();

function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
    if ( ! get_option('show_avatars') )
        return false;

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

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

    $email = '';
    if ( is_numeric($id_or_email) ) {
        $id = (int) $id_or_email;
        $user = get_userdata($id);
        if ( $user )
            $email = $user->user_email;
    } elseif ( is_object($id_or_email) ) {
        // No avatar for pingbacks or trackbacks
        $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 ) )
            return false;

        if ( !empty($id_or_email->user_id) ) {
            $id = (int) $id_or_email->user_id;
            $user = get_userdata($id);
            if ( $user)
                $email = $user->user_email;
        } elseif ( !empty($id_or_email->comment_author_email) ) {
            $email = $id_or_email->comment_author_email;
        }
    } else {
        $email = $id_or_email;
    }
/*
    if ( empty($default) ) {
        $avatar_default = get_option('avatar_default');
        if ( empty($avatar_default) )
            $default = 'mystery';
        else
            $default = $avatar_default;
    }
*/
    $default = '404';

    if ( !empty($email) )
        $email_hash = md5( strtolower( $email ) );

    if ( is_ssl() ) {
        $Host = 'https://secure.gravatar.com';
    } else {
        if ( !empty($email) )
            $Host = sprintf( "http://%d.gravatar.com", ( hexdec( $email_hash{0} ) % 2 ) );
        else
            $Host = 'http://0.gravatar.com';
    }

    if ( 'mystery' == $default )
        $default = "$Host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('[email protected]')
    elseif ( 'blank' == $default )
        $default = includes_url('images/blank.gif');
    elseif ( !empty($email) && 'gravatar_default' == $default )
        $default = '';
    elseif ( 'gravatar_default' == $default )
        $default = "$Host/avatar/s={$size}";
    elseif ( empty($email) )
        $default = "$Host/avatar/?d=$default&s={$size}";
    elseif ( strpos($default, 'http://') === 0 )
        $default = add_query_arg( 's', $size, $default );

    if ( !empty($email) ) {
        $out = "$Host/avatar/";
        $out .= $email_hash;
        $out .= '?s='.$size;
        $out .= '&d=' . urlencode( $default );

        $rating = get_option('avatar_rating');
        if ( !empty( $rating ) )
            $out .= "&r={$rating}";

        $comment_id = get_comment_ID();

        $avatar = "<img alt='{$safe_alt}' src='about:blank' class='avatar avatar-{$size} photo avatar-{$email_hash} avatar-hidden' height='{$size}' width='{$size}' style='display: none' id='avatar-{$comment_id}'/>";
        $GLOBALS['avatar_collection'][$out][] = $comment_id;
    } else {
        // Empty email: never show an avatar
        $avatar = '';
//      $avatar = "<img alt='{$safe_alt}' src='{$default}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
    }

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
}

add_filter('wp_print_footer_scripts', 'add_avatar_footer_script');
function add_avatar_footer_script()
{
    global $avatar_collection;
    if (empty($avatar_collection)) {
        return;
    }
    $avatar_data = json_encode($avatar_collection);
    echo <<<EOF
<script type="text/javascript">
(function (avatars) {
    for (var url in avatars) {
        var avatarImageObj = new Image();
        avatarImageObj.onload = function(e) {
            var avatarIds = avatars[e.target.src];
            for (var i = 0; i < avatarIds.length; i++) {
                var avatarImageEl = document.getElementById('avatar-' + avatarIds[i]);
                avatarImageEl.src = e.target.src;
                avatarImageEl.style.display = "block";
            }
        }
        avatarImageObj.src = url;
    }
})({$avatar_data});
</script>
EOF;
}
0
Jan Fabry

Si la mémoire est bonne, gravatar effectue la valeur par défaut de 302 si aucun gravatar n’est disponible.

Ainsi, vous pouvez essayer d'utiliser CSS. Quelque chose comme:

img[src=default_gravatar_url] { display: none; }

Ou:

img[src=default_gravatar_url] { visibility: hidden; }

(Cela ne fonctionnera pas dans tous les navigateurs.)

Ou vous pouvez utiliser jQuery. Quelque chose comme:

$('img[src=default_gravatar_url]').ready(function() {
  $(this).remove();
});

Les deux options devraient être bénignes en termes de performance.

1
Denis de Bernardy

Il existe un moyen simple d'utiliser la fonction intégrée wordpress pour obtenir un avatar.

get_avatar( $id_or_email, $size, $default_value_when_no_avatar_found );

si vous définissez cette variable sur:

$default_value_when_no_avatar_found = 'https://yourdomain.com/image_default.jpg';

Ceci définira votre image par défaut si gravatar n’est pas trouvé. Vous pouvez rendre cette image minuscule ou ce que vous souhaitez faire.

Plus d'infos: https://codex.wordpress.org/Function_Reference/get_avatar

De plus, Gravatar est maintenant intégré à WordPress, ce qui signifie que vous n’aurez besoin d’aucun plugin pour le tirer.

Plus d'infos: https://codex.wordpress.org/Using_Gravatars

Mettre à jour:

J'ai eu un problème similaire et j'ai utilisé cette solution quelque part mais j'ai utilisé une solution différente pour un autre site Web que j'ai, qui est:

$avatar_url = get_avatar_url( $ID, array( 'size'=>200, 'default'=>'404' ) );

if( getimagesize( $avatar_url ) > 1 )
{
    echo '<img src="'. $avatar_url .'" alt="" class="avatar avatar-200">';
}

Cela ne montrera que les images existant dans gravatar.

1
Anil

Si vous souhaitez utiliser la mise en cache locale sur le serveur, vous pouvez la compléter avec des scripts de traitement d'image tels que Timthumb

0
conualfy

J'ai modifié un petit morceau de l'exemple officiel de PHP sur gravatar.com si $ d = '404' la fonction retourne un 404 au lieu d'une image, donc je vérifie si elle retourne une image puis getimagesize () avant que la fin ne retourne quelque chose et que la fonction continue de s'imprimer l'image

function get_gravatar( $email, $s = 80, $d = '404', $r = 'g', $img = true, $atts = array() ) { //changed $d='404'
$url = 'http://www.gravatar.com/avatar/';
$url .= md5( strtolower( trim( $email ) ) );
$url .= "?s=$s&d=$d&r=$r";
$curl=$url;
    if ( $img ) {
    $url = '<img class="paxvatar" src="' . $url . '"';
    foreach ( $atts as $key => $val )
        $url .= ' ' . $key . '="' . $val . '"';
    $url .= ' />';
}
if (getimagesize($curl)) echo $url; //changed - added getimagesize(check)
}

Ce n'est probablement pas la solution la plus élégante, mais c'est la seule façon pour moi de la contourner.

0
pax

J'ai combiné certaines des autres solutions pour moi-même.

Pour utiliser la réponse de Denis de Bernardy , nous devons fournir à gravater une valeur par défaut afin de pouvoir la cibler dans le CSS.

Nous pouvons le faire si nous fournissons notre propre fonction de rappel de formatage de commentaire à wp_list_comments où que nous l'appelions dans notre modèle.

Dans notre callback, nous pouvons utiliser la réponse d'Anil pour transmettre une valeur par défaut à get_avatar.

Dans vos fichiers de modèle où vous appelez wp_list_comments, ajoutez une fonction de rappel comme ceci:

wp_list_comments(['callback' => 'my_format_comment']);

Dans votre fichier functions.php, déclarez une nouvelle fonction de formatage de commentaire en copiant le code Wordpress (code complet ci-dessous) et en modifiant cette ligne:

<?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size']' ); ?>

Pour ça:

<?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'], 'identicon' ); ?>

Ensuite, vous pouvez ajouter des CSS comme ceci:

.comment-author img[src*="identicon"] {
    display: none;
}

La fonction de formatage de commentaire complet ressemble à ceci (j'ai également remplacé un appel à $ this):

function my_format_comment($comment, $args, $depth) {

    $tag = ( 'div' === $args['style'] ) ? 'div' : 'li';
    ?>
    <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( count($comment->get_children()) ? 'parent' : '', $comment ); ?>>
    <article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
        <footer class="comment-meta">
            <div class="comment-author vcard">
                <?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'], 'identicon' ); ?>
                <?php
                /* translators: %s: comment author link */
                printf( __( '%s <span class="says">says:</span>' ),
                    sprintf( '<b class="fn">%s</b>', get_comment_author_link( $comment ) )
                );
                ?>
            </div><!-- .comment-author -->

            <div class="comment-metadata">
                <a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>">
                    <time datetime="<?php comment_time( 'c' ); ?>">
                        <?php
                        /* translators: 1: comment date, 2: comment time */
                        printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() );
                        ?>
                    </time>
                </a>
                <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?>
            </div><!-- .comment-metadata -->

            <?php if ( '0' == $comment->comment_approved ) : ?>
                <p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.' ); ?></p>
            <?php endif; ?>
        </footer><!-- .comment-meta -->

        <div class="comment-content">
            <?php comment_text(); ?>
        </div><!-- .comment-content -->

        <?php
        comment_reply_link( array_merge( $args, array(
            'add_below' => 'div-comment',
            'depth'     => $depth,
            'max_depth' => $args['max_depth'],
            'before'    => '<div class="reply">',
            'after'     => '</div>'
        ) ) );
        ?>
    </article><!-- .comment-body -->
    <?php
}
0
Harry Potts