问题简介
子比V5.7中作者对代码进行了更新,修改的地方有变化,本站暂未升级子比V5.7,该教程基于子比V5.6
由于子比主题使用了自有的头像方案,完全屏蔽Gravatar,所以也不支持Cravatar,在使用博客的过程中发现很多人互访留言是不会登陆的,因此在这种情况下是无法获取用户头像的,只能使用一个默认的头像。
为了彻底解决这个问题,使其支持Gravatar或者Cravatar需要修改主题文件内的几段代码,本站现已修改完成,具体效果可看评论区或者主页最近评论模块,关于 Cravatar 的更多信息可以访问 Cravatar 官网。
修改 zib-theme.php
/www/wwwroot/chenyan98.cn/wp-content/themes/zibll/inc/functions 这个目录下的 zib-theme.php 这个文件里边定义了获取头像和返回头像数据的方法,因此需要首先修改。
修改 zib_get_avatar 方法
将该文件内的 zib_get_avatar 这个方法整体替换成下边的代码就可以获取 Cravatar 头像,替换之后WordPress的后台就能够正常的显示头像了,前台的显示需要修改其它文件,这里暂先时不管。
function zib_get_avatar($avatar, $user_id, $args)
{
$custom_avatar = get_user_meta($user_id, 'custom_avatar', true);
$alt = get_the_author_meta('nickname', $user_id) . '的头像' . _get_delimiter() . get_bloginfo('name');
$avatar = $custom_avatar ? $custom_avatar : zib_default_avatar();
$avatar = preg_replace("/^(https:|http:)/", "", $avatar);
if ( empty( $avatar ) ) {
// 邮箱转小写并去除首尾空格
$address = strtolower( trim( $user_id->comment_author_email ) );
// 获取邮箱的MD5哈希值
$hash = md5( $address );
// 拼接出最终的头像URL
$avatar = 'https://cravatar.cn/avatar/' . $hash . '?s=200&d=mp';
}
$avatar = '<img alt="' . esc_attr($alt) . '" src="' . esc_url($avatar) . '" class="lazyload avatar avatar-' . esc_attr($args['size']) . '" height="' . esc_attr($args['size']) . '" width="' . esc_attr($args['size']) . '">';
return $avatar;
}
修改 zib_get_data_avatar 方法
修改此处的原因是子比主题后台user_id是评论的对象,前台是用户ID,为了使前台能够正常的显示Cravatar头像,评论模板里调用 zib_get_data_avatar 这个方法时要么传入评论对象要么传入用户邮箱,我这边选择了传入评论对象。
致命错误:未捕获的错误:类WP_Comment的对象无法在/www/wwwroot/chenyan98.cn/wp-content/object-cache.php:2045中转换为字符串堆栈跟踪:#0 /www/wwwroot/chenyan98.cn /wp-content/object-cache.php(2045): str_replace()
#1 /www/wwwroot/chenyan98.cn/wp-content/object-cache.php(2030): WP_Object_Cache->sanitize_key_part()
#2 / www/wwwroot/chenyan98.cn/wp-content/object-cache.php(1419): WP_Object_Cache->build_key()
#3 /www/wwwroot/chenyan98.cn/wp-content/object-cache.php(114) : WP_Object_Cache->get()
#4 /www/wwwroot/chenyan98.cn/wp-content/themes/zibll/inc/functions/zib-theme.php(349): wp_cache_get()
#5 /www/wwwroot/chenyan98 .cn/wp-content/themes/zibll/inc/functions/zib-comments-list.php(44): zib_get_data_avatar()
#6 /www/wwwroot/chenyan98.cn/wp-content/themes/zibll/inc/函数/zib-comments-list.php(18): zib_get_comments_list()
#7 /www/wwwroot/chenyan98.cn/wp-includes/class-walker-comment.php(179): zib_comments_list()
#8 /www/ wwwroot/chenyan98.cn/wp-includes/class-wp- walker.php(144): Walker_Comment->star in /www/wwwroot/chenyan98.cn/wp-content/object-cache.php on line 2045
关于报错的解释:
WordPress的头像获取函数默认是传递用户id或邮箱地址的,所以也建议传递用户id或邮箱,而不是将评论对象整个传过去。这个报错的意思是评论对象无法被WordPress的缓存相关帮助函数用作键值。如果确定必须传递评论对象的话可以把自定义的获取头像的函数中带wp_cache相关的行都删掉。
直接将$comment传入获取头像的函数与 Redis-Object-Cache冲突会有导致网站访问异常,打开WordPress的调试模式可以看到上边的报错信息,因此如果你的网站也使用了 Redis-Object-Cache 这个插件的话下面 zib_get_data_avatar 这个方法中有关 wp_cache 的行需要注释掉。
function zib_get_data_avatar($user_id = '', $size = '', $alt = '')
{
$args = array(
'size' => $size,
'height' => $size,
'width' => $size,
'alt' => $alt,
);
// 由于将$comment传入获取头像的函数与 Redis-Object-Cache冲突,此处的缓存设置需要注释掉直接对$avatar进行赋值
// $cache = wp_cache_get($user_id, 'user_avatar', true);
// if ($cache === false) {
// $avatar = zib_get_avatar(null, $user_id, $args);
// wp_cache_set($user_id, $avatar, 'user_avatar');
// } else {
// $avatar = $cache;
// }
$avatar = zib_get_avatar(null, $user_id, $args);
if (_pz('lazy_avatar')) {
$avatar = str_replace(' src=', ' src="' . zib_default_avatar() . '" data-src=', $avatar);
}
return $avatar;
}
修改 zib-comments-list.php
/www/wwwroot/chenyan98.cn/wp-content/themes/zibll/inc/functions 这个目录下的 zib-comments-list.php 这个文件定义了评论相关的内容,主要涉及前台评论模板的相关功能。
在子比主题评论模板文件中可以看到最终调用的就是 zib_get_comments_list 这个方法,该方法又调用了zib_get_data_avatar 这个方法,默认传入的参数是 $user_id ,这里需要将其改为 $comment,由于评论分为主评论和次评论再加上最近评论小组件,本文件内共有三处需要修改,这里仅对修改过的代码片段进行截取,如果要手动修改可在该文件内搜索 zib_get_data_avatar 对该方法的参数进行替换。
//一级评论头像显示框
if (!$comment->comment_parent > 0) {
$html .= '<li>';
$html .= '<div class="comt-avatar relative">' . zib_get_data_avatar($comment) . $vip_icon . '</div>';
$html .= '</li>';
}
//次级评论头像显示框
if ($comment->comment_parent > 0) {
$author_link = '<div class="comt-avatar-mini mr10 relative">' . zib_get_data_avatar($comment) . $vip_icon . '</div>' . $author_link;
}
//posts-mini的头像框最近评论小组件,直接将评论主体传递过去
$avatar = '<div class="avatar-img">' . zib_get_data_avatar($comment, '22') . $vip_icon . '</div>';
直接进行文件替换(推荐)
/www/wwwroot/你的域名/wp-content/themes/zibll/inc/functions,两个文件都在这个目录下,上面是按照解决问题的思路一步步分析给出了所有修改过的地方,考虑到一个一个修改比较麻烦,这里给出修改好的文件,可以到对应的目录自行替换。
作者:晨岩
本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!