X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/41578db67d72562346e4dbb2a14889b23d522813..53f4633144ed68c8b8fb5861f992b5489894a940:/wp-admin/includes/media.php diff --git a/wp-admin/includes/media.php b/wp-admin/includes/media.php index 06cd1c12..fc8ce0fe 100644 --- a/wp-admin/includes/media.php +++ b/wp-admin/includes/media.php @@ -36,6 +36,8 @@ function media_upload_tabs() { * * @since 2.5.0 * + * @global wpdb $wpdb + * * @param array $tabs * @return array $tabs with gallery if post has image attachment */ @@ -61,12 +63,13 @@ function update_gallery_tab($tabs) { return $tabs; } -add_filter('media_upload_tabs', 'update_gallery_tab'); /** * {@internal Missing Short Description}} * * @since 2.5.0 + * + * @global string $redir_tab */ function the_media_upload_tabs() { global $redir_tab; @@ -158,6 +161,22 @@ function get_image_send_to_editor($id, $caption, $title, $align, $url='', $rel = */ function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) { + /** + * Filter the caption text. + * + * Note: If the caption text is empty, the caption shortcode will not be appended + * to the image HTML when inserted into the editor. + * + * Passing an empty value also prevents the {@see 'image_add_caption_shortcode'} + * filter from being evaluated at the end of {@see image_add_caption()}. + * + * @since 4.1.0 + * + * @param string $caption The original caption text. + * @param int $id The attachment ID. + */ + $caption = apply_filters( 'image_add_caption_text', $caption, $id ); + /** * Filter whether to disable captions. * @@ -180,7 +199,8 @@ function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $ $caption = str_replace( array("\r\n", "\r"), "\n", $caption); $caption = preg_replace_callback( '/<[a-zA-Z0-9]+(?: [^<>]+>)*/', '_cleanup_image_add_caption', $caption ); - // convert any remaining line breaks to
+ + // Convert any remaining line breaks to
. $caption = preg_replace( '/[ \n\t]*\n[ \t]*/', '
', $caption ); $html = preg_replace( '/(class=["\'][^\'"]*)align(none|left|right|center)\s?/', '$1', $html ); @@ -199,7 +219,6 @@ function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $ */ return apply_filters( 'image_add_caption_shortcode', $shcode, $html ); } -add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 ); /** * Private preg_replace callback used in image_add_caption() @@ -208,7 +227,7 @@ add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 ); * @since 3.4.0 */ function _cleanup_image_add_caption( $matches ) { - // remove any line breaks from inside the tags + // Remove any line breaks from inside the tags. return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] ); } @@ -222,24 +241,23 @@ function _cleanup_image_add_caption( $matches ) { function media_send_to_editor($html) { ?> false )) { @@ -264,31 +282,31 @@ function media_handle_upload($file_id, $post_id, $post_data = array(), $override $file = $file['file']; $title = $name; $content = ''; + $excerpt = ''; if ( preg_match( '#^audio#', $type ) ) { $meta = wp_read_audio_metadata( $file ); - if ( ! empty( $meta['title'] ) ) + if ( ! empty( $meta['title'] ) ) { $title = $meta['title']; - - $content = ''; + } if ( ! empty( $title ) ) { if ( ! empty( $meta['album'] ) && ! empty( $meta['artist'] ) ) { /* translators: 1: audio track title, 2: album title, 3: artist name */ $content .= sprintf( __( '"%1$s" from %2$s by %3$s.' ), $title, $meta['album'], $meta['artist'] ); - } else if ( ! empty( $meta['album'] ) ) { + } elseif ( ! empty( $meta['album'] ) ) { /* translators: 1: audio track title, 2: album title */ $content .= sprintf( __( '"%1$s" from %2$s.' ), $title, $meta['album'] ); - } else if ( ! empty( $meta['artist'] ) ) { + } elseif ( ! empty( $meta['artist'] ) ) { /* translators: 1: audio track title, 2: artist name */ $content .= sprintf( __( '"%1$s" by %2$s.' ), $title, $meta['artist'] ); } else { $content .= sprintf( __( '"%s".' ), $title ); } - } else if ( ! empty( $meta['album'] ) ) { + } elseif ( ! empty( $meta['album'] ) ) { if ( ! empty( $meta['artist'] ) ) { /* translators: 1: audio album title, 2: artist name */ @@ -297,7 +315,7 @@ function media_handle_upload($file_id, $post_id, $post_data = array(), $override $content .= $meta['album'] . '.'; } - } else if ( ! empty( $meta['artist'] ) ) { + } elseif ( ! empty( $meta['artist'] ) ) { $content .= $meta['artist'] . '.'; @@ -317,12 +335,15 @@ function media_handle_upload($file_id, $post_id, $post_data = array(), $override if ( ! empty( $meta['genre'] ) ) $content .= ' ' . sprintf( __( 'Genre: %s.' ), $meta['genre'] ); - // use image exif/iptc data for title and caption defaults if possible - } elseif ( $image_meta = @wp_read_image_metadata( $file ) ) { - if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) + // Use image exif/iptc data for title and caption defaults if possible. + } elseif ( 0 === strpos( $type, 'image/' ) && $image_meta = @wp_read_image_metadata( $file ) ) { + if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { $title = $image_meta['title']; - if ( trim( $image_meta['caption'] ) ) - $content = $image_meta['caption']; + } + + if ( trim( $image_meta['caption'] ) ) { + $excerpt = $image_meta['caption']; + } } // Construct the attachment array @@ -332,11 +353,11 @@ function media_handle_upload($file_id, $post_id, $post_data = array(), $override 'post_parent' => $post_id, 'post_title' => $title, 'post_content' => $content, + 'post_excerpt' => $excerpt, ), $post_data ); // This should never be set as it would then overwrite an existing attachment. - if ( isset( $attachment['ID'] ) ) - unset( $attachment['ID'] ); + unset( $attachment['ID'] ); // Save the data $id = wp_insert_attachment($attachment, $file, $post_id); @@ -378,7 +399,7 @@ function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = $title = preg_replace('/\.[^.]+$/', '', basename($file)); $content = ''; - // use image exif/iptc data for title and caption defaults if possible + // 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'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) $title = $image_meta['title']; @@ -389,7 +410,7 @@ function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = if ( isset( $desc ) ) $title = $desc; - // Construct the attachment array + // Construct the attachment array. $attachment = array_merge( array( 'post_mime_type' => $type, 'guid' => $url, @@ -399,8 +420,7 @@ function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = ), $post_data ); // This should never be set as it would then overwrite an existing attachment. - if ( isset( $attachment['ID'] ) ) - unset( $attachment['ID'] ); + unset( $attachment['ID'] ); // Save the attachment metadata $id = wp_insert_attachment($attachment, $file, $post_id); @@ -415,7 +435,9 @@ function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = * * @since 2.5.0 * - * @param array $content_func + * @global int $body_id + * + * @param string|callable $content_func */ function wp_iframe($content_func /* ... */) { _wp_admin_html_begin(); @@ -431,11 +453,9 @@ if ( ( is_array( $content_func ) && ! empty( $content_func[1] ) && 0 === strpos( wp_enqueue_style( 'ie' ); ?> '; - echo '' . $img . __( 'Add Media' ) . ''; - + $id_attribute = $instance === 1 ? ' id="insert-media-button"' : ''; + printf( '', + $id_attribute, + esc_attr( $editor_id ), + $img . __( 'Add Media' ) + ); /** * Filter the legacy (pre-3.5.0) media buttons. * @@ -543,8 +574,15 @@ function media_buttons($editor_id = 'content') { echo $legacy_filter; } } -add_action( 'media_buttons', 'media_buttons' ); +/** + * + * @global int $post_ID + * @param string $type + * @param int $post_id + * @param string $tab + * @return string + */ function get_upload_iframe_src( $type = null, $post_id = null, $tab = null ) { global $post_ID; @@ -562,7 +600,7 @@ function get_upload_iframe_src( $type = null, $post_id = null, $tab = null ) { /** * Filter the upload iframe source URL for a specific media type. * - * The dynamic portion of the hook name, $type, refers to the type + * The dynamic portion of the hook name, `$type`, refers to the type * of media uploaded. * * @since 3.0.0 @@ -587,8 +625,8 @@ function media_upload_form_handler() { $errors = null; if ( isset($_POST['send']) ) { - $keys = array_keys($_POST['send']); - $send_id = (int) array_shift($keys); + $keys = array_keys( $_POST['send'] ); + $send_id = (int) reset( $keys ); } if ( !empty($_POST['attachments']) ) foreach ( $_POST['attachments'] as $attachment_id => $attachment ) { @@ -627,7 +665,8 @@ function media_upload_form_handler() { $image_alt = wp_unslash( $attachment['image_alt'] ); if ( $image_alt != get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ) { $image_alt = wp_strip_all_tags( $image_alt, true ); - // update_meta expects slashed + + // Update_meta expects slashed. update_post_meta( $attachment_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) ); } } @@ -648,10 +687,8 @@ function media_upload_form_handler() { if ( isset($_POST['insert-gallery']) || isset($_POST['update-gallery']) ) { ?> "; return $html; + } else { + return new WP_Error( 'image_sideload_failed' ); } } @@ -841,7 +884,7 @@ function media_sideload_image($file, $post_id, $desc = null) { * * @since 2.5.0 * - * @return unknown + * @return string|null */ function media_upload_gallery() { $errors = array(); @@ -864,7 +907,7 @@ function media_upload_gallery() { * * @since 2.5.0 * - * @return unknown + * @return string|null */ function media_upload_library() { $errors = array(); @@ -885,7 +928,7 @@ function media_upload_library() { * * @since 2.7.0 * - * @param object $post + * @param WP_Post $post * @param string $checked * @return string */ @@ -913,12 +956,11 @@ function image_align_input_fields( $post, $checked = '' ) { * * @since 2.7.0 * - * @param object $post + * @param WP_Post $post * @param bool|string $check * @return array */ function image_size_input_fields( $post, $check = '' ) { - /** * Filter the names and labels of the default image sizes. * @@ -934,45 +976,53 @@ function image_size_input_fields( $post, $check = '' ) { 'full' => __( 'Full Size' ) ) ); - if ( empty($check) ) - $check = get_user_setting('imgsize', 'medium'); - - foreach ( $size_names as $size => $label ) { - $downsize = image_downsize($post->ID, $size); - $checked = ''; - - // is this size selectable? - $enabled = ( $downsize[3] || 'full' == $size ); - $css_id = "image-size-{$size}-{$post->ID}"; - // if this size is the default but that's not available, don't select it - if ( $size == $check ) { - if ( $enabled ) - $checked = " checked='checked'"; - else - $check = ''; - } elseif ( !$check && $enabled && 'thumbnail' != $size ) { - // if $check is not enabled, default to the first available size that's bigger than a thumbnail - $check = $size; + if ( empty( $check ) ) { + $check = get_user_setting('imgsize', 'medium'); + } + $out = array(); + + foreach ( $size_names as $size => $label ) { + $downsize = image_downsize( $post->ID, $size ); + $checked = ''; + + // Is this size selectable? + $enabled = ( $downsize[3] || 'full' == $size ); + $css_id = "image-size-{$size}-{$post->ID}"; + + // If this size is the default but that's not available, don't select it. + if ( $size == $check ) { + if ( $enabled ) { $checked = " checked='checked'"; + } else { + $check = ''; } + } elseif ( ! $check && $enabled && 'thumbnail' != $size ) { + /* + * If $check is not enabled, default to the first available size + * that's bigger than a thumbnail. + */ + $check = $size; + $checked = " checked='checked'"; + } - $html = "
"; - - $html .= ""; - // only show the dimensions if that choice is available - if ( $enabled ) - $html .= " "; + $html = "
"; - $html .= '
'; + $html .= ""; - $out[] = $html; + // Only show the dimensions if that choice is available. + if ( $enabled ) { + $html .= " "; } + $html .= '
'; - return array( - 'label' => __('Size'), - 'input' => 'html', - 'html' => join("\n", $out), - ); + $out[] = $html; + } + + return array( + 'label' => __( 'Size' ), + 'input' => 'html', + 'html' => join( "\n", $out ), + ); } /** @@ -980,7 +1030,7 @@ function image_size_input_fields( $post, $check = '' ) { * * @since 2.7.0 * - * @param object $post + * @param WP_Post $post * @param string $url_type * @return string */ @@ -1006,8 +1056,16 @@ function image_link_input_fields($post, $url_type = '') { "; } +/** + * Output a textarea element for inputting an attachment caption. + * + * @since 3.4.0 + * + * @param WP_Post $edit_post Attachment WP_Post object. + * @return string HTML markup for the textarea element. + */ function wp_caption_input_textarea($edit_post) { - // post data is already escaped + // Post data is already escaped. $name = "attachments[{$edit_post->ID}][post_excerpt]"; return ''; @@ -1031,9 +1089,9 @@ function image_attachment_fields_to_edit($form_fields, $post) { * * @since 2.5.0 * - * @param array $form_fields - * @param object $post {@internal $post not used}} - * @return array + * @param array $form_fields An array of attachment form fields. + * @param WP_Post $post The WP_Post attachment object. + * @return array Filtered attachment form fields. */ function media_single_attachment_fields_to_edit( $form_fields, $post ) { unset($form_fields['url'], $form_fields['align'], $form_fields['image-size']); @@ -1045,9 +1103,9 @@ function media_single_attachment_fields_to_edit( $form_fields, $post ) { * * @since 2.8.0 * - * @param array $form_fields - * @param object $post {@internal $post not used}} - * @return array + * @param array $form_fields An array of attachment form fields. + * @param WP_Post $post The WP_Post attachment object. + * @return array Filtered attachment form fields. */ function media_post_single_attachment_fields_to_edit( $form_fields, $post ) { unset($form_fields['image_url']); @@ -1063,9 +1121,9 @@ function media_post_single_attachment_fields_to_edit( $form_fields, $post ) { * * @since 2.5.0 * - * @param object $post - * @param array $attachment {@internal $attachment not used}} - * @return array + * @param array $post The WP_Post attachment object converted to an array. + * @param array $attachment An array of attachment metadata. + * @return array Filtered attachment post object. */ function image_attachment_fields_to_save( $post, $attachment ) { if ( substr( $post['post_mime_type'], 0, 5 ) == 'image' ) { @@ -1079,8 +1137,6 @@ function image_attachment_fields_to_save( $post, $attachment ) { return $post; } -add_filter( 'attachment_fields_to_save', 'image_attachment_fields_to_save', 10, 2 ); - /** * {@internal Missing Short Description}} * @@ -1089,7 +1145,7 @@ add_filter( 'attachment_fields_to_save', 'image_attachment_fields_to_save', 10, * @param string $html * @param integer $attachment_id * @param array $attachment - * @return array + * @return string */ function image_media_send_to_editor($html, $attachment_id, $attachment) { $post = get_post($attachment_id); @@ -1106,14 +1162,12 @@ function image_media_send_to_editor($html, $attachment_id, $attachment) { return $html; } -add_filter('media_send_to_editor', 'image_media_send_to_editor', 10, 3); - /** * {@internal Missing Short Description}} * * @since 2.5.0 * - * @param object $post + * @param WP_Post $post * @param array $errors * @return array */ @@ -1236,6 +1290,8 @@ function get_attachment_fields_to_edit($post, $errors = null) { * * @since 2.5.0 * + * @global WP_Query $wp_the_query + * * @param int $post_id Optional. Post ID. * @param array $errors Errors for attachment, if any. * @return string @@ -1270,6 +1326,8 @@ function get_media_items( $post_id, $errors ) { * * @since 2.5.0 * + * @global string $redir_tab + * * @param int $attachment_id Attachment ID for modification. * @param string|array $args Optional. Override defaults. * @return string HTML form for attachment. @@ -1285,7 +1343,13 @@ function get_media_item( $attachment_id, $args = null ) { $post = get_post( $attachment_id ); $current_post_id = !empty( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0; - $default_args = array( 'errors' => null, 'send' => $current_post_id ? post_type_supports( get_post_type( $current_post_id ), 'editor' ) : true, 'delete' => true, 'toggle' => true, 'show_title' => true ); + $default_args = array( + 'errors' => null, + 'send' => $current_post_id ? post_type_supports( get_post_type( $current_post_id ), 'editor' ) : true, + 'delete' => true, + 'toggle' => true, + 'show_title' => true + ); $args = wp_parse_args( $args, $default_args ); /** @@ -1297,8 +1361,7 @@ function get_media_item( $attachment_id, $args = null ) { * * @param array $args An array of arguments. */ - $args = apply_filters( 'get_media_item_args', $args ); - extract( $args, EXTR_SKIP ); + $r = apply_filters( 'get_media_item_args', $args ); $toggle_on = __( 'Show' ); $toggle_off = __( 'Hide' ); @@ -1306,21 +1369,15 @@ function get_media_item( $attachment_id, $args = null ) { $filename = esc_html( wp_basename( $post->guid ) ); $title = esc_attr( $post->post_title ); - if ( $_tags = get_the_tags( $attachment_id ) ) { - foreach ( $_tags as $tag ) - $tags[] = $tag->name; - $tags = esc_attr( join( ', ', $tags ) ); - } - $post_mime_types = get_post_mime_types(); $keys = array_keys( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) ); - $type = array_shift( $keys ); + $type = reset( $keys ); $type_html = ""; - $form_fields = get_attachment_fields_to_edit( $post, $errors ); + $form_fields = get_attachment_fields_to_edit( $post, $r['errors'] ); - if ( $toggle ) { - $class = empty( $errors ) ? 'startclosed' : 'startopen'; + if ( $r['toggle'] ) { + $class = empty( $r['errors'] ) ? 'startclosed' : 'startopen'; $toggle_links = " $toggle_on $toggle_off"; @@ -1330,7 +1387,7 @@ function get_media_item( $attachment_id, $args = null ) { } $display_title = ( !empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case - $display_title = $show_title ? "
" . wp_html_excerpt( $display_title, 60, '…' ) . "
" : ''; + $display_title = $r['show_title'] ? "
" . wp_html_excerpt( $display_title, 60, '…' ) . "
" : ''; $gallery = ( ( isset( $_REQUEST['tab'] ) && 'gallery' == $_REQUEST['tab'] ) || ( isset( $redir_tab ) && 'gallery' == $redir_tab ) ); $order = ''; @@ -1404,8 +1461,11 @@ function get_media_item( $attachment_id, $args = null ) { 'extra_rows' => array(), ); - if ( $send ) - $send = get_submit_button( __( 'Insert into Post' ), 'button', "send[$attachment_id]", false ); + if ( $r['send'] ) { + $r['send'] = get_submit_button( __( 'Insert into Post' ), 'button', "send[$attachment_id]", false ); + } + + $delete = empty( $r['delete'] ) ? '' : $r['delete']; if ( $delete && current_user_can( 'delete_post', $attachment_id ) ) { if ( !EMPTY_TRASH_DAYS ) { $delete = "" . __( 'Delete Permanently' ) . ''; @@ -1425,19 +1485,24 @@ function get_media_item( $attachment_id, $args = null ) { $thumbnail = ''; $calling_post_id = 0; - if ( isset( $_GET['post_id'] ) ) + if ( isset( $_GET['post_id'] ) ) { $calling_post_id = absint( $_GET['post_id'] ); - elseif ( isset( $_POST ) && count( $_POST ) ) // Like for async-upload where $_GET['post_id'] isn't set + } elseif ( isset( $_POST ) && count( $_POST ) ) {// Like for async-upload where $_GET['post_id'] isn't set $calling_post_id = $post->post_parent; + } if ( 'image' == $type && $calling_post_id && current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) ) && post_type_supports( get_post_type( $calling_post_id ), 'thumbnail' ) && get_post_thumbnail_id( $calling_post_id ) != $attachment_id ) { + + $calling_post = get_post( $calling_post_id ); + $calling_post_type_object = get_post_type_object( $calling_post->post_type ); + $ajax_nonce = wp_create_nonce( "set_post_thumbnail-$calling_post_id" ); - $thumbnail = "" . esc_html__( "Use as featured image" ) . ""; + $thumbnail = "" . esc_html( $calling_post_type_object->labels->use_featured_image ) . ""; } - if ( ( $send || $thumbnail || $delete ) && !isset( $form_fields['buttons'] ) ) - $form_fields['buttons'] = array( 'tr' => "\t\t$send $thumbnail $delete\n" ); - + if ( ( $r['send'] || $thumbnail || $delete ) && !isset( $form_fields['buttons'] ) ) { + $form_fields['buttons'] = array( 'tr' => "\t\t" . $r['send'] . " $thumbnail $delete\n" ); + } $hidden_fields = array(); foreach ( $form_fields as $id => $field ) { @@ -1467,10 +1532,10 @@ function get_media_item( $attachment_id, $args = null ) { $item .= $field[ $field['input'] ]; elseif ( $field['input'] == 'textarea' ) { if ( 'post_content' == $id && user_can_richedit() ) { - // sanitize_post() skips the post_content when user_can_richedit + // Sanitize_post() skips the post_content when user_can_richedit. $field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES ); } - // post_excerpt is already escaped by sanitize_post() in get_attachment_fields_to_edit() + // Post_excerpt is already escaped by sanitize_post() in get_attachment_fields_to_edit(). $item .= "'; } else { $item .= ""; @@ -1512,6 +1577,13 @@ function get_media_item( $attachment_id, $args = null ) { return $item; } +/** + * @since 3.5.0 + * + * @param int $attachment_id + * @param array $args + * @return array + */ function get_compat_media_markup( $attachment_id, $args = null ) { $post = get_post( $attachment_id ); @@ -1616,7 +1688,7 @@ function get_compat_media_markup( $attachment_id, $args = null ) { $item .= $field[ $field['input'] ]; elseif ( $field['input'] == 'textarea' ) { if ( 'post_content' == $id && user_can_richedit() ) { - // sanitize_post() skips the post_content when user_can_richedit + // sanitize_post() skips the post_content when user_can_richedit. $field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES ); } $item .= "'; @@ -1668,7 +1740,8 @@ function get_compat_media_markup( $attachment_id, $args = null ) { */ function media_upload_header() { $post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : 0; - echo '\n"; + + echo ''; if ( empty( $_GET['chromeless'] ) ) { echo '
'; the_media_upload_tabs(); @@ -1681,13 +1754,18 @@ function media_upload_header() { * * @since 2.5.0 * - * @param unknown_type $errors + * @global string $type + * @global string $tab + * @global bool $is_IE + * @global bool $is_opera + * + * @param array $errors */ function media_upload_form( $errors = null ) { global $type, $tab, $is_IE, $is_opera; if ( ! _device_can_upload() ) { - echo '

' . sprintf( __('The web browser on your device cannot be used to upload files. You may be able to use the native app for your device instead.'), 'https://wordpress.org/mobile/' ) . '

'; + echo '

' . sprintf( __('The web browser on your device cannot be used to upload files. You may be able to use the native app for your device instead.'), 'https://apps.wordpress.org/' ) . '

'; return; } @@ -1696,18 +1774,9 @@ function media_upload_form( $errors = null ) { $_type = isset($type) ? $type : ''; $_tab = isset($tab) ? $tab : ''; - $upload_size_unit = $max_upload_size = wp_max_upload_size(); - $sizes = array( 'KB', 'MB', 'GB' ); - - for ( $u = -1; $upload_size_unit > 1024 && $u < count( $sizes ) - 1; $u++ ) { - $upload_size_unit /= 1024; - } - - if ( $u < 0 ) { - $upload_size_unit = 0; - $u = 0; - } else { - $upload_size_unit = (int) $upload_size_unit; + $max_upload_size = wp_max_upload_size(); + if ( ! $max_upload_size ) { + $max_upload_size = 0; } ?> @@ -1742,11 +1811,11 @@ if ( is_multisite() && !is_upload_space_available() ) { do_action( 'pre-upload-ui' ); $post_params = array( - "post_id" => $post_id, - "_wpnonce" => wp_create_nonce('media-form'), - "type" => $_type, - "tab" => $_tab, - "short" => "1", + "post_id" => $post_id, + "_wpnonce" => wp_create_nonce('media-form'), + "type" => $_type, + "tab" => $_tab, + "short" => "1", ); /** @@ -1774,10 +1843,13 @@ $plupload_init = array( 'multipart_params' => $post_params, ); -// Multi-file uploading doesn't currently work in iOS Safari, -// single-file allows the built-in camera to be used as source for images -if ( wp_is_mobile() ) +// Currently only iOS Safari supports multiple files uploading but iOS 7.x has a bug that prevents uploading of videos +// when enabled. See #29602. +if ( wp_is_mobile() && strpos( $_SERVER['HTTP_USER_AGENT'], 'OS 7_' ) !== false && + strpos( $_SERVER['HTTP_USER_AGENT'], 'like Mac OS X' ) !== false ) { + $plupload_init['multi_selection'] = false; +} /** * Filter the default Plupload settings. @@ -1801,7 +1873,7 @@ if( !$large_size_w ) $large_size_w = 1024; ?> var resize_height = , resize_width = , -wpUploaderInit = ; +wpUploaderInit = ;
@@ -1856,7 +1928,7 @@ do_action( 'post-html-upload-ui' ); ?>
- +

@@ -2091,6 +2158,10 @@ echo apply_filters( 'type_url_form_media', wp_media_insert_url_form( $type ) ); * * @since 2.5.0 * + * @global string $redir_tab + * @global string $type + * @global string $tab + * * @param array $errors */ function media_upload_gallery_form($errors) { @@ -2110,7 +2181,6 @@ function media_upload_gallery_form($errors) { ?>
@@ -2238,6 +2307,13 @@ jQuery(function($){ * * @since 2.5.0 * + * @global wpdb $wpdb + * @global WP_Query $wp_query + * @global WP_Locale $wp_locale + * @global string $type + * @global string $tab + * @global array $post_mime_types + * * @param array $errors */ function media_upload_library_form($errors) { @@ -2270,7 +2346,7 @@ function media_upload_library_form($errors) { ?> -
+ @@ -2303,7 +2379,7 @@ if ( empty($_GET['post_mime_type']) || $_GET['post_mime_type'] == 'all' ) $class = ' class="current"'; else $class = ''; -$type_links[] = "
  • 'all', 'paged'=>false, 'm'=>false))) . "'$class>".__('All Types').""; +$type_links[] = '
  • ' . __('All Types') . ''; foreach ( $post_mime_types as $mime_type => $label ) { $class = ''; @@ -2313,12 +2389,12 @@ foreach ( $post_mime_types as $mime_type => $label ) { if ( isset($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) ) $class = ' class="current"'; - $type_links[] = "
  • $mime_type, 'paged'=>false))) . "'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), "" . number_format_i18n( $num_posts[$mime_type] ) . '') . ''; + $type_links[] = '
  • ' . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), '' . number_format_i18n( $num_posts[$mime_type] ) . '') . ''; } /** * Filter the media upload mime type list items. * - * Returned values should begin with an
  • tag. + * Returned values should begin with an `
  • ` tag. * * @since 3.1.0 * @@ -2522,6 +2598,8 @@ function wp_media_insert_url_form( $default_view = 'image' ) { * Displays the multi-file uploader message. * * @since 2.6.0 + * + * @global int $post_ID */ function media_upload_flash_bypass() { $browser_uploader = admin_url( 'media-new.php?browser-uploader' ); @@ -2537,7 +2615,6 @@ function media_upload_flash_bypass() {

    ID ) ) $thumb_url = wp_get_attachment_image_src( $attachment_id, array( 900, 450 ), true ); - $filename = esc_html( basename( $post->guid ) ); - $title = esc_attr( $post->post_title ); $alt_text = get_post_meta( $post->ID, '_wp_attachment_image_alt', true ); $att_url = wp_get_attachment_url( $post->ID ); ?> @@ -2632,13 +2706,13 @@ function edit_form_image_editor( $post ) {
  • post_mime_type, 'audio/' ) ): + elseif ( $attachment_id && wp_attachment_is( 'audio', $post ) ): wp_maybe_generate_attachment_metadata( $post ); echo wp_audio_shortcode( array( 'src' => $att_url ) ); - elseif ( $attachment_id && 0 === strpos( $post->post_mime_type, 'video/' ) ): + elseif ( $attachment_id && wp_attachment_is( 'video', $post ) ): wp_maybe_generate_attachment_metadata( $post ); @@ -2655,6 +2729,11 @@ function edit_form_image_editor( $post ) { $attr['height'] = $h; } + $thumb_id = get_post_thumbnail_id( $attachment_id ); + if ( ! empty( $thumb_id ) ) { + $attr['poster'] = wp_get_attachment_url( $thumb_id ); + } + echo wp_video_shortcode( $attr ); endif; ?> @@ -2831,21 +2910,6 @@ function attachment_submitbox_metadata() { endif; } -add_filter( 'async_upload_image', 'get_media_item', 10, 2 ); -add_filter( 'async_upload_audio', 'get_media_item', 10, 2 ); -add_filter( 'async_upload_video', 'get_media_item', 10, 2 ); -add_filter( 'async_upload_file', 'get_media_item', 10, 2 ); - -add_action( 'media_upload_image', 'wp_media_upload_handler' ); -add_action( 'media_upload_audio', 'wp_media_upload_handler' ); -add_action( 'media_upload_video', 'wp_media_upload_handler' ); -add_action( 'media_upload_file', 'wp_media_upload_handler' ); - -add_filter( 'media_upload_gallery', 'media_upload_gallery' ); -add_filter( 'media_upload_library', 'media_upload_library' ); - -add_action( 'attachment_submitbox_misc_actions', 'attachment_submitbox_metadata' ); - /** * Parse ID3v2, ID3v1, and getID3 comments to extract usable data * @@ -2858,9 +2922,9 @@ function wp_add_id3_tag_data( &$metadata, $data ) { foreach ( array( 'id3v2', 'id3v1' ) as $version ) { if ( ! empty( $data[$version]['comments'] ) ) { foreach ( $data[$version]['comments'] as $key => $list ) { - if ( ! empty( $list ) ) { + if ( 'length' !== $key && ! empty( $list ) ) { $metadata[$key] = reset( $list ); - // fix bug in byte stream analysis + // Fix bug in byte stream analysis. if ( 'terms_of_use' === $key && 0 === strpos( $metadata[$key], 'yright notice.' ) ) $metadata[$key] = 'Cop' . $metadata[$key]; } @@ -2896,7 +2960,7 @@ function wp_add_id3_tag_data( &$metadata, $data ) { * @since 3.6.0 * * @param string $file Path to file. - * @return array|boolean Returns array of metadata, if found. + * @return array|bool Returns array of metadata, if found. */ function wp_read_video_metadata( $file ) { if ( ! file_exists( $file ) ) @@ -2920,7 +2984,7 @@ function wp_read_video_metadata( $file ) { if ( ! empty( $data['mime_type'] ) ) $metadata['mime_type'] = $data['mime_type']; if ( ! empty( $data['playtime_seconds'] ) ) - $metadata['length'] = (int) ceil( $data['playtime_seconds'] ); + $metadata['length'] = (int) round( $data['playtime_seconds'] ); if ( ! empty( $data['playtime_string'] ) ) $metadata['length_formatted'] = $data['playtime_string']; if ( ! empty( $data['video']['resolution_x'] ) ) @@ -2952,7 +3016,7 @@ function wp_read_video_metadata( $file ) { * @since 3.6.0 * * @param string $file Path to file. - * @return array|boolean Returns array of metadata, if found. + * @return array|bool Returns array of metadata, if found. */ function wp_read_audio_metadata( $file ) { if ( ! file_exists( $file ) ) @@ -2976,7 +3040,7 @@ function wp_read_audio_metadata( $file ) { if ( ! empty( $data['mime_type'] ) ) $metadata['mime_type'] = $data['mime_type']; if ( ! empty( $data['playtime_seconds'] ) ) - $metadata['length'] = (int) ceil( $data['playtime_seconds'] ); + $metadata['length'] = (int) round( $data['playtime_seconds'] ); if ( ! empty( $data['playtime_string'] ) ) $metadata['length_formatted'] = $data['playtime_string']; @@ -2984,3 +3048,63 @@ function wp_read_audio_metadata( $file ) { return $metadata; } + +/** + * Encapsulate logic for Attach/Detach actions + * + * @since 4.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $parent_id Attachment parent ID. + * @param string $action Optional. Attach/detach action. Accepts 'attach' or 'detach'. + * Default 'attach'. + */ +function wp_media_attach_action( $parent_id, $action = 'attach' ) { + global $wpdb; + + if ( ! $parent_id ) { + return; + } + + if ( ! current_user_can( 'edit_post', $parent_id ) ) { + wp_die( __( 'You are not allowed to edit this post.' ) ); + } + $ids = array(); + foreach ( (array) $_REQUEST['media'] as $att_id ) { + $att_id = (int) $att_id; + + if ( ! current_user_can( 'edit_post', $att_id ) ) { + continue; + } + + $ids[] = $att_id; + } + + if ( ! empty( $ids ) ) { + $ids_string = implode( ',', $ids ); + if ( 'attach' === $action ) { + $result = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ( $ids_string )", $parent_id ) ); + } else { + $result = $wpdb->query( "UPDATE $wpdb->posts SET post_parent = 0 WHERE post_type = 'attachment' AND ID IN ( $ids_string )" ); + } + + foreach ( $ids as $att_id ) { + clean_attachment_cache( $att_id ); + } + } + + if ( isset( $result ) ) { + $location = 'upload.php'; + if ( $referer = wp_get_referer() ) { + if ( false !== strpos( $referer, 'upload.php' ) ) { + $location = remove_query_arg( array( 'attached', 'detach' ), $referer ); + } + } + + $key = 'attach' === $action ? 'attached' : 'detach'; + $location = add_query_arg( array( $key => $result ), $location ); + wp_redirect( $location ); + exit; + } +}