如何将数据提交/上传到数据库和特定文件夹中?

时间:2016-04-07 作者:Allen Titan

我正在尝试制作视频插件。要提交数据以将文件移动到plugin\\u name文件夹中的文件夹中。要提交/上传,我正在尝试“plugin\\u dir\\u path()”函数。而且它不起作用。只是在浏览器中显示“上传%”。但它既没有移动到文件夹,也没有更新数据库。请帮帮我。

<form action = "<?php plugin_dir_path(__FILE__).\'titan_video_plugin.php\'; ?>" enctype="multipart/form-data" method = "POST">
标题(将显示为视频名称)
<input type = "text" name = "title" value = "" placeholder="The Title" size="60"/>
<h3>Upload Video</h3>
<input type = "hidden" name ="MAX_FILE_SIZE" value = "10000000000000000000000000"/>
<input type = "file" name = "file" />
<input type = "submit" name = "upload" value = "Upload" />
<h3>About the video</h3>    
<textarea type="text" name="description" placeholder="The video is..." rows="4" cols="50"></textarea>    
</form>
要移动文件,我使用以下方法。。。。

    $tmp_name = $_FILES[\'file\'][\'tmp_name\'];
    $tar_file_name = $_FILES[\'file\'][\'name\'];
    $t_upload_dir = plugin_dir_path(__FILE__).\'Uploads\';

    if(move_uploaded_file($tmp_name, $t_upload_dir."/".$tar_file_name)){

                      echo "Uploading successful";

    }

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

第1部分:表单处理首先,让我们修复上载表单处理。无论是表单还是上载,都不应将用户发送到专用PHP文件进行处理,因为:

然后,该文件必须引导WordPress使用WP API,将其与文件夹结构紧密耦合,并引入脆弱性,即使该插件已被禁用,该文件也会工作,引入了安全风险,无法再从其他地方修改和拦截表单处理代码,在缓存系统和性能方面存在许多缺点,WordPress是CMS,您应该让WordPress处理请求。你的工作是告诉it如何处理这些请求。

这就是处理表单的方式:

模板:

<form method="post">
    <?php wp_nonce_field( \'allens_form\', \'allens_form_nonce\' ); ?>
    <input type="hidden" name="allens_form" value="allens_form">
    ... form fields
</form>
在插件或主题中functions.php:

add_action( \'init\', \'allens_form_handler\');
function allens_form_handler() {
    if ( empty( $_POST[\'allens_form\'] ) ) {
        return; // this isn\'t a form submission
    }
    if ( ! wp_verify_nonce( $_POST[\'allens_form_nonce\'], \'allens_form\' )  ) {
        return; // invalid or missing nonce! Something dodgy\'s going on here
    }
    // process form data
}
还要注意添加了nonce。这将大大提高表单的安全性,使其免受某些类型的攻击。考虑在这个网站上提出一个新的问题,以获得更全面的答案,即nonces是什么以及它们可以防止什么。

对AJAX使用相同的策略并使用AJAX端点文件可能很有诱惑力,但正如我前面提到的,出于类似的原因,这是一个坏主意。相反,请使用WP AJAX api,或注册REST api端点。

第2部分:上传视频

所有上传都在上传文件夹中。在许多系统上,文件夹可能位于不同的位置,并且可能是WordPress可以写入的文件系统中的唯一位置。插件文件夹应仅包含代码和资产,不应包含用户内容。

这里缺失的重要信息是帖子类型。

WordPress中的所有帖子都有“type”。帖子类型为“post”,页面类型为“page”,等等,它们都以相同的方式存储在数据库中。还有其他类型的帖子,但你应该感兴趣的是attachment 岗位类型。

当你将任何东西上传到媒体库时,它会被放在上传文件夹中,但WordPress不会在该文件夹中查找上传内容。相反,当上传时,它会创建一个类型为attachment, 这些附件帖子就是你在管理区看到的。

附件帖子类型包含信息,例如附件的名称、在上载文件夹中的位置、文件的类型、作者以及其他帖子元数据,具体取决于媒体的类型。这些是您想要用于视频上载的内容。

由于帖子可以有父帖子,您会发现上传并插入帖子的图像具有这种关系。这些图像将是附件,附件帖子父级是它们出现的帖子。这也是特色图片的工作原理,贴子有一个自定义字段/贴子元,其中包含附件贴子的ID。所述帖子是特色图片的图片附件。

重要的是,在实现上传时,您会发现有几个功能非常方便,但您会发现最有用的是:

media_handle_upload( $file_id, $post_id, $post_data, $overrides );
如果给定适当的参数,此函数将获取上载的文件,将其移动到正确的位置,为您创建附件帖子,并用所有必要的元数据填充它。

然后如何处理附件帖子由您决定,但您需要将ID保存在有用的地方,并始终通过其ID进行引用。切勿存储附件的URL。要获取要在页面上显示的URL,请使用此功能:

$url = wp_get_attachment_url( $attachment_id );
确保检查功能是否正常工作,$url 可能是错误对象,或false 价值