如何在wordpress前端集成Dropzonejs文件上传器库,就像内置的一样,并在媒体库中提供上传的文件?如何在前端集成Dropzonejs和wordpress媒体处理程序?
回答
Dropzonejs是一个非常广泛的JavaScript库,提供了很多选项来处理媒体上传。
要将dropzonejs与wordpress整合,这个过程非常简单。假设以下代码片段是您希望显示您的上传器的位置。
<div id="media-uploader" class="dropzone"></div>
<input type="hidden" name="media-ids" value="">
拥有类dropzone
会自动附加dropzone事件与元素。这将阻止我们覆盖默认参数。所以我们想禁用库的自动发现功能。
// Disabling autoDiscover, otherwise Dropzone will try to attach twice.
Dropzone.autoDiscover = false;
现在我们将使用jQuery
将我们的配置与元素绑定。
jQuery("#media-uploader").dropzone({
url: dropParam.upload,
acceptedFiles: 'image/*',
success: function (file, response) {
file.previewElement.classList.add("dz-success");
file['attachment_id'] = response; // push the id for future reference
var ids = jQuery('#media-ids').val() + ',' + response;
jQuery('#media-ids').val(ids);
},
error: function (file, response) {
file.previewElement.classList.add("dz-error");
},
// update the following section is for removing image from library
addRemoveLinks: true,
removedfile: function(file) {
var attachment_id = file.attachment_id;
jQuery.ajax({
type: 'POST',
url: dropParam.delete,
data: {
media_id : attachment_id
}
});
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
}
});
在上面我们做了什么是我们连接悬浮窗与我们的元素与一些参数 -
url
代码 - 在这里我们想送我们要上传的文件位置。我稍后将初始化变量。acceptedFiles
- 由于我们只对上传图片感兴趣,我们将限制文件仅附加到图片上。你可以在这个图书馆的网站上找到更多。success
- 成功上载文件/图像时触发的回调。它接受两个参数:上传文件本身的参考和来自服务器的响应。这非常重要,在这里我们将附件ID存储在我们的表单中。您可以在存储该ID之前在这里执行验证。error
- 如果文件上传失败,那么您可以在这里执行任何任务。addRemoveLinks
- 在预览面板下方添加删除文件链接,您可以使用CSS设计它的样式。removedfile
- 处理操作,同时在预览面板中单击remove file
链接获取图像。在这个函数中,我们发送的ajax
调用我们的服务器从库
当然也有很多可供选择的删除图像,但我发现这些都是我需要设置我的拖拽最基本的参数n-drop媒体上传器。
现在最重要的是要决定文件上传网址。您可以在自己想要处理操作的位置拥有自定义文件。但我找到了另一种方式。
From this question and the answer我发现使用admin-post.php
文件是相当了不起的。
很多人抱怨admin-post.php
,所以认为坚持wp_ajax.php
是最好的选择。
所以我之前我的悬浮窗初始化初始化的变量drophandler
如下 -
wp_enqueue_script('dropzone','path/to/dropzone', array('jquery'));
wp_enqueue_script('my-script','path/to/script',array('jquery','dropzone'));
$drop_param = array(
'upload'=>admin_url('wp_ajax.php?action=handle_dropped_media'),
'delete'=>admin_url('wp_ajax.php?action=handle_deleted_media'),
)
wp_localize_script('my-script','dropParam', $drop_param);
现在我们已经准备好我们的图像发送到服务器。在这里,我们将添加一些php
代码,无论是在主题的function.php
文件或我们的插件文件中,但我们需要确保它已加载。
以下功能将负责上传图像并作为附件保存在库中。
add_action('wp_ajax_handle_dropped_media', 'BMP_handle_dropped_media');
// if you want to allow your visitors of your website to upload files, be cautious.
add_action('wp_ajax_nopriv_handle_dropped_media', 'BMP_handle_dropped_media');
function BMP_handle_dropped_media() {
status_header(200);
$upload_dir = wp_upload_dir();
$upload_path = $upload_dir['path'] . DIRECTORY_SEPARATOR;
$num_files = count($_FILES['file']['tmp_name']);
$newupload = 0;
if (!empty($_FILES)) {
$files = $_FILES;
foreach($files as $file) {
$newfile = array (
'name' => $file['name'],
'type' => $file['type'],
'tmp_name' => $file['tmp_name'],
'error' => $file['error'],
'size' => $file['size']
);
$_FILES = array('upload'=>$newfile);
foreach($_FILES as $file => $array) {
$newupload = media_handle_upload($file, 0);
}
}
}
echo $newupload;
die();
}
以下操作负责删除媒体元素。 wp_delete_attachment()
函数的第二个参数允许我们决定是要删除图像还是完全删除图像。我想完全删除它,所以通过true
。
add_action('admin_post_handle_delete_media', 'BMP_handle_delete_media');
function BMP_handle_delete_media(){
if(isset($_REQUEST['media_id'])){
$post_id = absint($_REQUEST['media_id']);
$status = wp_delete_attachment($post_id, true);
if($status)
echo json_encode(array('status' => 'OK'));
else
echo json_encode(array('status' => 'FAILED'));
}
die();
}
这将在响应中返回attachment_id
,我们将在成功函数中获取它。在media_handle_upload($file, 0);
中,我通过了文件的参考文献和0
,因为我不想为任何帖子分配媒体(0表示没有帖子,但是如果您想分配,则在此传递帖子ID。 codex
。)
这是所有在wordpress上传媒体。
注意:我还没有完成removing uploaded file
部分。我会在一会儿完成。
UPDATE
的职位将被更新。现在我们可以从上传容器中删除上传的媒体元素。感谢this question and the answer我可以找出实际的过程。
添加到这篇文章的解决方案是不正确的,除非我误解了这个问题。基本上,对于没有以管理员身份登录的人来说,解决方案不适用。我耗费了30分钟的时间来完成这项工作,而删除图像的解决方案并未将其从媒体库中删除。
感谢您的评论。由于这是一条评论,所以不应该回答评论部分。任何方式我已经更新了答案,以便您可以使用它来允许您的网站的访问者在您的服务器上传文件,但我认为这不是很有帮助。最后,你的情况出了什么问题?在我的情况下,文件正在删除罚款。你能解释一下,以便我可以修改我的? – maksbd19 2015-04-16 17:18:55
'delete'=> admin_url('wp_ajax.php?action = handle_deleted_media'),需要更改为'delete'=> admin_url('wp_ajax.php?action = handle_delete_media'), – Tsea 2018-01-12 19:55:27
那些在为非管理员用户工作时遇到问题的人;请使用admin-ajax.php而不是admin-post.php。
我曾经遇到过一个奇怪的问题,即admin-post.php适用于本地服务器上的非管理员用户;但我的现场服务器拒绝让非管理员上传文件。 PHP会回显整个页面而不是回显值。
我用admin-ajax.php替换了admin-post.php并上传超酷工作。
我希望这会有所帮助。
谢谢您的评论,我正在更新我的代码。 – maksbd19 2016-12-23 05:58:23
- 1. 前端媒体上传WordPress的
- 2. 如何在前端打开wordpress的媒体框架?
- 3. 如何在我现有的Django Web应用程序顶部集成wordpress前端
- 4. Git和WordPress(+管理插件和媒体)
- 5. 如何在客户端知道HTTP处理程序何时完成处理?
- 6. 在前端集成Extjs和在后端集成挂毯
- 7. 如何处理Node.js中的媒体流?
- 8. DotNetNuke博客和社交媒体集成
- 9. 在saprk流媒体应用程序中的异常处理
- 10. 集成Ruby处理程序与Apache
- 11. Spring集成消息处理程序:ActiveMQTextMessage
- 12. 如何在WordPress后端和前端上传时更改媒体文件的名称?
- 13. 与代理处理程序的DNOA和MVC4 WebAPI集成
- 14. 集成多媒体与LibGDX
- 15. 程序集编程和中断处理
- 16. wordpress前端媒体上传注销用户
- 17. 如何在Android上处理多个社交媒体登录和会话流程?
- 18. 如何获得程序集dll的处理器体系结构?
- 19. Silverlight:如何处理标准程序集
- 20. Koa.js和流媒体。你如何处理错误?
- 21. 如何将前端和后端无缝自动集成
- 22. 如何在$ .when完成处理程序时使_each处理'array'和'array of array'
- 23. Android应用程序中的Azure媒体播放器集成
- 24. Laravel和WordPress前端
- 25. 如何取消完成处理程序?
- 26. 完成处理程序内的完成处理程序?
- 27. 如何将Python与前端HTML集成?
- 28. 无法在WordPress媒体
- 29. 如何在WordPress内部集成自己的应用程序
- 30. 如何绑定加载完成新的WordPress 3.5媒体管理器
感谢帖子,非常详细的解释和最接近我需要的工作示例。但我有两个问题,首先它不会从网站上删除文件,当你从媒体列表中删除它时,其次它在Chrome中完全不起作用。我得到一个错误“主线程上的同步XMLHttpRequest已被弃用,因为它对最终用户的体验有不利影响。” – 2016-06-29 00:33:51
好吧,“同步XMLHttpRequest”错误是针对jquery的同步文件传输方法。我相信解决这个错误有很多资源。你需要在'delete_attachment'操作中挂钩你的自定义函数,以检查你的内容的媒体列表中是否存在该媒体项目。如果是的话,你需要在那里删除它。 – maksbd19 2016-06-29 10:02:19
我正在做一些更改以适应我的需要,XMLHttpRequest来自WordPress的ajax,所以把异步:false解决了这个问题,但我现在发现了另一个问题,不是管理员的用户无法上传图像,我不知道可能有某种限制,我需要看。 – 2016-06-29 17:17:18