我们来研究一下如何在主题或者插件的开发中上传附件:

主要参考这个函数:https://codex.wordpress.org/Function_Reference/wp_insert_attachment

下面先主要描述一下流程,假如我们通过一个这个样的表单上传了一张图片:

<form id="form_register" method="post" enctype="multipart/form-data">
<input id="upload_image" type="file" name="register_form_image" accept="image/*" />
</form>

那么我们在后台可以通过 $_FILE['register_form_image'] 来获取到这个上传的文件:

array (size=5)
'name' => string '14249903_1.jpg' (length=14)
'type' => string 'image/jpeg' (length=10)
'tmp_name' => string 'D:\upupw\temp\phpDE28.tmp' (length=25)
'error' => int 0
'size' => int 106422

根据 wp_insert_attachment 这个函数的文档指引,我们需要作如下几步:

  1. 将文件移动到目标的位置
  2. 生成所需的配置,然后调用 wp_insert_attachment
  3. 插入附件的 MetaData

先做第一步:将文件移动到目标的位置

我们可以通过调用 wp_upload_dir() 函数来获得目标上传路径的信息,大概是这个样子:

array (size=6)
'path' => string 'D:\app\mysite/wp-content/uploads/2015/05' (length=39)
'url' => string 'http://mysite/wp-content/uploads/2015/05' (length=39)
'subdir' => string '/2015/05' (length=8)
'basedir' => string 'D:\app\mysite/wp-content/uploads' (length=31)
'baseurl' => string 'http://mysite/wp-content/uploads' (length=31)
'error' => boolean false

然后我们就来把 $_FILES 的临时文件移动过去。

// 获取上传目录信息
$wp_upload_dir = wp_upload_dir(); // 将上传的图片文件移动到上传目录
$basename = $file['name'];
$filename = $wp_upload_dir['path'].'/'.$basename;
rename($file['tmp_name'], $filename);

第二步:指定配置并调用 wp_insert_attachment ,插入attachment 的 post。

这里的配置有五个参数,第一个是 guid ,这个是外部链接的 url,看下面的代码可以明白;第二个是 post_mime_type ,根据上传时传递的 mime 类型输入即可;第三个是标题,采用去除扩展名之后的文件名;第四个是文章内容,留空,第五个post_status 取值为 inherit;

// Prepare an array of post data for the attachment.
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . $basename,
'post_mime_type' => $file['type'],
'post_title' => preg_replace( '/\.[^.]+$/', '', $basename ),
'post_content' => '',
'post_status' => 'inherit'
);

然后是调用 wp_insert_attachment ,注意,第一个参数就是上面的选项数组,第二个参数是第一步指定的文件路径,第三个是这个附件“附加到”的文章 ID;

// 注意这个是为了说明第三个参数的意义,附件有一个“附加到”的属性,需要从这里指定附加到哪个文章
// global $post;
// $parent_post_id = $post->ID; // 插入附件信息
$attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id );

第三步:这里需要有些收尾工作

参照文档照做即可。

// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it.
require_once( ABSPATH . 'wp-admin/includes/image.php' ); // Generate the metadata for the attachment, and update the database record.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

(转自:http://www.tuicool.com/articles/3yuEBb6)

黄聪:WordPress: 使用 wp_insert_attachment 上传附件的更多相关文章

  1. 修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法

    在服务器上架设好WordPress后,使用过程中发现,上传附件大小有2M的限制 话说服务器就是本机,可以直接把文件拖到附件存储文件夹下,然后在需要附件的地方引用链接 可是这种落后的方法终究不是办法,还 ...

  2. wordpress多站点环境设置上传附件大小

    多站点环境更改上传附件大小: php.ini post_max_size = 8M upload_max_filesize = 10M 另外,后台域名管理中设置/网络设置/可以设置上传文件大小. 代码 ...

  3. jquery 通过ajax FormData 对象上传附件

    之前上传附件都是用插件,或者用form表单体检(这个是很久以前的方式了),今天突发奇想,自己来实现附件上传,具体实现如下 html: <div>   流程图: <input id=& ...

  4. Discuz! X论坛上传附件到100%自动取消上传的原因及解决方案

    最近接到一些站长的反馈,说论坛上传附件,到100%的时候自己取消上传了.经查是附件索引表pre_forum_attachment表的aid字段自增值出现了问题,导致程序逻辑返回的aid值实际为一个My ...

  5. Discuz模拟批量上传附件发帖

    简介 对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程.如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程. 模拟上传 discuz 附件逻辑 dz附件储存在 ...

  6. Dynamic CRM 2013学习笔记(十三)附件上传 / 上传附件

    上传附件可能是CRM里比较常用的一个需求了,本文将介绍如何在CRM里实现附件的上传.显示及下载.包括以下几个步骤: 附件上传的web页面 附件显示及下载的附件实体 调用上传web页面的JS文件 实体上 ...

  7. 怎样解决asp.net.mvc上传附件超过长度问题?

    最近,在做一个上传附件功能,但是文件超过4M,就报上传的文件超过长度问题

  8. JQuery Uplodify上传附件(同一个页面多个uplodify控件解决方案)

    功能描述:实现同一页面中多个不同附件的上传保存,且做到最大程度的减少代码修改量(最大程度的公用),为了方便实现垃圾数据和垃圾文件的处理,项目采用临时文件夹的方式:即:文件自动上传先保存到临时文件夹下, ...

  9. crm 4 注释与上传附件权限

    文档注释权限及上传附件是与实体的”追加到”权限有关. 文档注释权限及上传附件是与核心记录中”注释”的”追加”权限有关. 追加及追加到的权限,我的理解是与本实体有关联的实体的权限,比如你引用了其它表的字 ...

随机推荐

  1. wireshark过滤使用

    过滤器的区别 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.需要在开始捕捉前设置.显示过滤器(DisplayFilters):在捕捉结果中进行详细查找.他们可以在 ...

  2. iOS开发网络篇—HTTP协议

    iOS开发网络篇—HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...

  3. 一步步调试解决iOS内存泄漏

      虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在.所以了解原理很重要. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄 ...

  4. GUI用户界面编程

    Java的GUI编程(Graphic User Interface,图形用户接口),是在它的抽象窗口工具箱(Abstract Window Toolkit,AWT)上实现的,java.awt是AWT的 ...

  5. [UML][转]UML类图符号 各种关系说明以及举例

    修改自:http://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html UML中描述类和类之间相互关系的方式包括:依赖(Dependency ...

  6. 链式编程中的next()和end()

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 当一个activity中按钮过多时怎么办?

    这几天看极客学院的视频,跟视频中的老师学到的一些小技巧~~ .setOnClickListener(this) 通过重写this(我猜的是重写),下面有onClicked() package exam ...

  8. jquery甘特图免费下载

    Silverlight Gantt甘特图是一款非常丰富,可定制,轻量级和高性能的控件. 项目甘特图: 可视化层次的任务列表. 可移动和拖拽调整条形图 可视化时间编辑器 编辑任务依赖关系 调整任务进度条 ...

  9. POJ-1182 分组并查集

    今天刚发现,之前做的并查集只是贴模板基本就能过,题意改变一点,自己还是不懂,其实我还没入门呢... 题意:食物链,A吃B,B吃C,C吃A,输入m组数据: 1 a b:a 和 b 是同一类 2 a b: ...

  10. Javascript DOM基础(二) childNodes、children

    childNodes知识点: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Typ ...