在开发 WordPress 用户中心的时候,我们需要让用户在前段上传自定义图片作为头像,因为很多用户都是小白,上传头像之前要求他们按照尺寸裁剪好是不大现实的。为了提升用户体验,我研究测试了很久,终于搞定了让 WordPress 用户在前段上传图片并裁剪的功能。上传图片用了 jQuery Ajax Upload 插件,裁剪功能用了 jQuery Jcorp,都是比较成熟,并且浏览器兼容性较好的 jQuery 插件。功能的使用效果如下图。

WordPress 使用 jcorp 裁剪图片作为自定义头像

上传并裁剪图片用到的功能函数

处理上传的图片用到了 Github 上找到的一个 WordPress 上传辅助类 MediaUpload,其他的处理函数用到了 WordPress 为我们提供的以下几个函数:

update_user_meta:添加或更新用户自定义字段,主要用来添加上传的图片为用户头像

wp_get_attachment_url:获取用户头像的src地址

wp_get_attachment_metadata:获取上传的图片的meta信息,用来进一步处理裁剪图片

wp_upload_dir:获取WordPress的上传目录,保存裁剪后的图片的时候需要用到

wp_get_image_editor:获取图片编辑器,裁剪图片主要就是使用的这个功能

保存使用Ajax方式上传的图片

这一步使用了 MediaUpload 类,比较简单,只需要新建一个MediaUpload实例,然后把 Ajax 传过来的图片名称赋值给这个实例就可以了。保存后会返回一个图片附件 ID,把这个 ID 作为用户自定义头像字段的值保存到数据库里面就可以了。

// 引入上传图片辅助类

include_once( 'MediaUpload.php' );

/*Ajax上传图片*/

add_action( 'wp_ajax_upload', 'ajax_upload' );

add_action( 'wp_ajax_nopriv_upload', 'ajax_upload' );

function ajax_upload() {

$current_user = wp_get_current_user();

$uid = $current_user->ID;

$tmp = new MediaUpload;

if ( $_FILES ) {

foreach ( $_FILES as $file => $array ) {

$newupload = $tmp->saveUpload( $field_name=$file );

}

}

update_user_meta($uid, 'cus_avatar', $newupload['attachment_id']);

$res = array(

'id' => $newupload['attachment_id'],

'url' => wp_get_attachment_url($newupload['attachment_id'])

);

echo json_encode($res);

die(); //停止执行

}

使用 Jcorp 裁剪原始图片并保存到 WordPress 上传目录

这一步的难点在于获取图片名称和上传目录,很多朋友可能会在这里遇到问题,我也是尝试了很久才测试成功的,下面的代码是我测试过的,可以直接拿去用。

/*Ajax上传图片*/

add_action( 'wp_ajax_subcorp', 'subcorp_img' );

add_action( 'wp_ajax_nopriv_subcorp', 'subcorp_img' );

function subcorp_img() {

/*获取用户id*/

$current_user = wp_get_current_user();

$uid = $current_user->ID;

/*获取上传的字段*/

$src1 = $_POST["goods_img"];

$src_x = $_POST["x"];

$src_y = $_POST["y"];

$src_w = $_POST["w"];

$src_h = $_POST["h"];

/*获取上传目录名和文件名*/

$wp_upload_dir = wp_upload_dir();

$img_meta = wp_get_attachment_metadata($src1);

$img_file = $wp_upload_dir['basedir'] . '/' . $img_meta['file'];

/*保存裁剪后的图片到上传目录*/

$image = wp_get_image_editor( $img_file );

if ( ! is_wp_error( $image ) ) {

$image->crop( $src_x, $src_y, $src_w, $src_h, $dst_w = $src_w, $dst_h = $src_h, $src_abs = false );

$new_name = $image->generate_filename();

$image->save($new_name);

}

// 获取图片扩展名

$filetype = wp_check_filetype( basename( $new_name ), null );

// 准备插入附件

$attachment = array(

'guid' => $wp_upload_dir['url'] . '/' . basename( $new_name ),

'post_mime_type' => $filetype['type'],

'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $new_name ) ),

'post_content' => '',

'post_status' => 'inherit'

);

// 插入附件,并更新自定义头像字段

$attach_id = wp_insert_attachment( $attachment, $new_name );

update_user_meta($uid, 'cus_avatar', $attach_id);

$corped_url = wp_get_attachment_url($attach_id);

echo $corped_url;

exit;

}

除了上传自定义头像,本文介绍的方法同样可以用在前端上传文章缩略图或文章相册上面,只需要稍作改动就可以了。因为前端部分基本上不涉及 WordPress,在这里就不再做介绍了,有能力的朋友可以直接参照上面提到的两个 jQuery 插件的文档使用。如果对本文有什么疑问或更好的看法,欢迎在评论中提出交流,如果你觉得自己实现上面的功能比较吃力或者太浪费使用,欢迎联系 WordPress 智库定制开发。

