使用WordPress开发主题的时候,经常会遇到需要从前端上传图片的需求,乍一看,还挺麻烦的。其实WordPress已经已经为我们提供了非常简单的接口,上传附件只需要几行代码就能搞定。
主要工作就是引用几个必须的文件,然后使用media_handle_upload
和update_post_meta
功能,我们来看一下代码。
function insert_attachment($file_handler, $post_id, $set_thumb = 'false')
{
// 检查附件是否上传成功
if ($_FILES[ $file_handler ][ 'error' ] !== UPLOAD_ERR_OK) {
return false;
}
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
//上传到媒体库并返回附件的ID
$attach_id = media_handle_upload($file_handler, $post_id);
//把上传成功的附件附加到文章
if ($set_thumb) {
update_post_meta($post_id, '_thumbnail_id', $attach_id);
}
return $attach_id;
}
如果上传的是多个文件,需要把上面的函数稍微改一下,如下:
function insert_multiple_attachment($file_handler, $post_id)
{
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
$files = $_FILES[ $file_handler ];
foreach ($files[ 'name' ] as $key => $value) {
if ($files[ 'name' ][ $key ]) {
$file = [
'name' => $files[ 'name' ][ $key ],
'type' => $files[ 'type' ][ $key ],
'tmp_name' => $files[ 'tmp_name' ][ $key ],
'error' => $files[ 'error' ][ $key ],
'size' => $files[ 'size' ][ $key ],
];
// 如果文件上传不 OK ,跳过
if ($file[ 'error' ] !== UPLOAD_ERR_OK) {
continue;
}
$_FILES = [$file_handler => $file];
foreach ($_FILES as $file => $array) {
//上传到媒体库并返回附件的ID
$attach_id = media_handle_upload($file, $post_id);
//把上传成功的附件附加到文章
update_post_meta($post_id, '_gallery_image_id', $attach_id);
}
}
}
}
怎么使用上面的函数
这一段是给新手准备的,高手可以直接略过,使用的时候直接把PHP的全局变量$_FILES
作为函数的第一个参数,需要插入的文章id作为第二个参数就可以了。
if ($_FILES) {
foreach ($_FILES as $file => $array) {
$newupload = insert_attachment($file,$post_id);
}
}
文件上传成功后,在WordPress后台看到的效果和直接在后台插入缩略图是一样的。怎么样?是不是非常简单?如果你有更简单的方法,欢迎在评论中提出。
11 thoughts on “WordPress 从前端上传图片并作为文章的附件”
求大神赐教怎么在投稿中加入上传图片功能,试了很多插件,都不好用,可视化编辑器可以实现,但是上传图片非得注册帐号登录。
投稿的时候添加个文章上传的表单,post之后用上面的函数处理一下即可。
能不能做个教程,相信会有很多人需要的
你说的是视频教程?还是弄个演示程序?
直接写篇文章啊,我找遍了全网络,就没有一个这种可以插入视频的投稿好用的。
还有建议你开启评论回复后邮件提醒啊,不然很影响互动的说。
多谢建议,有时间会写一个这样的完整教程,回复后邮件提醒已开启,不知道你能不能收到。
的确没收到……
我再测试一下看是什么问题,我自己添加了一个邮件,填写的是我自己的QQ邮箱,可以收到提醒邮件。
还有你的URL是中文的,对SEO不友好啊。
这个应该没有多大影响吧,你看到的应该是部分,发布文章的时候,如果我大部分都修改成英文了。有些在手机上发布的,不好修改,就直接中文了。
URL对SEO影响还是很大的。