使用 LetterAvatar 脚本生成首字图片替代默认评论头像

发布于 2020-05-13

使用 LetterAvatar 脚本生成首字图片替代默认评论头像

Gravatar 是全球通用头像,如果我们没有设置 Gravatar 头像,那么在网站上留言或评论就会显示默认的头像或者随机头像,这样的话用户体验不是很好。今天为大家分享一下使用 LetterAvatar 脚本自动生成首字图片代替默认头像的方法。

使用方法

LetterAvatar 脚本是通过读取 ALT 属性来自动生成图片的,所以基本思想是:首先给图片添加 ALT 属性,然后判断有无 Gravatar 头像,有的话显示 Gravatar 头像,没有的话显示 LetterAvatar 脚本生成的首字图片头像(比如昵称的第一个字符)。

1、头像添加ALT属性

查看WP官网 get_avatar 默认的可选参数:

<?php echo get_avatar( $id_or_email, $size, $default, $alt, $args ); ?>

其中:$alt 就是 alt 可选参数。

打开主题评论模板,找到类似这句:

<?php echo get_avatar( $comment, 64 ); ?>

替换为:

<?php echo get_avatar( $comment, 64, '', get_comment_author() ); ?>

将评论者名称作为 ALT 属性。

2、判断有无头像

如果没有使用 Gravatar,则给头像 img 标签添加一个 class 属性,比如 letter,示例代码(部分)如下:

      
if (!preg_match("|200|", $headers[0])) {
    // 没有头像,则新建一个空白文件作为标记
    $handle = fopen($d, 'w');
    fclose($handle);
    $a = $default;
    $letter = 'letter'; //无头像添加一个class属性:letter
} else {
    // 有头像且不存在则更新
    $r = get_option('avatar_rating');
    $g = 'http://www.gravatar.com/avatar/'.$f.'?s='.$size.'&r='.$r;
    copy($g, $e);
    $letter = '';
}
//在img标签中添加class属性letter
$avatar = "<img class='avatar avatar-{$size} photo {$letter}' alt='{$alt}' src='{$a}' height='{$size}' width='{$size}' />";

[mark_a]因为大部分网站使用了缓存,所以需要同时修改缓存文件中的代码。[/mark_a]

3、渲染首字头像

通过 LetterAvatar 脚本渲染首字头像,LetterAvatar 是一个开原项目,将示例中的 JS 脚本添加到你的网站。

示例代码:[s][p]

<!DOCTYPE html>
<html>
<h1>Letter Avatar</h1>
<small><strong>Usage:</strong></small>
<pre>
    <code><img width="256" height="256" avatar="Dao Lam" color="#0D8ABC"></code>
</pre>
<div>
    <img width="256" height="256" avatar="Dao Lam" color="#0D8ABC">
    <img class="round" width="256" height="256" avatar="Dao Lam" color="#0D8ABC">
</div>
<div>
    <img width="256" height="256" avatar="decentralized Market" color="#0D8ABC">
    <img class="round" width="256" height="256" avatar="decentralized Market" color="#0D8ABC">
