wordpress Simple Local Avatars插件的一些改进

幸运草 2020年1月10日21:48:02wordpress插件评论阅读模式

wordpress的头像默认是gravatar的随机头像,用户无法自定义更换,而Simple Local Avatars正好可以解决这个问题。这款插件功能很简单,就是用户可以在wp的用户后台,资料中上传图片作为头像。

wordpress Simple Local Avatars插件的一些改进

看了下插件代码,原理很简单,就是直接将上传的头像图片地址保存在 user_meta表(wp的自定义字段)中。其实还不如自己写个~ 个人比较反感wp的自定义字段,太臃肿了,主要是官方还提倡这么做,虽说简化了数据操作,但是数据量多了,性能问题就很严重了。

接下来就是改进这个插件了。

如下:

  1. 将插件代码集成到主题中。
  2. 更换上传图片的保存位置
  3. 提供网站前台上传头像调用

将插件代码集成到主题中:

将代码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()时候,插件会根据参数自动裁剪上传的图片。如图所示:

wordpress Simple Local Avatars插件的一些改进

以下是我的代码。仅供参考

  /**
     * 删除头像
     */
   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....  这些方法。

效果如下:

wordpress Simple Local Avatars插件的一些改进

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草
又有三个WordPress插件被指存在后门 wordpress插件

又有三个WordPress插件被指存在后门

大规模的WordPress插件生态系统开始显示出腐烂的气隙:将老旧弃用的插件卖给新作者,而后者马不停蹄地在原始代码中加了一个后门。 WordPress 安全团队Wordfence发现了这三个后门并已将...

发表评论