wordpress的头像默认是gravatar的随机头像,用户无法自定义更换,而Simple Local Avatars正好可以解决这个问题。这款插件功能很简单,就是用户可以在wp的用户后台,资料中上传图片作为头像。
看了下插件代码,原理很简单,就是直接将上传的头像图片地址保存在 user_meta表(wp的自定义字段)中。其实还不如自己写个~ 个人比较反感wp的自定义字段,太臃肿了,主要是官方还提倡这么做,虽说简化了数据操作,但是数据量多了,性能问题就很严重了。
接下来就是改进这个插件了。
如下:
- 将插件代码集成到主题中。
- 更换上传图片的保存位置
- 提供网站前台上传头像调用
将插件代码集成到主题中:
将代码include到你的functions.php中
require_once(TEMPLATEPATH . '/simple-local-avatars.php');
找到代码
$avatar = wp_handle_upload( $_FILES[‘simple-local-avatar’], array( ‘mimes’ => $mimes, ‘test_form’ => false, ‘unique_filename_callback’ => array( $this, ‘unique_filename_callback’ ) ) );
更换上传图片的保存位置:
在上传的前后加上过滤器 upload_dir
add_filter( ‘upload_dir’, ‘avatar_upload_dir’ );
$avatar = wp_handle_upload( $_FILES[‘simple-local-avatar’], array( ‘mimes’ => $mimes, ‘test_form’ => false, ‘unique_filename_callback’ => array( $this, ‘unique_filename_callback’ ) ) );
remove_filter( ‘upload_dir’, ‘avatar_upload_dir’ );
更换上传图片的保存位置
function avatar_upload_dir( $dir ) {
return array(
‘path’ => $dir[‘basedir’] . ‘/avatars’,
‘url’ => $dir[‘baseurl’] . ‘/avatars’,
‘subdir’ => ‘/avatars’,
) + $dir;
}
提供网站前台上传头像调用:
前台可以用 admin-ajax和后台对接,地址是http://your_domain.com/wp-admin/admin-ajax.php ,建议开发wordpress的功能模块都封装成接口,这样app,小程序,网页,都可以很方便调用。
参考:https://www.cnblogs.com/ningmeng666/p/7610718.html
后台处理如下:
这里简单说下方法,后台获取上传的文件,保存到头像到头像目录,保存之前检查下该用户是否有头像记录(判断user_meta即可),有的话删除记录和头像文件。然后保存新的头像地址到这个user_meta中即可。注意value的值是一个数组,full对应上传的头像原文件。array( 'full' => $avatar_src )。之后的都交给插件的代码处理,比如要显示头像,执行get_avatar()时候,插件会根据参数自动裁剪上传的图片。如图所示:
以下是我的代码。仅供参考
/** * 删除头像 */ function avatar_delete( $user_id ) { $old_avatars = get_user_meta( $user_id, 'simple_local_avatar', true ); $upload_path = wp_upload_dir(); if ( is_array($old_avatars) ) { foreach ($old_avatars as $old_avatar ) { $old_avatar_path = str_replace( $upload_path['baseurl'], $upload_path['basedir'], $old_avatar ); @unlink( $old_avatar_path ); } } delete_user_meta( $user_id, 'simple_local_avatar' ); } /**上传头像 * [upload_avatar description] * @return [type] [description] */ function upload_avatar(){ header("Cache-Control: no-cache, must-revalidate"); $upload_dir = wp_upload_dir(); define('ROOT',$upload_dir['basedir'].'/'); $user_id = $_POST['user_id']; $user_login = $_POST['user_login']; $save_dir = ROOT.'avatars/'.$user_login.'_avatar.jpg'; //上传目录的服务器绝对路径 $avatar_mate = get_user_meta( $user_id, 'simple_local_avatar', true ); $result = array(); if (($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg")){ if ($_FILES["file"]["error"] > 0){echo "Return Code: " . $_FILES["file"]["error"] . "<br />";} else{ avatar_delete($user_id); //删除旧记录以及旧头像文件 if( move_uploaded_file($_FILES["file"]["tmp_name"],$save_dir)){ //放入新上传的头像文件 $avatar_src = $upload_dir['baseurl'].'/avatars/'.$user_login.'_avatar.jpg'; //完整的绝对路径 add_user_meta( $user_id, 'simple_local_avatar', array( 'full' => $avatar_src ) ); //加入新头像文件记录 /*echo "设置成功!";*/ }else{ echo "头像上传失败,如有疑问请联系管理员QQ:739696033"; } } }else{ echo "图片格式错误!"; } if($_FILES["file"]["size"]/1024 > 2000){ echo "上传的图片太大了!"; } exit; } add_action( 'wp_ajax_upload_avatar', 'upload_avatar' ); add_action( 'wp_ajax_nopriv_upload_avatar', 'upload_avatar' );
暂时写到这里,强迫症如果为了美观可以将数据保存到 users 表中,可以自己封装类似 add_user_meta ,get_user_meta.... 这些方法。
效果如下:
- 赞助本站
- 微信扫一扫
- 加入Q群
- QQ扫一扫
评论