]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-admin/includes/media.php
WordPress 4.2
[autoinstalls/wordpress.git] / wp-admin / includes / media.php
index 7fa4dd8f05aaa995fc9dd60734a7a989aba5aa4a..75811962f96617ac8bb59acc1b3644800f265964 100644 (file)
@@ -239,24 +239,23 @@ function _cleanup_image_add_caption( $matches ) {
 function media_send_to_editor($html) {
 ?>
 <script type="text/javascript">
-/* <![CDATA[ */
 var win = window.dialogArguments || opener || parent || top;
 win.send_to_editor('<?php echo addslashes($html); ?>');
-/* ]]> */
 </script>
 <?php
        exit;
 }
 
 /**
- * This handles the file upload POST itself, creating the attachment post.
+ * Save a file submitted from a POST request and create an attachment post for it.
  *
  * @since 2.5.0
  *
- * @param string $file_id Index into the {@link $_FILES} array of the upload
- * @param int $post_id The post ID the media is associated with
- * @param array $post_data allows you to overwrite some of the attachment
- * @param array $overrides allows you to override the {@link wp_handle_upload()} behavior
+ * @param string $file_id   Index of the {@link $_FILES} array that the file was sent. Required.
+ * @param int    $post_id   The post ID of a post to attach the media item to. Required, but can
+ *                          be set to 0, creating a media item that has no relationship to a post.
+ * @param array  $post_data Overwrite some of the attachment. Optional.
+ * @param array  $overrides Override the {@link wp_handle_upload()} behavior. Optional.
  * @return int|WP_Error ID of the attachment or a WP_Error object on failure.
  */
 function media_handle_upload($file_id, $post_id, $post_data = array(), $overrides = array( 'test_form' => false )) {
@@ -281,31 +280,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 */
@@ -314,7 +313,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'] . '.';
 
@@ -336,10 +335,13 @@ function media_handle_upload($file_id, $post_id, $post_data = array(), $override
 
        // 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'] ) ) )
+               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
@@ -349,6 +351,7 @@ 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.
@@ -448,11 +451,9 @@ if ( ( is_array( $content_func ) && ! empty( $content_func[1] ) && 0 === strpos(
 wp_enqueue_style( 'ie' );
 ?>
 <script type="text/javascript">
-//<![CDATA[
 addLoadEvent = function(func){if(typeof jQuery!="undefined")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
 var ajaxurl = '<?php echo admin_url( 'admin-ajax.php', 'relative' ); ?>', pagenow = 'media-upload-popup', adminpage = 'media-upload-popup',
 isRtl = <?php echo (int) is_rtl(); ?>;
-//]]>
 </script>
 <?php
        /** This action is documented in wp-admin/admin-header.php */
@@ -620,8 +621,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 ) {
@@ -682,10 +683,8 @@ function media_upload_form_handler() {
 
        if ( isset($_POST['insert-gallery']) || isset($_POST['update-gallery']) ) { ?>
                <script type="text/javascript">
-               /* <![CDATA[ */
                var win = window.dialogArguments || opener || parent || top;
                win.tb_remove();
-               /* ]]> */
                </script>
                <?php
                exit;
@@ -830,9 +829,10 @@ function wp_media_upload_handler() {
  * @param string $file The URL of the image to download
  * @param int $post_id The post ID the media is to be associated with
  * @param string $desc Optional. Description of the image
+ * @param string $return Optional. What to return: an image tag (default) or only the src.
  * @return string|WP_Error Populated HTML img tag on success
  */
-function media_sideload_image( $file, $post_id, $desc = null ) {
+function media_sideload_image( $file, $post_id, $desc = null, $return = 'html' ) {
        if ( ! empty( $file ) ) {
                // Set variables for storage, fix file filename for query strings.
                preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
@@ -861,9 +861,15 @@ function media_sideload_image( $file, $post_id, $desc = null ) {
 
        // Finally check to make sure the file has been saved, then return the HTML.
        if ( ! empty( $src ) ) {
+               if ( $return === 'src' ) {
+                       return $src;
+               }
+
                $alt = isset( $desc ) ? esc_attr( $desc ) : '';
                $html = "<img src='$src' alt='$alt' />";
                return $html;
+       } else {
+               return new WP_Error( 'image_sideload_failed' );
        }
 }
 
@@ -949,7 +955,6 @@ function image_align_input_fields( $post, $checked = '' ) {
  * @return array
  */
 function image_size_input_fields( $post, $check = '' ) {
-
        /**
         * Filter the names and labels of the default image sizes.
         *
@@ -965,50 +970,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;
-                               $checked = " checked='checked'";
-                       }
+       if ( empty( $check ) ) {
+               $check = get_user_setting('imgsize', 'medium');
+       }
+       $out = array();
 
-                       $html = "<div class='image-size-item'><input type='radio' " . disabled( $enabled, false, false ) . "name='attachments[$post->ID][image-size]' id='{$css_id}' value='{$size}'$checked />";
+       foreach ( $size_names as $size => $label ) {
+               $downsize = image_downsize( $post->ID, $size );
+               $checked = '';
 
-                       $html .= "<label for='{$css_id}'>$label</label>";
+               // 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'";
+               }
 
-                       // Only show the dimensions if that choice is available.
-                       if ( $enabled )
-                               $html .= " <label for='{$css_id}' class='help'>" . sprintf( "(%d&nbsp;&times;&nbsp;%d)", $downsize[1], $downsize[2] ). "</label>";
+               $html = "<div class='image-size-item'><input type='radio' " . disabled( $enabled, false, false ) . "name='attachments[$post->ID][image-size]' id='{$css_id}' value='{$size}'$checked />";
 
-                       $html .= '</div>';
+               $html .= "<label for='{$css_id}'>$label</label>";
 
-                       $out[] = $html;
+               // Only show the dimensions if that choice is available.
+               if ( $enabled ) {
+                       $html .= " <label for='{$css_id}' class='help'>" . sprintf( "(%d&nbsp;&times;&nbsp;%d)", $downsize[1], $downsize[2] ). "</label>";
                }
+               $html .= '</div>';
 
-               return array(
-                       'label' => __('Size'),
-                       'input' => 'html',
-                       'html'  => join("\n", $out),
-               );
+               $out[] = $html;
+       }
+
+       return array(
+               'label' => __( 'Size' ),
+               'input' => 'html',
+               'html'  => join( "\n", $out ),
+       );
 }
 
 /**
@@ -1349,7 +1357,7 @@ function get_media_item( $attachment_id, $args = null ) {
 
        $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 = "<input type='hidden' id='type-of-$attachment_id' value='" . esc_attr( $type ) . "' />";
 
        $form_fields = get_attachment_fields_to_edit( $post, $r['errors'] );
@@ -1944,7 +1952,6 @@ function media_upload_type_form($type = 'file', $errors = null, $id = null) {
 <?php media_upload_form( $errors ); ?>
 
 <script type="text/javascript">
-//<![CDATA[
 jQuery(function($){
        var preloaded = $(".media-item.preloaded");
        if ( preloaded.length > 0 ) {
@@ -1952,7 +1959,6 @@ jQuery(function($){
        }
        updateMediaForm();
 });
-//]]>
 </script>
 <div id="media-items"><?php
 
@@ -2007,7 +2013,6 @@ function media_upload_type_url_form($type = null, $errors = null, $id = null) {
 <h3 class="media-title"><?php _e('Insert media from another website'); ?></h3>
 
 <script type="text/javascript">
-//<![CDATA[
 var addExtImage = {
 
        width : '',
@@ -2084,21 +2089,19 @@ var addExtImage = {
                        return false;
                }
 
-               document.getElementById('status_img').innerHTML = '<img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" width="16" />';
+               document.getElementById('status_img').innerHTML = '<img src="<?php echo esc_url( admin_url( 'images/spinner-2x.gif' ) ); ?>" alt="" width="16" height="16" />';
                t.preloadImg = new Image();
                t.preloadImg.onload = t.updateImageData;
                t.preloadImg.onerror = t.resetImageData;
                t.preloadImg.src = src;
        }
-}
+};
 
 jQuery(document).ready( function($) {
        $('.media-types input').click( function() {
                $('table.describe').toggleClass('not-image', $('#not-image').prop('checked') );
        });
 });
-
-//]]>
 </script>
 
 <div id="media-items">
@@ -2301,7 +2304,7 @@ function media_upload_library_form($errors) {
 
 ?>
 
-<form id="filter" action="" method="get">
+<form id="filter" method="get">
 <input type="hidden" name="type" value="<?php echo esc_attr( $type ); ?>" />
 <input type="hidden" name="tab" value="<?php echo esc_attr( $tab ); ?>" />
 <input type="hidden" name="post_id" value="<?php echo (int) $post_id; ?>" />
@@ -2661,13 +2664,13 @@ function edit_form_image_editor( $post ) {
                        <?php if ( $open ) wp_image_editor( $attachment_id ); ?>
                </div>
        <?php
-       elseif ( $attachment_id && 0 === strpos( $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 );
 
@@ -3018,3 +3021,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;
+       }
+}