Как ничего не отображать (вместо по умолчанию), когда нет граватара пользователя?


Есть ли способ показать отсутствие граватара в списке комментариев для комментаторов, которые не зарегистрированы на gravatar.com? Столько, сколько я видел, gravatar.com не возвращает специальный код, если аватар не зарегистрирован.

Временное, не очень элегантное решение, которое я применил на данный момент, отображает прозрачный gif размером 1x1 пикселей, но я бы хотел по возможности не возвращать изображение.

Я также пробовал 3-4 плагина gravatar, но ни один из них не делает этого должным образом.

Author: pax, 2010-10-27

6 answers

Этот плагин скрывает все изображения аватаров и предварительно загружает их в Javascript, поэтому на стороне клиента, которая должна активировать кэш браузера. Если изображение существует, аватар заменяется и становится видимым. Если его не существует, ничего не происходит, и изображение аватара остается скрытым. Протестировано в Safari и Firefox на 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
Author: Jan Fabry, 2010-11-01 13:25:08

С помощью встроенной функции wordpress есть простой способ получить аватар.

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

Если вы установите для этой переменной значение:

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

Это установит ваше изображение по умолчанию, если граватар не найден. Вы можете сделать это изображение крошечным или сделать все, что пожелаете.

Дополнительная информация: https://codex.wordpress.org/Function_Reference/get_avatar

Кроме того, Gravatar теперь встроен в wordpress, что означает, что вам не понадобится никакой плагин, чтобы вытащить его.

Подробнее информация: https://codex.wordpress.org/Using_Gravatars

Обновление:

У меня была похожая проблема, и я где-то использовал это решение выше, но я использовал другое решение для другого веб-сайта, который у меня есть, а именно:

$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">';
}

Здесь будут показаны только изображения, существующие в граватаре.

 2
Author: Anil, 2017-06-22 07:49:40

Если память не изменяет, gravatar выполняет 302 по умолчанию, если gravatar недоступен.

Таким образом, вы можете попробовать использовать CSS. Что-то вроде:

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

Или:

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

(Это не будет работать во всех браузерах.)

Или вы можете использовать jQuery. Что-то вроде:

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

Оба варианта должны быть приемлемыми с точки зрения производительности.

 1
Author: Denis de Bernardy, 2010-10-28 13:55:36

Я немного изменил официальный пример php в gravatar.com если $d='404' функция возвращает 404 вместо изображения, поэтому я делаю последнюю проверку, если она возвращает изображение, то getimagesize() до конца возвращает что-то, и функция продолжает печатать изображение

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)
}

Возможно, это не самое элегантное решение, но это единственный способ, которым я мог бы его обойти.

 0
Author: pax, 2010-10-27 23:50:30

Если вы хотите использовать локальное кэширование на сервере, вы можете дополнить его сценариями обработки изображений, такими как Timthumb

 0
Author: conualfy, 2010-11-15 20:32:01

Я объединил некоторые другие решения для своего собственного.

Чтобы использовать Ответ Дени де Бернарди, нам нужно предоставить gravater значение по умолчанию, чтобы мы могли настроить его в CSS.

Мы можем сделать это, если предоставим нашу собственную функцию обратного вызова форматирования комментариев для wp_list_comments, где бы мы ее ни вызывали в нашем шаблоне.

В нашем обратном вызове мы можем использовать Ответ Анила , чтобы передать значение по умолчанию в get_avatar.

В ваших файлах шаблонов, где вы вызовите wp_list_comments, добавьте функцию обратного вызова следующим образом:

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

В вашем functions.php файл объявляет новую функцию форматирования комментариев, копируя код Wordpress (полный код ниже) и изменяя эту строку:

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

К этому:

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

Затем вы можете добавить CSS следующим образом:

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

Функция полного форматирования комментариев выглядит следующим образом (я также заменил вызов на $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
Author: Harry Potts, 2018-08-20 15:37:25