<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[45538] trunk/src: Save progress of intermediate image creation after upload.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/45538">45538</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/45538","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>azaozz</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2019-06-15 01:01:48 +0000 (Sat, 15 Jun 2019)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Save progress of intermediate image creation after upload. First run.
- Introduces `wp_get_missing_image_subsizes()` and `wp_update_image_subsizes()` to generate image sub-sizes that are missing or were not created after the upload.
- Adds a way to display errors that happened while creating sub-sizes.
- Introduces `wp_create_image_subsizes()` intended for use after an image was uploaded. It saves/updates the image metadata immediately after each sub-size is created. This fixes the (long standing) problem when some of the sub-size image files were created but there was a timeout or an error and the metadata was not saved. Until now such uploads were considered "failed" which usually resulted in the user trying to upload the same image again, creating even more "orphan" image files.

Note that the patch also includes some unrelated WPCS fixes.

Props mikeschroder, azaozz.
See <a href="https://core.trac.wordpress.org/ticket/40439">#40439</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesimagephp">trunk/src/wp-admin/includes/image.php</a></li>
<li><a href="#trunksrcwpincludesclasswpimageeditorgdphp">trunk/src/wp-includes/class-wp-image-editor-gd.php</a></li>
<li><a href="#trunksrcwpincludesclasswpimageeditorimagickphp">trunk/src/wp-includes/class-wp-image-editor-imagick.php</a></li>
<li><a href="#trunksrcwpincludesmediaphp">trunk/src/wp-includes/media.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesimagephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/image.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/image.php     2019-06-14 11:25:45 UTC (rev 45537)
+++ trunk/src/wp-admin/includes/image.php       2019-06-15 01:01:48 UTC (rev 45538)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -67,92 +67,237 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Generate post thumbnail attachment meta data.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Compare the existing image sub-sizes (as saved in the attachment meta)
+ * to the currently registered image sub-sizes, and return the difference.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @since 2.1.0
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Registered sub-sizes that are larger than the image are skipped.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param int $attachment_id Attachment Id to process.
- * @param string $file Filepath of the Attached image.
- * @return mixed Metadata for attachment.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 5.3.0
+ *
+ * @param int $attachment_id The image attachment post ID.
+ * @return array An array of the image sub-sizes that are currently defined but don't exist for this image.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function wp_generate_attachment_metadata( $attachment_id, $file ) {
-       $attachment = get_post( $attachment_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function wp_get_missing_image_subsizes( $attachment_id ) {
+       if ( ! wp_attachment_is_image( $attachment_id ) ) {
+               return array();
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $metadata  = array();
-       $support   = false;
-       $mime_type = get_post_mime_type( $attachment );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $registered_sizes = wp_get_registered_image_subsizes();
+       $image_meta       = wp_get_attachment_metadata( $attachment_id );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) {
-               $imagesize          = getimagesize( $file );
-               $metadata['width']  = $imagesize[0];
-               $metadata['height'] = $imagesize[1];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Meta error?
+       if ( empty( $image_meta ) ) {
+               return $defined_sizes;
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $full_width     = (int) $image_meta['width'];
+       $full_height    = (int) $image_meta['height'];
+       $possible_sizes = array();
+
+       // Skip registered sizes that are too large for the uploaded image.
+       foreach ( $registered_sizes as $size_name => $size_data ) {
+               if ( image_resize_dimensions( $full_width, $full_height, $size_data['width'], $size_data['height'], $size_data['crop'] ) ) {
+                       $possible_sizes[ $size_name ] = $size_data;
+               }
+       }
+
+       if ( empty( $image_meta['sizes'] ) ) {
+               $image_meta['sizes'] = array();
+       }
+
+       // Remove sizes that already exist. Only checks for matching "size names".
+       // It is possible that the dimensions for a particular size name have changed.
+       // For example the user has changed the values on the Settings -> Media screen.
+       // However we keep the old sub-sizes with the previous dimensions
+       // as the image may have been used in an older post.
+       $missing_sizes = array_diff_key( $possible_sizes, $image_meta['sizes'] );
+
+       /**
+        * Filters the array of missing image sub-sizes for an uploaded image.
+        *
+        * @since 5.3.0
+        *
+        * @param array $missing_sizes Array with the missing image sub-sizes.
+        * @param array $image_meta    The image meta data.
+        * @param int   $attachment_id The image attachment post ID.
+        */
+       return apply_filters( 'wp_get_missing_image_subsizes', $missing_sizes, $image_meta, $attachment_id );
+}
+
+/**
+ * If any of the currently registered image sub-sizes are missing,
+ * create them and update the image meta data.
+ *
+ * @since 5.3.0
+ *
+ * @param int $attachment_id The image attachment post ID.
+ * @return array The updated image meta data array.
+ */
+function wp_update_image_subsizes( $attachment_id ) {
+       $missing_sizes = wp_get_missing_image_subsizes( $attachment_id );
+       $image_meta    = wp_get_attachment_metadata( $attachment_id );
+
+       if ( empty( $missing_sizes ) ) {
+               return $image_meta;
+       }
+
+       $image_file = get_attached_file( $attachment_id );
+
+       // This also updates the image meta.
+       return _wp_make_subsizes( $missing_sizes, $image_file, $image_meta, $attachment_id );
+}
+
+/**
+ * Creates image sub-sizes, adds the new data to the image meta `sizes` array, and updates the image metadata.
+ *
+ * Intended for use after an image is uploaded. Saves/updates the image metadata after each
+ * sub-size is created. If there was an error, it is added to the returned image metadata array.
+ *
+ * @since 5.3.0
+ *
+ * @param string $file          Full path to the image file.
+ * @param array  $image_meta    The attachment meta data array.
+ * @param int    $attachment_id Attachment Id to process.
+ * @return array The attachment metadata with updated `sizes` array. Includes an array of errors encountered while resizing.
+ */
+function wp_create_image_subsizes( $file, $image_meta, $attachment_id ) {
+       if ( empty( $image_meta ) || ! isset( $image_meta['width'], $image_meta['height'] ) ) {
+               // New uploaded image.
+               $imagesize            = getimagesize( $file );
+               $image_meta['width']  = $imagesize[0];
+               $image_meta['height'] = $imagesize[1];
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Make the file path relative to the upload dir.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $metadata['file'] = _wp_relative_upload_path( $file );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $image_meta['file'] = _wp_relative_upload_path( $file );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Make thumbnails and other intermediate sizes.
-               $_wp_additional_image_sizes = wp_get_additional_image_sizes();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // Fetch additional metadata from EXIF/IPTC.
+               $exif_meta = wp_read_image_metadata( $file );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $sizes = array();
-               foreach ( get_intermediate_image_sizes() as $s ) {
-                       $sizes[ $s ] = array(
-                               'width'  => '',
-                               'height' => '',
-                               'crop'   => false,
-                       );
-                       if ( isset( $_wp_additional_image_sizes[ $s ]['width'] ) ) {
-                               // For theme-added sizes
-                               $sizes[ $s ]['width'] = intval( $_wp_additional_image_sizes[ $s ]['width'] );
-                       } else {
-                               // For default sizes set in options
-                               $sizes[ $s ]['width'] = get_option( "{$s}_size_w" );
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $exif_meta ) {
+                       $image_meta['image_meta'] = $exif_meta;
+               }
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( isset( $_wp_additional_image_sizes[ $s ]['height'] ) ) {
-                               // For theme-added sizes
-                               $sizes[ $s ]['height'] = intval( $_wp_additional_image_sizes[ $s ]['height'] );
-                       } else {
-                               // For default sizes set in options
-                               $sizes[ $s ]['height'] = get_option( "{$s}_size_h" );
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $new_sizes = wp_get_registered_image_subsizes();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( isset( $_wp_additional_image_sizes[ $s ]['crop'] ) ) {
-                               // For theme-added sizes
-                               $sizes[ $s ]['crop'] = $_wp_additional_image_sizes[ $s ]['crop'];
-                       } else {
-                               // For default sizes set in options
-                               $sizes[ $s ]['crop'] = get_option( "{$s}_crop" );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Filters the image sizes automatically generated when uploading an image.
+        *
+        * @since 2.9.0
+        * @since 4.4.0 Added the `$image_meta` argument.
+        * @since 5.3.0 Added the `$attachment_id` argument.
+        *
+        * @param array $new_sizes     Associative array of image sizes to be created.
+        * @param array $image_meta    The image meta data: width, height, file, sizes, etc.
+        * @param int   $attachment_id The attachment post ID for the image.
+        */
+       $new_sizes = apply_filters( 'intermediate_image_sizes_advanced', $new_sizes, $image_meta, $attachment_id );
+
+       return _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id );
+}
+
+/**
+ * Low-level function to create image sub-sizes.
+ *
+ * Updates the image meta after each sub-size is created.
+ * Errors are stored in the returned image metadata array.
+ *
+ * @since 5.3.0
+ * @access private
+ *
+ * $padam array  $new_sizes     Array defining what sizes to create.
+ * @param string $file          Full path to the image file.
+ * @param array  $image_meta    The attachment meta data array.
+ * @param int    $attachment_id Attachment Id to process.
+ * @return array The attachment meta data with updated `sizes` array. Includes an array of errors encountered while resizing.
+ */
+function _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id ) {
+       // Check if any of the new sizes already exist.
+       if ( isset( $image_meta['sizes'] ) && is_array( $image_meta['sizes'] ) ) {
+               foreach ( $image_meta['sizes'] as $size_name => $size_meta ) {
+                       // Only checks "size name" so we don't override existing images even if the dimensions
+                       // don't match the currently defined size with the same name.
+                       // To change the behavior, unset changed/mismatched sizes in the `sizes` array in image meta.
+                       if ( array_key_exists( $size_name, $new_sizes ) ) {
+                               unset( $new_sizes[ $size_name ] );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        } else {
+               $image_meta['sizes'] = array();
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                /**
-                * Filters the image sizes automatically generated when uploading an image.
-                *
-                * @since 2.9.0
-                * @since 4.4.0 Added the `$metadata` argument.
-                * @since 5.1.0 Added the `$attachment_id` argument.
-                *
-                * @param array $sizes         An associative array of image sizes.
-                * @param array $metadata      An associative array of image metadata: width, height, file.
-                * @param int   $attachment_id Current attachment ID.
-                */
-               $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes, $metadata, $attachment_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! empty( $new_sizes ) ) {
+               $editor = wp_get_image_editor( $file );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $sizes ) {
-                       $editor = wp_get_image_editor( $file );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! is_wp_error( $editor ) ) {
+                       if ( method_exists( $editor, 'make_subsize' ) ) {
+                               foreach ( $new_sizes as $new_size_name => $new_size_data ) {
+                                       $new_size_meta = $editor->make_subsize( $new_size_data );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! is_wp_error( $editor ) ) {
-                               $metadata['sizes'] = $editor->multi_resize( $sizes );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 if ( is_wp_error( $new_size_meta ) ) {
+                                               if ( empty( $image_meta['subsize_errors'] ) ) {
+                                                       $image_meta['subsize_errors'] = array();
+                                               }
+
+                                               $error = array(
+                                                       'error_code'    => $new_size_meta->get_error_code(),
+                                                       'error_message' => $new_size_meta->get_error_message(),
+                                               );
+
+                                               // Store the error code and error message for displaying in the UI.
+                                               $image_meta['subsize_errors'][ $new_size_name ] = $error;
+                                       } else {
+                                               // The sub-size was created successfully.
+                                               // Clear out previous errors in creating this subsize.
+                                               if ( ! empty( $image_meta['subsize_errors'][ $new_size_name ] ) ) {
+                                                       unset( $image_meta['subsize_errors'][ $new_size_name ] );
+                                               }
+
+                                               if ( empty( $image_meta['subsize_errors'] ) ) {
+                                                       unset( $image_meta['subsize_errors'] );
+                                               }
+
+                                               // Save the size meta value.
+                                               $image_meta['sizes'][ $new_size_name ] = $new_size_meta;
+                                       }
+
+                                       wp_update_attachment_metadata( $attachment_id, $image_meta );
+                               }
+                       } else {
+                               // Fall back to `$editor->multi_resize()`.
+                               $created_sizes = $editor->multi_resize( $new_sizes );
+
+                               if ( ! empty( $created_sizes ) ) {
+                                       $image_meta['sizes'] = array_merge( $image_meta['sizes'], $created_sizes );
+                                       unset( $image_meta['subsize_errors'] );
+                                       wp_update_attachment_metadata( $attachment_id, $image_meta );
+                               }
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } else {
-                       $metadata['sizes'] = array();
</del><span class="cx" style="display: block; padding: 0 10px">                 }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Fetch additional metadata from EXIF/IPTC.
-               $image_meta = wp_read_image_metadata( $file );
-               if ( $image_meta ) {
-                       $metadata['image_meta'] = $image_meta;
-               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return $image_meta;
+}
+
+/**
+ * Generate attachment meta data and create image sub-sizes for images.
+ *
+ * @since 2.1.0
+ *
+ * @param int $attachment_id Attachment Id to process.
+ * @param string $file Filepath of the Attached image.
+ * @return mixed Metadata for attachment.
+ */
+function wp_generate_attachment_metadata( $attachment_id, $file ) {
+       $attachment = get_post( $attachment_id );
+
+       $metadata  = array();
+       $support   = false;
+       $mime_type = get_post_mime_type( $attachment );
+
+       if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) {
+               // Make thumbnails and other intermediate sizes.
+               $metadata = wp_create_image_subsizes( $file, $metadata, $attachment_id );
</ins><span class="cx" style="display: block; padding: 0 10px">         } elseif ( wp_attachment_is( 'video', $attachment ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $metadata = wp_read_video_metadata( $file );
</span><span class="cx" style="display: block; padding: 0 10px">                $support  = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -234,34 +379,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px">                $fallback_sizes = apply_filters( 'fallback_intermediate_image_sizes', $fallback_sizes, $metadata );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $sizes                      = array();
-               $_wp_additional_image_sizes = wp_get_additional_image_sizes();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $defined_sizes = wp_get_registered_image_subsizes();
+               $merged_sizes  = array_intersect_key( $defined_sizes, array_flip( $fallback_sizes ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $fallback_sizes as $s ) {
-                       if ( isset( $_wp_additional_image_sizes[ $s ]['width'] ) ) {
-                               $sizes[ $s ]['width'] = intval( $_wp_additional_image_sizes[ $s ]['width'] );
-                       } else {
-                               $sizes[ $s ]['width'] = get_option( "{$s}_size_w" );
-                       }
-
-                       if ( isset( $_wp_additional_image_sizes[ $s ]['height'] ) ) {
-                               $sizes[ $s ]['height'] = intval( $_wp_additional_image_sizes[ $s ]['height'] );
-                       } else {
-                               $sizes[ $s ]['height'] = get_option( "{$s}_size_h" );
-                       }
-
-                       if ( isset( $_wp_additional_image_sizes[ $s ]['crop'] ) ) {
-                               $sizes[ $s ]['crop'] = $_wp_additional_image_sizes[ $s ]['crop'];
-                       } else {
-                               // Force thumbnails to be soft crops.
-                               if ( 'thumbnail' !== $s ) {
-                                       $sizes[ $s ]['crop'] = get_option( "{$s}_crop" );
-                               }
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // Force thumbnails to be soft crops.
+               if ( isset( $merged_sizes['thumbnail'] ) && is_array( $merged_sizes['thumbnail'] ) ) {
+                       $merged_sizes['thumbnail']['crop'] = false;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Only load PDFs in an image editor if we're processing sizes.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ! empty( $sizes ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! empty( $merged_sizes ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $editor = wp_get_image_editor( $file );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( ! is_wp_error( $editor ) ) { // No support for this type of file
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -282,7 +409,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        unset( $uploaded['path'] );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                        if ( ! is_wp_error( $editor ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                                $metadata['sizes']         = $editor->multi_resize( $sizes );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                         $metadata['sizes']         = $editor->multi_resize( $merged_sizes );
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 $metadata['sizes']['full'] = $uploaded;
</span><span class="cx" style="display: block; padding: 0 10px">                                        }
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -449,7 +576,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $exif_image_types = apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( is_callable( 'exif_read_data' ) && in_array( $image_type, $exif_image_types ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( is_callable( 'exif_read_data' ) && in_array( $image_type, $exif_image_types, true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $exif = @exif_read_data( $file );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! empty( $exif['ImageDescription'] ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -571,7 +698,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $info = @getimagesize( $path );
</span><span class="cx" style="display: block; padding: 0 10px">        if ( empty( $info ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $result = false;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( ! in_array( $info[2], $displayable_image_types ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( ! in_array( $info[2], $displayable_image_types, true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $result = false;
</span><span class="cx" style="display: block; padding: 0 10px">        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                $result = true;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -654,7 +781,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $filepath = get_attached_file( $attachment_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( $filepath && file_exists( $filepath ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'full' != $size && ( $data = image_get_intermediate_size( $attachment_id, $size ) ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $data = image_get_intermediate_size( $attachment_id, $size );
+
+               if ( 'full' != $size && $data ) {
+                       $filepath = path_join( dirname( $filepath ), $data['file'] );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         /**
</span><span class="cx" style="display: block; padding: 0 10px">                         * Filters the path to the current image.
</span><span class="cx" style="display: block; padding: 0 10px">                         *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -666,9 +797,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         * @param string $attachment_id Attachment ID.
</span><span class="cx" style="display: block; padding: 0 10px">                         * @param string $size          Size of the image.
</span><span class="cx" style="display: block; padding: 0 10px">                         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $filepath = apply_filters( 'load_image_to_edit_filesystempath', path_join( dirname( $filepath ), $data['file'] ), $attachment_id, $size );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $filepath = apply_filters( 'load_image_to_edit_filesystempath', $filepath, $attachment_id, $size );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( function_exists( 'fopen' ) && true == ini_get( 'allow_url_fopen' ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( function_exists( 'fopen' ) && true === ini_get( 'allow_url_fopen' ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Filters the image URL if not in the local filesystem.
</span><span class="cx" style="display: block; padding: 0 10px">                 *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -705,7 +836,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return string|false New file path on success, false on failure.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function _copy_image_file( $attachment_id ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $dst_file = $src_file = get_attached_file( $attachment_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $dst_file = get_attached_file( $attachment_id );
+       $src_file = $dst_file;
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! file_exists( $src_file ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $src_file = _load_image_to_edit_path( $attachment_id );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpimageeditorgdphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-image-editor-gd.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-image-editor-gd.php        2019-06-14 11:25:45 UTC (rev 45537)
+++ trunk/src/wp-includes/class-wp-image-editor-gd.php  2019-06-15 01:01:48 UTC (rev 45538)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -43,7 +43,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // On some setups GD library does not provide imagerotate() - Ticket #11536
</span><span class="cx" style="display: block; padding: 0 10px">                if ( isset( $args['methods'] ) &&
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        in_array( 'rotate', $args['methods'] ) &&
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 in_array( 'rotate', $args['methods'], true ) &&
</ins><span class="cx" style="display: block; padding: 0 10px">                         ! function_exists( 'imagerotate' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                return false;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -178,9 +178,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        protected function _resize( $max_w, $max_h, $crop = false ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! $dims ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ), $this->file );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $resized = wp_imagecreatetruecolor( $dst_w, $dst_h );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -217,43 +219,62 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @return array An array of resized images' metadata by size.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function multi_resize( $sizes ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $metadata  = array();
-               $orig_size = $this->size;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $metadata = array();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $sizes as $size => $size_data ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
-                               continue;
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $meta = $this->make_subsize( $size_data );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['width'] ) ) {
-                               $size_data['width'] = null;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( ! is_wp_error( $meta ) ) {
+                               $metadata[ $size ] = $meta;
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['height'] ) ) {
-                               $size_data['height'] = null;
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['crop'] ) ) {
-                               $size_data['crop'] = false;
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return $metadata;
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $image     = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
-                       $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Create an image sub-size and return the image meta data value for it.
+        *
+        * @since 5.3.0
+        *
+        * @param array $size_data Array of width, height, and whether to crop.
+        * @return WP_Error|array WP_Error on error, or the image data array for inclusion in the `sizes` array in the image meta.
+        */
+       public function make_subsize( $size_data ) {
+               if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
+                       return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! is_wp_error( $image ) && ! $duplicate ) {
-                               $resized = $this->_save( $image );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $orig_size = $this->size;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                imagedestroy( $image );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! isset( $size_data['width'] ) ) {
+                       $size_data['width'] = null;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( ! is_wp_error( $resized ) && $resized ) {
-                                       unset( $resized['path'] );
-                                       $metadata[ $size ] = $resized;
-                               }
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! isset( $size_data['height'] ) ) {
+                       $size_data['height'] = null;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $this->size = $orig_size;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! isset( $size_data['crop'] ) ) {
+                       $size_data['crop'] = false;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return $metadata;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $resized = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
+
+               if ( is_wp_error( $resized ) ) {
+                       $saved = $resized;
+               } else {
+                       $saved = $this->_save( $resized );
+                       imagedestroy( $resized );
+               }
+
+               $this->size = $orig_size;
+
+               if ( ! is_wp_error( $saved ) ) {
+                       unset( $saved['path'] );
+               }
+
+               return $saved;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -391,11 +412,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $filename = $this->generate_filename( null, null, $extension );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'image/gif' == $mime_type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( 'image/gif' === $mime_type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( ! $this->make_image( $filename, 'imagegif', array( $image, $filename ) ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } elseif ( 'image/png' == $mime_type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         } elseif ( 'image/png' === $mime_type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         // convert from full colors to index colors, like original PNG.
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( function_exists( 'imageistruecolor' ) && ! imageistruecolor( $image ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                imagetruecolortopalette( $image, false, imagecolorstotal( $image ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -404,7 +425,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } elseif ( 'image/jpeg' == $mime_type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         } elseif ( 'image/jpeg' === $mime_type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpimageeditorimagickphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-image-editor-imagick.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-image-editor-imagick.php   2019-06-14 11:25:45 UTC (rev 45537)
+++ trunk/src/wp-includes/class-wp-image-editor-imagick.php     2019-06-15 01:01:48 UTC (rev 45538)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -108,7 +108,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // setIteratorIndex is optional unless mime is an animated format.
</span><span class="cx" style="display: block; padding: 0 10px">                // Here, we just say no if you are missing it and aren't loading a jpeg.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && $mime_type != 'image/jpeg' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && $mime_type !== 'image/jpeg' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -146,7 +146,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        $filename       = $this->file;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 'pdf' == $file_extension ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( 'pdf' === $file_extension ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 $filename = $this->pdf_setup();
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -193,7 +193,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                try {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 'image/jpeg' == $this->mime_type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( 'image/jpeg' === $this->mime_type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 $this->image->setImageCompressionQuality( $quality );
</span><span class="cx" style="display: block; padding: 0 10px">                                $this->image->setImageCompression( imagick::COMPRESSION_JPEG );
</span><span class="cx" style="display: block; padding: 0 10px">                        } else {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -260,6 +260,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! $dims ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $crop ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -312,7 +313,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 * Set the filter value if '$filter_name' name is in our whitelist and the related
</span><span class="cx" style="display: block; padding: 0 10px">                 * Imagick constant is defined or fall back to our default filter.
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( in_array( $filter_name, $allowed_filters ) && defined( 'Imagick::' . $filter_name ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( in_array( $filter_name, $allowed_filters, true ) && defined( 'Imagick::' . $filter_name ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $filter = constant( 'Imagick::' . $filter_name );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        $filter = defined( 'Imagick::FILTER_TRIANGLE' ) ? Imagick::FILTER_TRIANGLE : false;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -361,7 +362,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Set appropriate quality settings after resizing.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 'image/jpeg' == $this->mime_type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( 'image/jpeg' === $this->mime_type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 if ( is_callable( array( $this->image, 'unsharpMaskImage' ) ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        $this->image->unsharpMaskImage( 0.25, 0.25, 8, 0.065 );
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -413,7 +414,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 3.5.0
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param array $sizes {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         *     An array of image size arrays. Default sizes are 'small', 'medium', 'medium_large', 'large'.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  *     An array of image size arrays. Default sizes are 'thumbnail', 'medium', 'medium_large', 'large'.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         *     Either a height or width must be provided.
</span><span class="cx" style="display: block; padding: 0 10px">         *     If one of the two is set to null, the resize will
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -430,52 +431,67 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @return array An array of resized images' metadata by size.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function multi_resize( $sizes ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $metadata   = array();
-               $orig_size  = $this->size;
-               $orig_image = $this->image->getImage();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $metadata = array();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $sizes as $size => $size_data ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! $this->image ) {
-                               $this->image = $orig_image->getImage();
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $meta = $this->make_subsize( $size_data );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
-                               continue;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( ! is_wp_error( $meta ) ) {
+                               $metadata[ $size ] = $meta;
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['width'] ) ) {
-                               $size_data['width'] = null;
-                       }
-                       if ( ! isset( $size_data['height'] ) ) {
-                               $size_data['height'] = null;
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return $metadata;
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! isset( $size_data['crop'] ) ) {
-                               $size_data['crop'] = false;
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Create an image sub-size and return the image meta data value for it.
+        *
+        * @since 5.3.0
+        *
+        * @param array $size_data Array of width, height, and whether to crop.
+        * @return WP_Error|array WP_Error on error, or the image data array for inclusion in the `sizes` array in the image meta.
+        */
+       public function make_subsize( $size_data ) {
+               if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
+                       return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
-                       $duplicate     = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $orig_size  = $this->size;
+               $orig_image = $this->image->getImage();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! is_wp_error( $resize_result ) && ! $duplicate ) {
-                               $resized = $this->_save( $this->image );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! isset( $size_data['width'] ) ) {
+                       $size_data['width'] = null;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $this->image->clear();
-                               $this->image->destroy();
-                               $this->image = null;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! isset( $size_data['height'] ) ) {
+                       $size_data['height'] = null;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( ! is_wp_error( $resized ) && $resized ) {
-                                       unset( $resized['path'] );
-                                       $metadata[ $size ] = $resized;
-                               }
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! isset( $size_data['crop'] ) ) {
+                       $size_data['crop'] = false;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $this->size = $orig_size;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $resized = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
+
+               if ( is_wp_error( $resized ) ) {
+                       $saved = $resized;
+               } else {
+                       $saved = $this->_save( $this->image );
+
+                       $this->image->clear();
+                       $this->image->destroy();
+                       $this->image = null;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $this->size  = $orig_size;
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->image = $orig_image;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return $metadata;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! is_wp_error( $saved ) ) {
+                       unset( $saved['path'] );
+               }
+
+               return $saved;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -717,7 +733,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                try {
</span><span class="cx" style="display: block; padding: 0 10px">                        // Strip profiles.
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $this->image->getImageProfiles( '*', true ) as $key => $value ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( ! in_array( $key, $protected_profiles ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         if ( ! in_array( $key, $protected_profiles, true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $this->image->removeImageProfile( $key );
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span></span></pre></div>
<a id="trunksrcwpincludesmediaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/media.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/media.php   2019-06-14 11:25:45 UTC (rev 45537)
+++ trunk/src/wp-includes/media.php     2019-06-15 01:01:48 UTC (rev 45538)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -17,9 +17,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_get_additional_image_sizes() {
</span><span class="cx" style="display: block; padding: 0 10px">        global $_wp_additional_image_sizes;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! $_wp_additional_image_sizes ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $_wp_additional_image_sizes = array();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         return $_wp_additional_image_sizes;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -66,7 +68,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        if ( is_array( $size ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $max_width  = $size[0];
</span><span class="cx" style="display: block; padding: 0 10px">                $max_height = $size[1];
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( $size == 'thumb' || $size == 'thumbnail' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( $size === 'thumb' || $size === 'thumbnail' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $max_width  = intval( get_option( 'thumbnail_size_w' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                $max_height = intval( get_option( 'thumbnail_size_h' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                // last chance thumbnail size defaults
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -74,11 +76,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $max_width  = 128;
</span><span class="cx" style="display: block; padding: 0 10px">                        $max_height = 96;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( $size == 'medium' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( $size === 'medium' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $max_width  = intval( get_option( 'medium_size_w' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                $max_height = intval( get_option( 'medium_size_h' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( $size == 'medium_large' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( $size === 'medium_large' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $max_width  = intval( get_option( 'medium_large_size_w' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                $max_height = intval( get_option( 'medium_large_size_h' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -85,7 +87,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( intval( $content_width ) > 0 ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $max_width = min( intval( $content_width ), $max_width );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( $size == 'large' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( $size === 'large' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 /*
</span><span class="cx" style="display: block; padding: 0 10px">                 * We're inserting a large size image into the editor. If it's a really
</span><span class="cx" style="display: block; padding: 0 10px">                 * big image we'll scale it down to fit reasonably within the editor
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -94,10 +96,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px">                $max_width  = intval( get_option( 'large_size_w' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                $max_height = intval( get_option( 'large_size_h' ) );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( intval( $content_width ) > 0 ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $max_width = min( intval( $content_width ), $max_width );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( ! empty( $_wp_additional_image_sizes ) && in_array( $size, array_keys( $_wp_additional_image_sizes ) ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( ! empty( $_wp_additional_image_sizes ) && in_array( $size, array_keys( $_wp_additional_image_sizes ), true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $max_width  = intval( $_wp_additional_image_sizes[ $size ]['width'] );
</span><span class="cx" style="display: block; padding: 0 10px">                $max_height = intval( $_wp_additional_image_sizes[ $size ]['height'] );
</span><span class="cx" style="display: block; padding: 0 10px">                // Only in admin. Assume that theme authors know what they're doing.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -195,13 +198,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param array|string $size     Size of image. Image size or array of width and height values (in that order).
</span><span class="cx" style="display: block; padding: 0 10px">         *                               Default 'medium'.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $out = apply_filters( 'image_downsize', false, $id, $size ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $out = apply_filters( 'image_downsize', false, $id, $size );
+
+       if ( $out ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $out;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $img_url          = wp_get_attachment_url( $id );
</span><span class="cx" style="display: block; padding: 0 10px">        $meta             = wp_get_attachment_metadata( $id );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $width            = $height = 0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $width            = 0;
+       $height           = 0;
</ins><span class="cx" style="display: block; padding: 0 10px">         $is_intermediate  = false;
</span><span class="cx" style="display: block; padding: 0 10px">        $img_url_basename = wp_basename( $img_url );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -219,14 +225,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // try for a new style intermediate size
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $intermediate = image_get_intermediate_size( $id, $size ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $intermediate = image_get_intermediate_size( $id, $size );
+
+       if ( $intermediate ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $img_url         = str_replace( $img_url_basename, $intermediate['file'], $img_url );
</span><span class="cx" style="display: block; padding: 0 10px">                $width           = $intermediate['width'];
</span><span class="cx" style="display: block; padding: 0 10px">                $height          = $intermediate['height'];
</span><span class="cx" style="display: block; padding: 0 10px">                $is_intermediate = true;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } elseif ( $size == 'thumbnail' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ } elseif ( $size === 'thumbnail' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 // fall back to the old thumbnail
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ( $thumb_file = wp_get_attachment_thumb_file( $id ) ) && $info = getimagesize( $thumb_file ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $thumb_file = wp_get_attachment_thumb_file( $id );
+               $info       = getimagesize( $thumb_file );
+
+               if ( $thumb_file && $info ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $img_url         = str_replace( $img_url_basename, wp_basename( $thumb_file ), $img_url );
</span><span class="cx" style="display: block; padding: 0 10px">                        $width           = $info[0];
</span><span class="cx" style="display: block; padding: 0 10px">                        $height          = $info[1];
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -233,6 +244,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $is_intermediate = true;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! $width && ! $height && isset( $meta['width'], $meta['height'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                // any other type: use the real image
</span><span class="cx" style="display: block; padding: 0 10px">                $width  = $meta['width'];
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -245,8 +257,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                return array( $img_url, $width, $height, $is_intermediate );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         return false;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -412,8 +424,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return array( $current_width, $current_height );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $width_ratio = $height_ratio = 1.0;
-       $did_width   = $did_height = false;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $width_ratio  = 1.0;
+       $height_ratio = 1.0;
+       $did_width    = false;
+       $did_height   = false;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( $max_width > 0 && $current_width > 0 && $current_width > $max_width ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $width_ratio = $max_width / $current_width;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -446,12 +460,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">        // Thus we look for dimensions that are one pixel shy of the max value and bump them up
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Note: $did_width means it is possible $smaller_ratio == $width_ratio.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $did_width && $w == $max_width - 1 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $did_width && $w === $max_width - 1 ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $w = $max_width; // Round it up
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Note: $did_height means it is possible $smaller_ratio == $height_ratio.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $did_height && $h == $max_height - 1 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $did_height && $h === $max_height - 1 ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $h = $max_height; // Round it up
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -520,6 +534,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *                           An array can specify positioning of the crop area. Default false.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $output = apply_filters( 'image_resize_dimensions', null, $orig_w, $orig_h, $dest_w, $dest_h, $crop );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( null !== $output ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return $output;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -576,7 +591,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // if the resulting image would be the same size or larger we don't want to resize it
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $new_w >= $orig_w && $new_h >= $orig_h && $dest_w != $orig_w && $dest_h != $orig_h ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $new_w >= $orig_w && $new_h >= $orig_h && intval( $dest_w ) !== intval( $orig_w ) && intval( $dest_h ) !== intval( $orig_h ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -687,7 +702,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * }
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! $size || ! is_array( $imagedata = wp_get_attachment_metadata( $post_id ) ) || empty( $imagedata['sizes'] ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $imagedata = wp_get_attachment_metadata( $post_id );
+
+       if ( ! $size || ! is_array( $imagedata ) || empty( $imagedata['sizes'] ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -704,7 +721,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $imagedata['sizes'] as $_size => $data ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        // If there's an exact match to an existing image size, short circuit.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( $data['width'] == $size[0] && $data['height'] == $size[1] ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( intval( $data['width'] ) === intval( $size[0] ) && intval( $data['height'] ) === intval( $size[1] ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 $candidates[ $data['width'] * $data['height'] ] = $data;
</span><span class="cx" style="display: block; padding: 0 10px">                                break;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -785,10 +802,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return array Returns a filtered array of image size strings.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_intermediate_image_sizes() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $_wp_additional_image_sizes = wp_get_additional_image_sizes();
-       $image_sizes                = array( 'thumbnail', 'medium', 'medium_large', 'large' ); // Standard sizes
-       if ( ! empty( $_wp_additional_image_sizes ) ) {
-               $image_sizes = array_merge( $image_sizes, array_keys( $_wp_additional_image_sizes ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $default_sizes    = array( 'thumbnail', 'medium', 'medium_large', 'large' );
+       $additional_sizes = wp_get_additional_image_sizes();
+
+       if ( ! empty( $additional_sizes ) ) {
+               $default_sizes = array_merge( $default_sizes, array_keys( $additional_sizes ) );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -796,13 +814,64 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.5.0
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param array $image_sizes An array of intermediate image sizes. Defaults
-        *                           are 'thumbnail', 'medium', 'medium_large', 'large'.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param array $default_sizes An array of intermediate image sizes. Defaults
+        *                             are 'thumbnail', 'medium', 'medium_large', 'large'.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        return apply_filters( 'intermediate_image_sizes', $image_sizes );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return apply_filters( 'intermediate_image_sizes', $default_sizes );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Returns a normalized list of all currently registered image sub-sizes.
+ *
+ * @since 5.3.0
+ * @uses wp_get_additional_image_sizes()
+ * @uses get_intermediate_image_sizes()
+ *
+ * @return array Associative array of the registered image sub-sizes.
+ */
+function wp_get_registered_image_subsizes() {
+       $additional_sizes = wp_get_additional_image_sizes();
+       $all_sizes        = array();
+
+       foreach ( get_intermediate_image_sizes() as $size_name ) {
+               $size_data = array(
+                       'width'  => 0,
+                       'height' => 0,
+                       'crop'   => false,
+               );
+
+               if ( isset( $additional_sizes[ $size_name ]['width'] ) ) {
+                       // For sizes added by plugins and themes.
+                       $size_data['width'] = intval( $additional_sizes[ $size_name ]['width'] );
+               } else {
+                       // For default sizes set in options.
+                       $size_data['width'] = intval( get_option( "{$size_name}_size_w" ) );
+               }
+
+               if ( isset( $additional_sizes[ $size_name ]['height'] ) ) {
+                       $size_data['height'] = intval( $additional_sizes[ $size_name ]['height'] );
+               } else {
+                       $size_data['height'] = intval( get_option( "{$size_name}_size_h" ) );
+               }
+
+               if ( empty( $size_data['width'] ) && empty( $size_data['height'] ) ) {
+                       // This size isn't set.
+                       continue;
+               }
+
+               if ( isset( $additional_sizes[ $size_name ]['crop'] ) ) {
+                       $size_data['crop'] = (bool) $additional_sizes[ $size_name ]['crop'];
+               } else {
+                       $size_data['crop'] = (bool) get_option( "{$size_name}_crop" );
+               }
+
+               $all_sizes[ $size_name ] = $size_data;
+       }
+
+       return $all_sizes;
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Retrieve an image to represent an attachment.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * A mime icon for files, thumbnail or intermediate size for images.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -826,12 +895,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! $image ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $src = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $icon && $src = wp_mime_type_icon( $attachment_id ) ) {
-                       /** This filter is documented in wp-includes/post.php */
-                       $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $icon ) {
+                       $src = wp_mime_type_icon( $attachment_id );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $src_file                = $icon_dir . '/' . wp_basename( $src );
-                       @list( $width, $height ) = getimagesize( $src_file );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( $src ) {
+                               /** This filter is documented in wp-includes/post.php */
+                               $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' );
+
+                               $src_file                = $icon_dir . '/' . wp_basename( $src );
+                               @list( $width, $height ) = getimagesize( $src_file );
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $src && $width && $height ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1014,7 +1087,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return string|bool A 'srcset' value string or false.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_get_attachment_image_srcset( $attachment_id, $size = 'medium', $image_meta = null ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! $image = wp_get_attachment_image_src( $attachment_id, $size ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $image = wp_get_attachment_image_src( $attachment_id, $size );
+
+       if ( ! $image ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1146,7 +1221,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // If the file name is part of the `src`, we've confirmed a match.
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! $src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $src_matched = $is_src = true;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $src_matched = true;
+                       $is_src      = true;
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Filter out images that are from previous edits.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1232,7 +1308,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return string|bool A valid source size value for use in a 'sizes' attribute or false.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_get_attachment_image_sizes( $attachment_id, $size = 'medium', $image_meta = null ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! $image = wp_get_attachment_image_src( $attachment_id, $size ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $image = wp_get_attachment_image_src( $attachment_id, $size );
+
+       if ( ! $image ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1318,19 +1396,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $content;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $selected_images = $attachment_ids = array();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $selected_images = array();
+       $attachment_ids  = array();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( $matches[0] as $image ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( false === strpos( $image, ' srcset=' ) && preg_match( '/wp-image-([0-9]+)/i', $image, $class_id ) &&
-                       ( $attachment_id = absint( $class_id[1] ) ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( false === strpos( $image, ' srcset=' ) && preg_match( '/wp-image-([0-9]+)/i', $image, $class_id ) ) {
+                       $attachment_id = absint( $class_id[1] );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        /*
-                        * If exactly the same image tag is used more than once, overwrite it.
-                        * All identical tags will be replaced later with 'str_replace()'.
-                        */
-                       $selected_images[ $image ] = $attachment_id;
-                       // Overwrite the ID when the same image is included more than once.
-                       $attachment_ids[ $attachment_id ] = true;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( $attachment_id ) {
+                               /*
+                                * If exactly the same image tag is used more than once, overwrite it.
+                                * All identical tags will be replaced later with 'str_replace()'.
+                                */
+                               $selected_images[ $image ] = $attachment_id;
+                               // Overwrite the ID when the same image is included more than once.
+                               $attachment_ids[ $attachment_id ] = true;
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1539,7 +1620,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param string $content The image element, possibly wrapped in a hyperlink.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $output = apply_filters( 'img_caption_shortcode', '', $attr, $content );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $output != '' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       if ( ! empty( $output ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $output;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1557,11 +1639,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $atts['width'] = (int) $atts['width'];
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( $atts['width'] < 1 || empty( $atts['caption'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return $content;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $id = $caption_id = $describedby = '';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $id          = '';
+       $caption_id  = '';
+       $describedby = '';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( $atts['id'] ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $atts['id'] = sanitize_html_class( $atts['id'] );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1603,6 +1688,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $caption_width = apply_filters( 'img_caption_shortcode_width', $width, $atts, $content );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $style = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( $caption_width ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $style = 'style="width: ' . (int) $caption_width . 'px" ';
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1705,7 +1791,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $instance Unique numeric ID of this gallery shortcode instance.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $output = apply_filters( 'post_gallery', '', $attr, $instance );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $output != '' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       if ( ! empty( $output ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $output;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1850,9 +1937,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $output = apply_filters( 'gallery_style', $gallery_style . $gallery_div );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $i = 0;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         foreach ( $attachments as $id => $attachment ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $attr = ( trim( $attachment->post_excerpt ) ) ? array( 'aria-describedby' => "$selector-$id" ) : '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! empty( $atts['link'] ) && 'file' === $atts['link'] ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $image_output = wp_get_attachment_link( $id, $atts['size'], false, false, false, $attr );
</span><span class="cx" style="display: block; padding: 0 10px">                } elseif ( ! empty( $atts['link'] ) && 'none' === $atts['link'] ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1860,17 +1949,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        $image_output = wp_get_attachment_link( $id, $atts['size'], true, false, false, $attr );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $image_meta = wp_get_attachment_metadata( $id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $orientation = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( isset( $image_meta['height'], $image_meta['width'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $orientation = ( $image_meta['height'] > $image_meta['width'] ) ? 'portrait' : 'landscape';
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $output .= "<{$itemtag} class='gallery-item'>";
</span><span class="cx" style="display: block; padding: 0 10px">                $output .= "
</span><span class="cx" style="display: block; padding: 0 10px">                        <{$icontag} class='gallery-icon {$orientation}'>
</span><span class="cx" style="display: block; padding: 0 10px">                                $image_output
</span><span class="cx" style="display: block; padding: 0 10px">                        </{$icontag}>";
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( $captiontag && trim( $attachment->post_excerpt ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $output .= "
</span><span class="cx" style="display: block; padding: 0 10px">                                <{$captiontag} class='wp-caption-text gallery-caption' id='$selector-$id'>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1877,8 +1970,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                " . wptexturize( $attachment->post_excerpt ) . "
</span><span class="cx" style="display: block; padding: 0 10px">                                </{$captiontag}>";
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $output .= "</{$itemtag}>";
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ! $html5 && $columns > 0 && ++$i % $columns == 0 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               if ( ! $html5 && $columns > 0 && ++$i % $columns === 0 ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $output .= '<br style="clear: both" />';
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2025,7 +2120,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $instance Unique numeric ID of this playlist shortcode instance.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $output = apply_filters( 'post_playlist', '', $attr, $instance );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $output != '' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       if ( ! empty( $output ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $output;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2335,6 +2431,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $instance Unique numeric ID of this audio shortcode instance.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $override = apply_filters( 'wp_audio_shortcode_override', '', $attr, $content, $instance );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( '' !== $override ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return $override;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2359,9 +2456,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $primary = false;
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! empty( $atts['src'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $type = wp_check_filetype( $atts['src'], wp_get_mime_types() );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ! in_array( strtolower( $type['ext'] ), $default_types ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               if ( ! in_array( strtolower( $type['ext'] ), $default_types, true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         return sprintf( '<a class="wp-embedded-audio" href="%s">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $primary = true;
</span><span class="cx" style="display: block; padding: 0 10px">                array_unshift( $default_types, 'src' );
</span><span class="cx" style="display: block; padding: 0 10px">        } else {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2368,6 +2467,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $default_types as $ext ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( ! empty( $atts[ $ext ] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                                 if ( strtolower( $type['ext'] ) === $ext ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        $primary = true;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2377,6 +2477,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! $primary ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $audios = get_attached_media( 'audio', $post_id );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( empty( $audios ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2383,6 +2484,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $audio       = reset( $audios );
</span><span class="cx" style="display: block; padding: 0 10px">                $atts['src'] = wp_get_attachment_url( $audio->ID );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( empty( $atts['src'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2398,6 +2500,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param string $library Media library used for the audio shortcode.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( 'mediaelement' === $library && did_action( 'init' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                wp_enqueue_style( 'wp-mediaelement' );
</span><span class="cx" style="display: block; padding: 0 10px">                wp_enqueue_script( 'wp-mediaelement' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2431,23 +2534,28 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $attr_strings = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         foreach ( $html_atts as $k => $v ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $attr_strings[] = $k . '="' . esc_attr( $v ) . '"';
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $html = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( 'mediaelement' === $library && 1 === $instance ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $html .= "<!--[if lt IE 9]><script>document.createElement('audio');</script><![endif]-->\n";
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         $html .= sprintf( '<audio %s controls="controls">', join( ' ', $attr_strings ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $fileurl = '';
</span><span class="cx" style="display: block; padding: 0 10px">        $source  = '<source type="%s" src="%s" />';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         foreach ( $default_types as $fallback ) {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! empty( $atts[ $fallback ] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( empty( $fileurl ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $fileurl = $atts[ $fallback ];
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                         $type  = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );
</span><span class="cx" style="display: block; padding: 0 10px">                        $url   = add_query_arg( '_', $instance, $atts[ $fallback ] );
</span><span class="cx" style="display: block; padding: 0 10px">                        $html .= sprintf( $source, $type['type'], esc_url( $url ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2457,6 +2565,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        if ( 'mediaelement' === $library ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $html .= wp_mediaelement_fallback( $fileurl );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         $html .= '</audio>';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2544,6 +2653,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int    $instance Unique numeric ID of this video shortcode instance.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        $override = apply_filters( 'wp_video_shortcode_override', '', $attr, $content, $instance );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( '' !== $override ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return $override;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2582,7 +2692,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $is_vimeo      = $is_youtube = false;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $is_vimeo      = false;
+       $is_youtube    = false;
</ins><span class="cx" style="display: block; padding: 0 10px">         $yt_pattern    = '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#';
</span><span class="cx" style="display: block; padding: 0 10px">        $vimeo_pattern = '#^https?://(.+\.)?vimeo\.com/.*#';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2590,9 +2701,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! empty( $atts['src'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $is_vimeo   = ( preg_match( $vimeo_pattern, $atts['src'] ) );
</span><span class="cx" style="display: block; padding: 0 10px">                $is_youtube = ( preg_match( $yt_pattern, $atts['src'] ) );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! $is_youtube && ! $is_vimeo ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $type = wp_check_filetype( $atts['src'], wp_get_mime_types() );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! in_array( strtolower( $type['ext'] ), $default_types ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                       if ( ! in_array( strtolower( $type['ext'] ), $default_types, true ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 return sprintf( '<a class="wp-embedded-video" href="%s">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2813,7 +2926,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( $attachments as $k => $attachment ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $attachment->ID == $post->ID ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( intval( $attachment->ID ) === intval( $post->ID ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         break;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2866,6 +2979,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        } elseif ( is_array( $attachment ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $attachment = (object) $attachment;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! is_object( $attachment ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return array();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2878,8 +2992,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">        if ( false !== strpos( $filename, '.' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $objects[] = 'attachment:' . substr( $filename, strrpos( $filename, '.' ) + 1 );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! empty( $attachment->post_mime_type ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $objects[] = 'attachment:' . $attachment->post_mime_type;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( false !== strpos( $attachment->post_mime_type, '/' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( explode( '/', $attachment->post_mime_type ) as $token ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( ! empty( $token ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2890,8 +3006,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $taxonomies = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         foreach ( $objects as $object ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $taxes = get_object_taxonomies( $object, $output ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $taxes = get_object_taxonomies( $object, $output );
+
+               if ( $taxes ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $taxonomies = array_merge( $taxonomies, $taxes );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2917,10 +3036,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_taxonomies_for_attachments( $output = 'names' ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $taxonomies = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy ) {
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $taxonomy->object_type as $object_type ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 'attachment' == $object_type || 0 === strpos( $object_type, 'attachment:' ) ) {
-                               if ( 'names' == $output ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( 'attachment' === $object_type || 0 === strpos( $object_type, 'attachment:' ) ) {
+                               if ( 'names' === $output ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $taxonomies[] = $taxonomy->name;
</span><span class="cx" style="display: block; padding: 0 10px">                                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                                        $taxonomies[ $taxonomy->name ] = $taxonomy;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3193,11 +3313,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return array|void Array of attachment details.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_prepare_attachment_for_js( $attachment ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! $attachment = get_post( $attachment ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $attachment = get_post( $attachment );
+
+       if ( ! $attachment ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( 'attachment' != $attachment->post_type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( 'attachment' !== $attachment->post_type ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3316,7 +3438,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $possible_sizes as $size => $label ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        /** This filter is documented in wp-includes/media.php */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( $downsize = apply_filters( 'image_downsize', false, $attachment->ID, $size ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $downsize = apply_filters( 'image_downsize', false, $attachment->ID, $size );
+
+                       if ( $downsize ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 if ( empty( $downsize[3] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        continue;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3816,7 +3940,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return array Found attachments.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_attached_media( $type, $post = 0 ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! $post = get_post( $post ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $post = get_post( $post );
+
+       if ( ! $post ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return array();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3906,7 +4032,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *               from the expanded shortcode.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_post_galleries( $post, $html = true ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! $post = get_post( $post ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $post = get_post( $post );
+
+       if ( ! $post ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return array();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4027,19 +4155,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @param WP_Post $attachment Attachment object.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_maybe_generate_attachment_metadata( $attachment ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( empty( $attachment ) || ( empty( $attachment->ID ) || ! $attachment_id = (int) $attachment->ID ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( empty( $attachment ) || empty( $attachment->ID ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $file = get_attached_file( $attachment_id );
-       $meta = wp_get_attachment_metadata( $attachment_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $attachment_id = (int) $attachment->ID;
+       $file          = get_attached_file( $attachment_id );
+       $meta          = wp_get_attachment_metadata( $attachment_id );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( empty( $meta ) && file_exists( $file ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $_meta             = get_post_meta( $attachment_id );
-               $regeneration_lock = 'wp_generating_att_' . $attachment_id;
-               if ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $regeneration_lock ) ) {
-                       set_transient( $regeneration_lock, $file );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $_meta = get_post_meta( $attachment_id );
+               $_lock = 'wp_generating_att_' . $attachment_id;
+
+               if ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $_lock ) ) {
+                       set_transient( $_lock, $file );
</ins><span class="cx" style="display: block; padding: 0 10px">                         wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        delete_transient( $regeneration_lock );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 delete_transient( $_lock );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4072,10 +4203,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $path = substr( $path, strlen( $dir['baseurl'] . '/' ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $sql     = $wpdb->prepare(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $sql = $wpdb->prepare(
</ins><span class="cx" style="display: block; padding: 0 10px">                 "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file' AND meta_value = %s",
</span><span class="cx" style="display: block; padding: 0 10px">                $path
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">         $post_id = $wpdb->get_var( $sql );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre>
</div>
</div>

</body>
</html>