</div>
<style>
    body {
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }
    pre {
      margin: 20px 0;
      padding: 20px;
      background: #fafafa;
    }
    .round { border-radius: 50%; }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
    /*
     * LetterAvatar
     * 
     * Artur Heinze
     * Create Letter avatar based on Initials
     * based on https://gist.github.com/leecrossley/6027780
     */
    (function(w, d){
        function LetterAvatar (name, size, color) {
            name  = name || '';
            size  = size || 60;
            var colours = [
                    "#1abc9c", "#2ecc71", "#3498db", "#9b59b6", "#34495e", "#16a085", "#27ae60", "#2980b9", "#8e44ad", "#2c3e50", 
                    "#f1c40f", "#e67e22", "#e74c3c", "#ecf0f1", "#95a5a6", "#f39c12", "#d35400", "#c0392b", "#bdc3c7", "#7f8c8d"
                ],
                nameSplit = String(name).split(' '),
                initials, charIndex, colourIndex, canvas, context, dataURI;
            if (nameSplit.length == 1) {
                initials = nameSplit[0] ? nameSplit[0].charAt(0):'?';
            } else {
                initials = nameSplit[0].charAt(0) + nameSplit[1].charAt(0);
            }
            if (w.devicePixelRatio) {
                size = (size * w.devicePixelRatio);
            }
            charIndex     = (initials == '?' ? 72 : initials.charCodeAt(0)) - 64;
            colourIndex   = charIndex % 20;
            canvas        = d.createElement('canvas');
            canvas.width  = size;
            canvas.height = size;
            context       = canvas.getContext("2d");
            context.fillStyle = color ? color : colours[colourIndex - 1];
            context.fillRect (0, 0, canvas.width, canvas.height);
            context.font = Math.round(canvas.width/2)+"px Arial";
            context.textAlign = "center";
            context.fillStyle = "#FFF";
            context.fillText(initials, size / 2, size / 1.5);
            dataURI = canvas.toDataURL();
            canvas  = null;
            return dataURI;
        }
        LetterAvatar.transform = function() {
            Array.prototype.forEach.call(d.querySelectorAll('img[avatar]'), function(img, name, color) {
                name = img.getAttribute('avatar');
                color = img.getAttribute('color');
                img.src = LetterAvatar(name, img.getAttribute('width'), color);
                img.removeAttribute('avatar');
                img.setAttribute('alt', name);
            });
        };
        // AMD support
        if (typeof define === 'function' && define.amd) {
            define(function () { return LetterAvatar; });
        // CommonJS and Node.js module support.
        } else if (typeof exports !== 'undefined') {
            // Support Node.js specific `module.exports` (which can be a function)
            if (typeof module != 'undefined' && module.exports) {
                exports = module.exports = LetterAvatar;
            }
            // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)
            exports.LetterAvatar = LetterAvatar;
        } else {
            window.LetterAvatar = LetterAvatar;
            d.addEventListener('DOMContentLoaded', function(event) {
                LetterAvatar.transform();
            });
        }
    })(window, document);
</script>
</html>

[/p]

其中,需要修改一个地方,将:

querySelectorAll('img[avatar]')

修改为:

querySelectorAll('.letter[alt]')

即根据 img 标签查找改为根据 class 查找。

结束语

如果你的网站还在使用默认头像的话,不妨尝试一下这个方法。本文是以 wordpress 为例来说明的,如果网站是用其他程序搭建的,大家可以自行修改一下代码,其实现原理是一样的。如果有任何意见或建议,欢迎在下方评论处留言。

喜欢 1
奋楫笃行,臻于至善!

相关文章

BEGIN 主题搜索结果页面添加标题图片

BEGIN 主题可以给文章分类页面、独立页面以及文章详情页面添加标题图片,但是在搜索结果页面及 404 页面却无法通过配置添加标题图片,本文简单分享一下给搜索结果页面和 404 页面添加标题图片,以及...
阅读全文

WordPress 文章评论设置分页按时间倒序排序

WordPress 评论默认是按发布的时间顺序排列的,如果我们想按照时间倒序排列,可以根据本文的方法修改。 1、修改comment-template.php 编辑文件 wp-includes/comm...
阅读全文

BEGIN 主题最新文章页面添加加载更多按钮

使用 Begin 主题的博主可能都发现过这样一个问题:如果设置杂志布局,博客页面(本站叫最新文章)是不显示加载更多按钮图标的,而其他所有带分页的页面都显示。如果不显示加载更多按钮图标的话,我们就只能通...
阅读全文

WordPress 文章链接地址 ID 不连续解决方法

Wordpress 默认情况下发布的文章 ID 不是连续的,是因为 Wordpress 自动草稿、文章修订版、页面、菜单、媒体等功能都要占用 ID,所以发布的文章 ID 一般是不连续的。今天为大家分享...
阅读全文

使用 iconfont 阿里矢量图标为网站添加图标的方法

Iconfont 是一个开源的矢量图标管理平台,它的图标库非常丰富,大概有一百三十多万个。Iconfont 可以按照需求定制图标字体库,还能随时修改,最重要的字体图标库只有 100 多 K。今天就来为...
阅读全文

外链图片缩略图不显示解决方法 A TimThumb error has occured

使用 timthumb 可以轻松实现缩略图自动裁剪的功能,但是由于某些原因,使用 timthumb 裁剪图片经常会出现缩略图无法正常显示的现象,错误提示为“A TimThumb error has o...
阅读全文

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注