WordPress 从前端上传图片并作为文章的附件

使用WordPress开发主题的时候,经常会遇到需要从前端上传图片的需求,乍一看,还挺麻烦的。其实WordPress已经已经为我们提供了非常简单的接口,上传附件只需要几行代码就能搞定。

主要工作就是引用几个必须的文件,然后使用media_handle_uploadupdate_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后台看到的效果和直接在后台插入缩略图是一样的。怎么样?是不是非常简单?如果你有更简单的方法,欢迎在评论中提出。

Related Posts

0条评论

  1. 求大神赐教怎么在投稿中加入上传图片功能,试了很多插件,都不好用,可视化编辑器可以实现,但是上传图片非得注册帐号登录。

          1. 直接写篇文章啊,我找遍了全网络,就没有一个这种可以插入视频的投稿好用的。
            还有建议你开启评论回复后邮件提醒啊,不然很影响互动的说。

        1. 多谢建议,有时间会写一个这样的完整教程,回复后邮件提醒已开启,不知道你能不能收到。

          1. 我再测试一下看是什么问题,我自己添加了一个邮件,填写的是我自己的QQ邮箱,可以收到提醒邮件。

        1. 这个应该没有多大影响吧,你看到的应该是部分,发布文章的时候,如果我大部分都修改成英文了。有些在手机上发布的,不好修改,就直接中文了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注