从前台表单上传图像和附件

时间:2016-05-04 作者:Kleeia

我不是wordpress的专家,我正在尝试创建一个前端表单,通过ajax将信息发送到我的php函数。我需要关于上传图片和文件作为帖子附件的帮助。

我的jQuery/Ajax正在将所有内容正确地发送到我的php文件中。我唯一不明白的是,为什么上传图像和文件的功能不同?

我的html输入相对命名为:

  • name="moreimages"
  • name="morefiles"
我将此php代码用于图像和文件

if ($_FILES)
    {
        // Get the upload images
        $images = $_FILES[\'moreimages\'];
        foreach ($images[\'name\'] as $key => $value)
        {
            if ($images[\'name\'][$key])
            {
                $image = array(
                    \'name\' => $images[\'name\'][$key],
                    \'type\' => $images[\'type\'][$key],
                    \'tmp_name\' => $images[\'tmp_name\'][$key],
                    \'error\' => $images[\'error\'][$key],
                    \'size\' => $images[\'size\'][$key]
                );
                $_FILES = array("moreimages" => $image);
                foreach ($_FILES as $image => $array)
                {
                    $newupload = project_images($image,$pid);
                }
            }
        }
        // Get the upload attachment files
        $files = $_FILES[\'morefiles\'];
        foreach ($files[\'name\'] as $key => $value)
        {
            if ($files[\'name\'][$key])
            {
                $file = array(
                    \'name\' => $files[\'name\'][$key],
                    \'type\' => $files[\'type\'][$key],
                    \'tmp_name\' => $files[\'tmp_name\'][$key],
                    \'error\' => $files[\'error\'][$key],
                    \'size\' => $files[\'size\'][$key]
                );
                $_FILES = array("morefiles" => $file);
                foreach ($_FILES as $file => $array)
                {
                    $uploadfile = project_file($file,$pid);
                }
            }
        }
    }

function project_images($file_handler, $pid)
    {
        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\');
        $image_id = media_handle_upload( $file_handler, $pid );
        return $image_id;
    }
function project_file($file_handler, $pid)
    {
        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\');
        $file_id = media_handle_upload( $file_handler, $pid );

        //here is the only difference where I update the post meta

        update_post_meta($file_id,\'is_prj_file\',\'1\');
        return $file_id;
    }
我看不出有什么问题。你能让我提出一个类似的问题吗?谢谢

2 个回复
最合适的回答,由SO网友:Tim Malone 整理而成

我在评论中提到了调试代码的重要性。原因如下:

首先添加图像。在图像添加部分,您正在运行以下代码行:

$_FILES = array("moreimages" => $image);
然后,当您开始添加文件的例程时,您可以从以下内容开始:

$files = $_FILES[\'morefiles\'];
你能看到这里出了什么问题吗?此时,$_FILES 仅包含"moreimages" 没有别的了,因为你之前写得太多了。

您可以简单地创建一个新变量,而不是重置$_FILES (例如。$my_processed_images = array("moreimages" => $image); 然后foreach ($my_processed_images...), 但是还有很多其他的事情可以做,以使这段代码更冗余,也更容易理解。

调试要点:print_r() 是你的朋友。例如,如果您希望一个变量包含某个内容,print_r($_FILES) 所以你可以看看它是否真的是。这将有助于避免数小时的头痛:)

SO网友:fsenna

如果你不是很熟悉,想要一个插件,可以为你做所有这些使用拖放,尝试WP-TYPES和他们的CRED插件。

不要介意他们的支持,这真的很令人沮丧。