当没有用户Gravata时,如何不显示任何内容(而不是默认)?

时间:2010-10-27 作者:pax

对于未在gravatar注册的评论者,是否有办法在评论列表中显示无gravatar。com?正如我所看到的,格拉瓦塔。当没有注册化身时,com不会返回特殊代码。

我目前应用的临时、不太优雅的解决方案是显示一个透明的1x1px gif,但如果可能的话,我不想返回任何图像。

我也尝试了3-4个gravatar插件,但没有一个能正确地做到这一点。

6 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

该插件隐藏所有头像图像,并将其预加载到Javascript中,因此客户端应该激活浏览器缓存。如果图像存在,则替换化身并使其可见。如果它不存在,则不会发生任何事情,并且化身图像保持隐藏状态。在Mac上的Safari和Firefox中测试。

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

SO网友:Anil

有一种利用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\';

如果找不到gravatar,这将设置默认图像。您可以将此图像缩小或执行任何您希望执行的操作。

更多信息: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">\';
}
这将仅显示gravatar中存在的图像。

SO网友:Denis de Bernardy

如果内存可用,如果没有可用的gravatar,gravatar将执行302到默认值。

因此,您可以尝试使用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();
});
就性能而言,这两种选择都应该是良性的。

SO网友:pax

我对official php example 在gravatar。com公司if $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)
}
这可能不是最优雅的解决方案,但这是我唯一可以绕过它的方法。

SO网友:conualfy

如果要在服务器上使用本地缓存,可以使用图像处理脚本来完成它,如Timthumb

SO网友:Harry Potts

我结合了一些其他的解决方案。

为了使用Denis de Bernardy\'s answer 我们需要为gravater提供一个默认值,以便我们可以在CSS中针对它。

如果我们在模板中调用wp\\u list\\u注释的任何地方都提供自己的注释格式回调函数,就可以做到这一点。

在我们的回调中,我们可以使用Anil\'s answer 传递默认值以获取\\u avatar。

在调用wp_list_comments的模板文件中,添加如下回调函数:

wp_list_comments([\'callback\' => \'my_format_comment\']);
在您的功能中。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
}

结束

相关推荐

I can't view or add comments

嘿,那里。我刚刚建立了这个网站。http://www.paledogstudios.com 它工作得很好,只是我似乎看不到过去的评论(这个博客是从blogger导入的)或添加评论。我知道这是代码而不是设置,因为有人告诉我,但他没有进一步帮助我。他说这可能在索引上。php帮助