php 图片上载 wordpress,WordPress 使用 Jcorp上传并裁剪图片作为自定义头像 —— PHP 后台部分...相关推荐

  1. Android头像上传时裁剪图片过大问题,裁剪大图片导致

    原先在完成头像上传功能的时候复制网上写好的代码,虽然也仔细研究过实现的过程但是这次项目中却遇到了一个很不解的问题,使用乐视手机实现图片裁剪的那一步骤中由于图片太大手机性能不够导致图片无法裁剪报出错误 ...

  2. delphi mysql 图片_跪求Delphi+Mysql上传、下载图片的方法?

    展开全部 第7章 数据库处理实例 实例122 在数据库中存取图像e5a48de588b63231313335323631343130323136353331333335333161 本实例演示如何在数 ...

  3. svg上传服务器无法显示,让WordPress支持上传SVG格式图片并显示在媒体库中的方法...

    让WordPress支持上传SVG格式图片并显示在媒体库中的方法 发布时间:2020-12-11 14:18:12 来源:亿速云 阅读:167 作者:小新 这篇文章将为大家详细讲解有关让WordPre ...

  4. 新浪sae平台wordpress中Buddypress插件上传头像问题

    快毕业了,想给班级做个基于wordpress的博客放在SAE平台,想着大家参与方便,于是下了个buddyrpess插件. 插件装好了在SAE上用着看是没什么问题.试着创建个群组,第二步上传头像的时候问 ...

  5. php更换wordpress用户头像,WordPress如何添加用户自定义上传头像功能

    使用WordPress建站的朋友应该知道,WordPress本身是没有上传自定义头像功能的,如果要更换头像,步骤是非常麻烦的. 而在我们开发一款WordPress主题中,特别是多用户的主题,让注册用户 ...

  6. WordPress编辑器支持pdf上传

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  7. html5拖拽图片批量ajax无刷新进度上传

    1.前端拖拽图片 之前有篇文章说到HTML5的拖拽(drag.drop,详见:/post/jquery-plugin-1-jquery-drag-and-html5-draggable-api-and ...

  8. 通过Web Services上传和下载图片文件

    通过Web Services上传和下载图片文件 随着Internet技术的发展和跨平台需求的日益增加,Web Services的应用越来越广,我们不但需要通过Web Services传递字符串信息,而 ...

  9. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库....

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

最新文章

  1. Scala:Functions and Closures
  2. LTE网元间控制面协议
  3. 【渝粤教育】国家开放大学2019年春季 2712园艺基础 参考试题
  4. window media player出现内部应用程序错误
  5. linux实验3编写内核模块,实验2.3_内核模块_实验报告
  6. 字符数组的初始化与赋值
  7. Codeforces Round #301 (Div. 2) B. School Marks 构造/贪心
  8. js href的用法
  9. 原创 | 职场风云 (二)试验田
  10. 电脑鼠标右键菜单太多了怎么办?Windows右键菜单清理删除方法
  11. esxi php,ESXi虚拟机安装8168/8111网卡
  12. cad相对坐标快捷键_cad 怎么用相对坐标
  13. webpack:Error: Compiling RuleSet failed: Exclamation mark separated loader lists has been removed
  14. openwrt修改默认网关地址_非常详细的锐捷网关路由配置教程,适合新手小白
  15. 【手环算法开发】--计步检测,看着篇文章就懂了
  16. 渗透服务器修改数据,渗透测试之:从端口入侵服务器
  17. 第3课:郭盛华教学视频_PHP连接MySQL数据库的方法
  18. php mysql弹幕_PHP开发弹幕系统
  19. AMD的GPU拿来跑深度学习?Rocm3.0Pytorch@Ubuntu16编译实录
  20. 乔布斯的康熙盛世,库克的雍正王朝——纪念乔布斯逝世5周年

热门文章

  1. 当贝D5X和极米Z6XPro画质对比 当贝D5X和极米Z6XPro选哪个
  2. mysql独立开发_TickyCMS: TickyCMS是由罗敏贵独自开发的一款基于PHP+Mysql架构的轻量级开源内容管理系统。...
  3. 绘画教程:如何轻松画出皮肤的挤压感
  4. hdu 5234 Happy birthday 背包 dp
  5. Ubuntu 16.04下开启Mysql 3306端口远程访问
  6. java 数组总结(赋值,反转,添加,查找)
  7. 表白神器——Python画丘比特之箭穿心
  8. KB奇遇记(3):信息化沙漠
  9. 英文视频添加中英双语字幕(基于Whisper语音识别和Google翻译)
  10. HUAWEI MH5000-31 5G LGA Module Application Guide-(V100R001_01, English)