Как ничего не отображать (вместо по умолчанию), когда нет граватара пользователя?
Есть ли способ показать отсутствие граватара в списке комментариев для комментаторов, которые не зарегистрированы на gravatar.com? Столько, сколько я видел, gravatar.com не возвращает специальный код, если аватар не зарегистрирован.
Временное, не очень элегантное решение, которое я применил на данный момент, отображает прозрачный gif размером 1x1 пикселей, но я бы хотел по возможности не возвращать изображение.
Я также пробовал 3-4 плагина gravatar, но ни один из них не делает этого должным образом.
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;
}
С помощью встроенной функции 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">';
}
Здесь будут показаны только изображения, существующие в граватаре.
Если память не изменяет, 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();
});
Оба варианта должны быть приемлемыми с точки зрения производительности.
Я немного изменил официальный пример 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)
}
Возможно, это не самое элегантное решение, но это единственный способ, которым я мог бы его обойти.
Если вы хотите использовать локальное кэширование на сервере, вы можете дополнить его сценариями обработки изображений, такими как Timthumb
Я объединил некоторые другие решения для своего собственного.
Чтобы использовать Ответ Дени де Бернарди, нам нужно предоставить 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
}