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

主要参考这个函数: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. (转)【深入浅出jQuery】源码浅析2--奇技淫巧

    [深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html

  2. Spring 事务管理 01 ——

    目录: 参考: 1.Spring 事务管理高级应用难点剖析: 第 1 部分

  3. 深入理解 AngularJS 的 Scope

    JavaScript 的原型继承就是奇葩. 之前在 V2EX 上看到讨论说,不会 OOP 的 JavaScript 的程序员就是野生程序员.看来我是属于野生的.   一.遇到的问题 问题发生在使用 A ...

  4. c#网络通信框架networkcomms内核解析之九 自定义处理方法的运行机制

    NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本  gplv3协议 我们自己写的处理方法都称之为自定义处理方法 比如,我们在服务器上写的与登陆相关的处理方法 ...

  5. 使用Markdown+Pandoc+LaTex+Beamer制作幻灯片

    概述 为什么使用markdown? mardown是一种轻量级的标记语言,语法简单,可读性好,并且容易转化成其他格式的文档, 在技术文档撰写中得到越来越广泛的应用.相信大家对markdown都有一定了 ...

  6. MongoDB下载文件 百度盘共享

    1> mongodb下载地址: http://www.mongodb.org/downloads 官方下载不了,可以到百度共享盘里面下载 MongoDB 2.6.5 Windows 64位:   ...

  7. 通过cpu SN码注册软件类

    using System; using System.Management; namespace SoftReg { internal class SoftReg { #region 变量 ]; // ...

  8. iOS8定位问题解决方案

    原文  http://blog.csdn.net/nextstudio/article/details/40050095 1.修改info 新增Key: NSLocationAlwaysUsageDe ...

  9. Invalid byte 3 of 3-byte UTF-8 sequence

    用maven编译,tomcat启动时报错:IOException parsing XML document from class path resource [applicationContext.x ...

  10. ios开发之数据存储

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...