it-swarm.dev

Jak zobrazit nic (místo výchozího nastavení), pokud není přítomen žádný uživatel gravatar?

Existuje způsob, jak ukázat žádný gravatar v seznamu komentářů pro komentátory, kteří nejsou registrováni na gravatar.com? Stejně jako jsem viděl, gravatar.com nevrací speciální kód, když není registrován žádný avatar.

Dočasné, ne tak elegantní řešení, o které jsem požádal v tuto chvíli, zobrazuje průhledný 1x1px gif, ale pokud je to možné, rád bych nevrátil žádný obraz.

Také jsem vyzkoušel 3 - 4 gravatar pluginy, ale žádný z nich to správně.

1
pax

Tento plugin skryje všechny obrázky avataru a předběžně je načte do Javascriptu, takže klientská strana, která by měla aktivovat cache prohlížeče. Pokud obrázek existuje, je avatar nahrazen a viditelný. Pokud neexistuje, nic se nestane a obraz avatara zůstane skrytý. Testováno v Safari a Firefoxu na Macu.

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

Jestliže paměť slouží, gravatar dělá 302 k výchozímu jestliže žádný gravatar je dostupný.

Můžete tedy zkusit použít CSS. Něco jako:

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

Nebo:

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

(Ve všech prohlížečích to nebude fungovat.)

Nebo můžete použít jQuery. Něco jako:

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

Obě možnosti by měly být z hlediska výkonu neškodné.

1
Denis de Bernardy

Tam je snadný způsob, jak se wordpress vestavěné funkce získat avatar.

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

nastavíte-li tuto proměnnou na:

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

Pokud nebude gravatar nalezen, nastaví se výchozí obrázek. Můžete udělat tento obrázek malý nebo co chcete dělat.

Více informací: https://codex.wordpress.org/Function_Reference/get_avatar

Také Gravatar je nyní vestavěný do wordpressu, což znamená, že nebudete potřebovat žádný plugin pro jeho vytáhnutí.

Více informací: https://codex.wordpress.org/Using_Gravatars

Aktualizace:

Měl jsem podobný problém a použil jsem toto řešení někde, ale použil jsem jiné řešení pro jiné webové stránky, které mám, což je:

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

Zobrazí se pouze obrázky, které existují v aplikaci gravatar.

1
Anil

Pokud chcete používat lokální ukládání do mezipaměti na serveru, můžete jej dokončit pomocí skriptů pro zpracování obrázků Timthumb

0
conualfy

Upravil jsem malý kousek oficiálního php příkladu na gravatar.com pokud $ d = '404' funkce vrátí 404 namísto obrázku, takže provedu závěrečnou kontrolu, pokud vrátí obraz getimagesize () před tím, než něco vrátí a funkce pokračuje v tisku obrázek

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

Pravděpodobně to není nejelegantnější řešení, ale je to jediný způsob, jak bych to mohl obejít.

0
pax

Kombinovala jsem některá další řešení pro vlastní potřebu.

Abychom mohli použít odpověď Denis de Bernardy , musíme poskytnout gravaterovi výchozí hodnotu, takže ji můžeme zacílit na CSS.

Můžeme to udělat, pokud poskytneme wp_list_comments naši vlastní funkci formátování zpětných dotazů, ať ji nazýváme v naší šabloně.

V našem zpětném volání můžeme použít Anilovu odpověď k předání výchozí hodnoty get_avatar.

V souborech šablony, ve kterých voláte wp_list_comments, přidejte funkci zpětného volání jako je tato:

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

V souboru functions.php deklarujte novou funkci formátování komentářů, zkopírujte kód programu Wordpress (úplný kód níže) a změňte tento řádek:

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

K tomuto:

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

Pak můžete přidat CSS takto:

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

Plná funkce formátování komentářů vypadá takto (jsem také nahradil volání na $ 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