diff --git a/wp-admin/async-upload.php b/wp-admin/async-upload.php
new file mode 100644
index 000000000..24a68e8b1
--- /dev/null
+++ b/wp-admin/async-upload.php
@@ -0,0 +1,28 @@
+'.wp_specialchars($id->get_error_message()).'';
+ exit;
+}
+
+$type = $_REQUEST['type'];
+echo apply_filters("async_upload_{$type}", $id);
+
+?>
diff --git a/wp-admin/css/media.css b/wp-admin/css/media.css
index a281ad539..7313b9197 100644
--- a/wp-admin/css/media.css
+++ b/wp-admin/css/media.css
@@ -41,6 +41,7 @@ form.media-upload-form {
display:block;
font-weight: bold;
margin-bottom: 0.5em;
+ margin: 0 0 0.5em 0;
}
.media-upload-form label.form-help {
@@ -58,9 +59,11 @@ form.media-upload-form {
}
.media-upload-form fieldset {
+ width: 100%;
border: none;
text-align: justify;
- margin-bottom: 1em;
+ margin: 0 0 1em 0;
+ padding: 0;
}
.media-upload-form button.button-ok {
@@ -83,7 +86,8 @@ form.media-upload-form {
/* specific to the image upload form */
.media-upload-form fieldset#image-align label {
display: inline;
- padding: 0 28px;
+ padding: 0 0 0 28px;
+ margin: 0 0;
}
#image-align-none-label {
@@ -100,4 +104,88 @@ form.media-upload-form {
#image-align-right-label {
background: url(../images/align-right.png) no-repeat center left;
-}
\ No newline at end of file
+}
+
+.pinkynail {
+ max-width: 40px;
+ max-height: 40px;
+}
+
+#multimedia-items {
+ border: 1px solid #c0c0c0;
+ border-bottom: none;
+ width: 623px;
+}
+.multimedia-item {
+ border-bottom: 1px solid #d0d0d0;
+ width: 623px;
+ position: relative;
+}
+span.filename {
+ position: absolute;
+ left: 46px;
+ top: 0px;
+ line-height: 36px;
+ z-index: 2;
+}
+.progress {
+ width: 623px;
+ height: 36px;
+}
+.bar {
+ width: 0px;
+ height: 36px;
+ background-color: #e8e8e8;
+ border-right: 3px solid #99d;
+}
+.multimedia-item .thumbnail {
+
+}
+.multimedia-item .pinkynail {
+ position: absolute;
+ top: 3px;
+ left: 3px;
+ max-width: 40px;
+ max-height: 40px;
+}
+.describe {
+ display: none;
+ border-top: 1px solid #d0d0d0;
+ padding: 5px;
+}
+.describe fieldset {
+ width: 470px;
+ float: right;
+}
+.describe img {
+ float: left;
+}
+.describe input[type="text"], .describe textarea {
+ width: 450px;
+}
+.describe label {
+ padding-right: 1em;
+}
+
+a.delete {
+ clear: both;
+}
+.describe-toggle-on, .describe-toggle-off {
+ line-height: 36px;
+ z-index: 2;
+ position: absolute;
+ top: 0px;
+ right: 20px;
+}
+.describe-toggle-off {
+ display: none;
+}
+.clickmask {
+ background: transparent;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ cursor: pointer;
+ border: none;
+ z-index: 10;
+}
diff --git a/wp-admin/includes/media.php b/wp-admin/includes/media.php
index e98e4dba8..3a2fba8b2 100644
--- a/wp-admin/includes/media.php
+++ b/wp-admin/includes/media.php
@@ -14,7 +14,8 @@ function image_upload_form( $action_url, $values = array(), $error = null ) {
$image_url = attribute_escape( @$values['image-url'] );
$image_title = attribute_escape( @$values['image-title'] );
$image_align = @$values['image-url'];
-
+ $post_id = $_GET['post_id'];
+
?>
-
-
- get_error_message(); ?>
-
-
+
+get_error_message();
+} ?>
+
+
$id,
+ 'post_title' => $_POST['image-title'],
+ 'post_content' => $_POST['image-alt'],
+ ));
+ }
+ else {
+ $id = image_upload_post();
+ }
// if the input was invalid, redisplay the form with its current values
if ( is_wp_error($id) )
@@ -88,6 +144,45 @@ function image_upload_handler() {
}
}
+// this returns html to include in the single image upload form when the async flash upload has finished
+// i.e. show a thumb of the image, and include the attachment id as a hidden input
+function async_image_callback($id) {
+ $thumb_url = wp_get_attachment_thumb_url($id);
+ if ( empty($thumb_url) )
+ $thumb_url = wp_mime_type_icon($id);
+
+ if ($thumb_url) {
+ $out = ' '
+ . ' '
+ . basename(wp_get_attachment_url($id)).'
';
+ }
+ else {
+ $out = ' '
+ . basename(wp_get_attachment_url($id)).'
';
+ }
+
+ $post = get_post($id);
+ $title = addslashes($post->post_title);
+ $alt = addslashes($post->post_content);
+
+ // populate the input fields with post data (which in turn comes from exif/iptc)
+ $out .= <<
+
+
+EOF;
+
+ return $out;
+}
+
+add_filter('async_upload_image', 'async_image_callback');
+
+
function image_send_to_editor($id, $alt, $title, $align, $url='') {
$img_src = wp_get_attachment_url($id);
@@ -97,7 +192,7 @@ function image_send_to_editor($id, $alt, $title, $align, $url='') {
if ( isset($meta['width'], $meta['height']) )
$hwstring = ' width="'.intval($meta['width']).'" height="'.intval($meta['height']).'"';
- $html = ' ';
+ $html = ' ';
if ( $url )
$html = ''.$html.' ';
@@ -152,12 +247,51 @@ function image_upload_post() {
if ( !is_wp_error($id) )
wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
+ return $id;
+}
+
+// this handles the file upload POST itself, creating the attachment post
+function media_handle_upload($file_id, $post_id, $post_data = array()) {
+ $overrides = array('test_form'=>false);
+ $file = wp_handle_upload($_FILES[$file_id], $overrides);
+
+ if ( isset($file['error']) )
+ return new wp_error( 'upload_error', $file['error'] );
+
+ $url = $file['url'];
+ $type = $file['type'];
+ $file = $file['file'];
+ $title = preg_replace('/\.[^.]+$/', '', basename($file));
+ $content = '';
+
+ // use image exif/iptc data for title and caption defaults if possible
+ if ( $image_meta = @wp_read_image_metadata($file) ) {
+ if ( trim($image_meta['title']) )
+ $title = $image_meta['title'];
+ if ( trim($image_meta['caption']) )
+ $content = $image_meta['caption'];
+ }
+
+ // Construct the attachment array
+ $attachment = array_merge( array(
+ 'post_mime_type' => $type,
+ 'guid' => $url,
+ 'post_parent' => $post_id,
+ 'post_title' => $title,
+ 'post_content' => $content,
+ ), $post_data );
+
+ // Save the data
+ $id = wp_insert_attachment($attachment, $file, $post_parent);
+ if ( !is_wp_error($id) ) {
+ wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
+ }
+
return $id;
- wp_redirect( get_option('siteurl') . "/wp-admin/upload.php?style=$style&tab=browse&action=view&ID=$id&post_id=$post_id");
-
}
+
// wrap iframe content (produced by $content_func) in a doctype, html head/body etc
// any additional function args will be passed to content_func
function wp_iframe($content_func /* ... */) {
@@ -194,10 +328,13 @@ if ( is_string($content_func) )
function media_buttons() { // just a placeholder for now
global $post_ID, $temp_ID;
$uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID);
- $uploading_iframe_src = wp_nonce_url("media-upload.php?type=image&&post_id=$uploading_iframe_ID", 'inlineuploading');
- $uploading_iframe_src = apply_filters('uploading_iframe_src', $uploading_iframe_src);
+ $image_upload_iframe_src = wp_nonce_url("media-upload.php?type=image&post_id=$uploading_iframe_ID", 'inlineuploading');
+ $image_upload_iframe_src = apply_filters('image_upload_iframe_src', $image_upload_iframe_src);
+ $multimedia_upload_iframe_src = wp_nonce_url("media-upload.php?type=multimedia&post_id=$uploading_iframe_ID", 'inlineuploading');
+ $multimedia_upload_iframe_src = apply_filters('multimedia_upload_iframe_src', $multimedia_upload_iframe_src);
$out = <<
+Multimedia
+
EOF;
@@ -225,7 +362,214 @@ function media_admin_css() {
wp_admin_css('css/media');
}
+add_action('media_upload_multimedia', 'multimedia_upload_handler');
add_action('media_upload_image', 'image_upload_handler');
add_action('admin_head_image_upload_form', 'media_admin_css');
-?>
\ No newline at end of file
+function multimedia_upload_handler() {
+ if ( !current_user_can('upload_files') ) {
+ return new wp_error( 'upload_not_allowed', __('You are not allowed to upload files.') );
+ }
+
+ if ( empty($_POST) ) {
+ // no button click, we're just displaying the form
+ wp_iframe( 'multimedia_upload_form' );
+ } elseif ( empty($_POST['upload-button']) ) {
+ // Insert multimedia button was clicked
+ check_admin_referer('multimedia-form');
+
+ if ( !empty($_POST['attachments']) ) foreach ( $_POST['attachments'] as $attachment_id => $attachment ) {
+ $post = $_post = get_post($attachment_id, ARRAY_A);
+ $post['post_content'] = $attachment['post_content'];
+ $post['post_title'] = $attachment['post_title'];
+ if ( $post != $_post )
+ wp_update_post($post);
+
+ if ( $taxonomies = get_object_taxonomies('attachment') ) foreach ( $taxonomies as $t )
+ if ( isset($attachment[$t]) )
+ wp_set_object_terms($attachment_id, array_map('trim', preg_split('/,+/', $attachment[$t])), $t, false);
+ }
+
+ media_send_to_editor('[gallery]');
+ } else {
+ // Upload File button was clicked
+
+ $id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+
+ wp_iframe( 'multimedia_upload_form' );
+ }
+}
+
+function get_multimedia_items( $post_id ) {
+ $attachments = get_children("post_parent=$post_id&post_type=attachment&orderby=\"menu_order ASC, ID ASC\"");
+
+ if ( empty($attachments) )
+ return '';
+
+ foreach ( $attachments as $id => $attachment ) {
+ $output .= "\n";
+ }
+
+ return $output;
+}
+
+function get_multimedia_item( $attachment_id ) {
+ $thumb_url = wp_get_attachment_thumb_url( $attachment_id );
+ if ( empty($thumb_url) )
+ $thumb_url = wp_mime_type_icon( $attachment_id );
+
+ $title_label = __('Title');
+ $description_label = __('Description');
+ $tags_label = __('Tags');
+
+ $toggle_on = __('Describe »');
+ $toggle_off = __('Describe «');
+
+ $post = get_post($attachment_id);
+
+ $filename = basename($post->guid);
+ $title = attribute_escape($post->post_title);
+ $description = attribute_escape($post->post_content);
+ if ( $_tags = get_the_tags($attachment_id) ) {
+ foreach ( $_tags as $tag )
+ $tags[] = $tag->name;
+ $tags = attribute_escape(join(', ', $tags));
+ }
+
+ $delete_href = wp_nonce_url("post.php?action=delete-post&post=$attachment_id", 'delete-post_' . $attachment_id);
+ $delete = __('Delete');
+
+ $item = "
+ $toggle_on
+ $toggle_off
+ $filename
+
+";
+
+ return $item;
+}
+
+function multimedia_upload_form( $error = null ) {
+ $flash_action_url = get_option('siteurl') . '/wp-admin/async-upload.php?type=multimedia';
+ $form_action_url = get_option('siteurl') . '/wp-admin/media-upload.php?type=multimedia';
+
+ $post_id = intval($_REQUEST['post_id']);
+
+?>
+
+
+
+ get_error_message(); ?>
+
+
+
+
+
+
+
+
+
+
+ 'People'));
+
+?>
diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php
index 155a99b70..1e87fdd5e 100644
--- a/wp-admin/includes/template.php
+++ b/wp-admin/includes/template.php
@@ -745,10 +745,15 @@ function wp_convert_bytes_to_hr( $bytes ) {
return $size . $units[$power];
}
-function wp_import_upload_form( $action ) {
+function wp_max_upload_size() {
$u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) );
$p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) );
- $bytes = apply_filters( 'import_upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes );
+ $bytes = apply_filters( 'upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes );
+ return $bytes;
+}
+
+function wp_import_upload_form( $action ) {
+ $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );
$size = wp_convert_bytes_to_hr( $bytes );
?>