Dropzone.js и ClassiPress
-
Здравствуйте!
Я новичок в WordPress, имею задачу добавления возможности загрузки изображений для поста на фронт-энде с помощью Drag & Drop. Для этих целей я решил использовать библиотеку Dropzone.js, потому что используемая на сайте тема ClassiPress поддерживает только стандартный HTML загрузчик.
К моему сожалению я не понимаю всех тонкостей работы с загрузкой изображений в этой теме, однако я выявил, что картинки могут быть отправлены на сервер двумя способами: либо с помощью AJAX-запроса, либо как группа из полей input type=»file» с name=»image[]».
Пожалуйста, подскажите как мне необходимо правильно подвязать данную библиотеку к уже имеющемуся функционалу темы? Код файла, где происходит вывод элемента загрузчика и прописаны некоторые обработчики прикрепляю.<?php /** * Plupload API * * @package ClassiPress\Plupload */ add_action( 'wp_ajax_app_plupload_handle_upload', 'appthemes_plupload_handle_upload' ); add_action( 'wp_ajax_app_plupload_handle_delete', 'appthemes_plupload_handle_delete' ); /** * Generate html uploader form. * * @param int $post_id (optional) * * @return void */ function appthemes_plupload_form( $post_id = 0 ) { if ( ! current_theme_supports( 'app-plupload' ) ) { return; } list( $options ) = get_theme_support( 'app-plupload' ); $attachments = array(); if ( $post_id ) { $args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => null, 'post_parent' => $post_id, 'order' => 'ASC', ); $attachments = get_posts( $args ); } ?> <li class="list-upload"> <div class="labelwrapper"><label>Загрузка фото:*</label></div> </li> <li> <div id="app-attachment-upload-container"> <div id="app-attachment-upload-filelist"> <ul class="app-attachment-list"> <script>window.appFileCount = <?php echo count( $attachments ); ?>;</script> <?php if ( $attachments ) { foreach ( $attachments as $attachment ) { echo appthemes_plupload_attach_html( $attachment->ID ); } } ?> </ul> </div> <div id="app-attachment-html-upload-form"> <ul class="app-attachment-html-upload-fields"> <?php $fields_count = $options['allowed_files'] - count( $attachments ); if ( $fields_count > 0 ) { foreach ( range( 1, $fields_count ) as $i ) { $upload_field = html( 'input', array( 'type' => 'file', 'class' => 'fileupload', 'name' => 'image[]' ) ); $clear_button = html( 'input', array( 'type' => 'button', 'class' => 'clear-file', 'value' => __( 'Clear', APP_TD ) ) ); echo html( 'li', array( 'id' => 'upload_' . $i ), $upload_field . $clear_button ); } } ?> </ul> </div> <div class="app-attachment-info"> <div class="upload-wrapper clearfix"> <div class="drop-wrap"> <div id="image-upload" class="image-upload dropzone"></div> </div> <!--<a id="app-attachment-upload-pickfiles" class="button" href="#"><?php //_e( 'Add Image', APP_TD ); ?></a>--> <div class="upload-tip"> <p class="small"><?php printf( __( 'You are allowed to upload %s file(s).', APP_TD ), $options['allowed_files'] ); ?> <?php printf( __( 'Maximum file size: %s KB.', APP_TD ), $options['max_file_size'] ); ?></p> <?php if ( ! isset( $options['disable_switch'] ) || ! $options['disable_switch'] ) { ?> <p class="small upload-flash-bypass"><?php _e( 'You are using the flash uploader. Problems? Try the <a href="#">browser uploader</a> instead.', APP_TD ); ?></p> <p class="small upload-html-bypass"><?php _e( 'You are using the browser uploader. Problems? Try the <a href="#">flash uploader</a> instead.', APP_TD ); ?></p> <?php } ?> </div> </div> </div> </div> <div class="clear"></div> </li> <?php } /** * Generate html for uploaded attachment. * * @param int $attach_id * * @return string */ function appthemes_plupload_attach_html( $attach_id ) { $attachment = get_post( $attach_id ); $html = ''; $html .= '<li class="app-attachment">'; $html .= '<span class="attachment-title">'; $html .= sprintf( '<input type="text" name="app_attach_title[]" value="%s" placeholder="%s" class="text" />', esc_attr( $attachment->post_title ), esc_attr__( 'Change Title', APP_TD ) ); $html .= '</span>'; $html .= sprintf( '<span class="attachment-image">%s</span>', wp_get_attachment_image( $attachment->ID, 'thumbnail', false ) ); //$html .= sprintf( '<span class="attachment-name">%s</span>', esc_attr( $attachment->post_title ) ); $html .= sprintf( '<span class="attachment-actions"><a href="#" class="attachment-delete button" data-attach_id="%d">%s</a></span>', $attach_id, __( 'Delete', APP_TD ) ); $html .= sprintf( '<input type="hidden" name="app_attach_id[]" value="%d" />', $attach_id ); $html .= '</li>'; return $html; } /** * Enqueue scripts for plupload. * * @param int $post_id (optional) * * @return void */ function appthemes_plupload_enqueue_scripts( $post_id = 0 ) { if ( ! current_theme_supports( 'app-plupload' ) ) { return; } list( $options ) = get_theme_support( 'app-plupload' ); wp_enqueue_script( 'app-plupload', get_template_directory_uri() . '/includes/plupload/app-plupload.js', array( 'jquery', 'plupload-handlers' ) ); $app_plupload_config = array( 'nonce' => wp_create_nonce( 'app_attachment' ), 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ), 'confirmMsg' => __( 'Are you sure?', APP_TD ), 'number' => $options['allowed_files'], 'plupload' => array( 'runtimes' => 'flash,silverlight,html5,html4', 'browse_button' => 'app-attachment-upload-pickfiles', 'container' => 'app-attachment-upload-container', 'file_data_name' => 'app_attachment_file', 'max_file_size' => $options['max_file_size'] . 'kb', 'multi_selection' => false, 'resize' => array( 'width' => 1000, 'height' => 1000, 'quality' => 80 ), 'url' => admin_url( 'admin-ajax.php', 'relative' ), 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), 'silverlight_xap_url' => includes_url( 'js/plupload/plupload.silverlight.xap' ), 'filters' => array( array( 'title' => __( 'Allowed Files', APP_TD ), 'extensions' => 'jpg,jpeg,gif,png' ) ), 'multipart' => true, 'urlstream_upload' => true, 'multipart_params' => array( 'post_id' => $post_id, 'nonce' => wp_create_nonce( 'app_attachment_upload' ), 'action' => 'app_plupload_handle_upload', ), 'drop_element' => '' ) ); $app_plupload_config = apply_filters( 'appthemes_plupload_config', $app_plupload_config ); wp_localize_script( 'app-plupload', 'AppPluploadConfig', $app_plupload_config ); } /** * Handle upload of attachment and generates metadata. * * @return void */ function appthemes_plupload_handle_upload() { check_ajax_referer( 'app_attachment_upload', 'nonce' ); $attach_id = false; $file_name = basename( $_FILES['app_attachment_file']['name'] ); $file_type = wp_check_filetype( $file_name ); $file_renamed = mt_rand( 1000, 1000000 ) . '.' . $file_type['ext']; $upload = array( 'name' => $file_renamed, 'type' => $file_type['type'], 'tmp_name' => $_FILES['app_attachment_file']['tmp_name'], 'error' => $_FILES['app_attachment_file']['error'], 'size' => $_FILES['app_attachment_file']['size'] ); $file = wp_handle_upload( $upload, array( 'test_form' => false ) ); if ( isset( $file['file'] ) ) { $file_loc = $file['file']; $attachment = array( 'post_mime_type' => $file_type['type'], 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $file_name ) ), 'post_content' => '', 'post_status' => 'inherit' ); $post_id = isset( $_POST['post_id'] ) ? intval( $_POST['post_id'] ) : 0; $attach_id = wp_insert_attachment( $attachment, $file_loc, $post_id ); $attach_data = wp_generate_attachment_metadata( $attach_id, $file_loc ); wp_update_attachment_metadata( $attach_id, $attach_data ); } if ( $attach_id ) { do_action( 'appthemes_plupload_uploaded_attachment', $attach_id ); $html = appthemes_plupload_attach_html( $attach_id ); $response = array( 'success' => true, 'html' => $html, ); die( json_encode( $response ) ); } $response = array( 'success' => false ); die( json_encode( $response ) ); } /** * Deletes attachment. * * @return string */ function appthemes_plupload_handle_delete() { check_ajax_referer( 'app_attachment', 'nonce' ); $attach_id = isset( $_POST['attach_id'] ) ? intval( $_POST['attach_id'] ) : 0; $attachment = get_post( $attach_id ); if ( get_current_user_id() == $attachment->post_author || current_user_can( 'delete_private_pages' ) ) { wp_delete_attachment( $attach_id, true ); do_action( 'appthemes_plupload_deleted_attachment', $attach_id ); echo 'success'; } exit; } /** * Associate previously uploaded attachments. * * @param int $post_id * @param array $attachments * @param array $titles (optional) * @param bool $print (optional) * * @return string */ function appthemes_plupload_associate_images( $post_id, $attachments, $titles = false, $print = false ) { $i = 0; $count = count( $attachments ); if ( $count > 0 && $print ) { echo html( 'p', __( 'Your listing images are now being processed...', APP_TD ) ); } foreach ( $attachments as $key => $attach_id ) { $update = array( 'ID' => $attach_id, 'post_parent' => $post_id ); if ( isset( $titles[ $key ] ) ) { $title = wp_strip_all_tags( $titles[ $key ] ); $update['post_title'] = $title; update_post_meta( $attach_id, '_wp_attachment_image_alt', $title ); } wp_update_post( $update ); do_action( 'appthemes_plupload_updated_attachment', $attach_id ); if ( $print ) { echo html( 'p', sprintf( __( 'Image number %1$d of %2$s has been processed.', APP_TD ), $i+1, $count ) ); } $i++; } } /** * Check state of app-plupload * * @return bool */ function appthemes_plupload_is_enabled() { if ( isset( $_REQUEST['app-plupload'] ) && $_REQUEST['app-plupload'] == 'disable' ) { return false; } if ( ! current_theme_supports( 'app-plupload' ) ) { return false; } return true; }
, где:
<a id="app-attachment-upload-pickfiles" class="button" href="#"><?php _e( 'Add Image', APP_TD ); ?></a>
— стандартный (Plupload) загрузчик изображений, а
<div class="drop-wrap"> <div id="image-upload" class="image-upload dropzone"></div> </div>
— обертка для Drag & Drop элемента от Dropzone
Всем неравнодушным большое спасибо за помощь заранее!
- Тема «Dropzone.js и ClassiPress» закрыта для новых ответов.