WordPress: 使用 wp_insert_attachment 上传附件

简介:

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

主要参考这个函数: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.cnblogs.com/huangcong/p/5421807.html,如需转载请自行联系原作者

相关文章
|
7月前
|
Web App开发 移动开发 安全
WordPress插件wp-file-manager任意文件上传漏洞(CVE-2020-25213)
WordPress插件WPFileManager中存在一个严重的安全漏洞,攻击者可以在安装了此插件的任何WordPress网站上任意上传文件并远程代码执行。
259 1
|
8月前
phpcms之 如何修改后台上传文件或图片的大小限制
phpcms之 如何修改后台上传文件或图片的大小限制
|
4月前
|
小程序 应用服务中间件 Shell
laravel8(三)文件上传提示 “The file deos not exits ” ,但确实已经上传了文件
Laravel 文件上传提示 “The file "" deos not exits ” ,但确实已经上传了文件
36 1
|
弹性计算 应用服务中间件
请将文件MP_verify_N8no8dpNO9n7wuBZ.txt上传至XXX指向的web服务器(或虚拟主机)的目录
请将文件MP_verify_N8no8dpNO9n7wuBZ.txt上传至XXX指向的web服务器(或虚拟主机)的目录
请将文件MP_verify_N8no8dpNO9n7wuBZ.txt上传至XXX指向的web服务器(或虚拟主机)的目录
Typecho附件下载管理器插件Attachment
Typecho附件下载管理器插件Attachment
493 0
|
PHP
【ThinkPHP】如何获取think\file的内容
【ThinkPHP】如何获取think\file的内容
265 0
【ThinkPHP】如何获取think\file的内容
|
监控 应用服务中间件 Apache
Confluence 上传大一点的附件显示HTTP Error
一般几Mb的是可以的,但是上传30Mb以上的就会显示HTTP Error。目前系统配置是文件大小限制是100Mb。之前上传90Mb都是可以成功的。最近才出现这个问题。
594 0
Confluence 上传大一点的附件显示HTTP Error
|
搜索推荐 Apache SEO
Joomla 4教程:如何从URL删除.index.php
我们的Joomla 4教程从基础到高级的Joomla用户提供了有用的教程和提示。在本教程中,我们将向您逐步说明如何从Joomla 4网站的URL中删除index.php,以建立友好的url系统。 搜索引擎友好(SEF),可读或干净的URL是对访问者和搜索引擎都有意义的URL,因为它们解释了指向他们指向的特定页面的路径。