WordPress.org

Make WordPress Core

Ticket #40439: 40439.3.diff

File 40439.3.diff, 19.7 KB (added by mikeschroder, 8 weeks ago)

In progress patch. Replaces multi_resize for images in wp_generate_attachment_metadata with _wp_create_image_subsizes so that metadata gets updated as sizes are created.

  • src/js/_enqueues/admin/media.js

    diff --git src/js/_enqueues/admin/media.js src/js/_enqueues/admin/media.js
    index 4d9a5ec46b..80a420d077 100644
     
    204204                        $( this ).find( '.found-radio input' ).prop( 'checked', true );
    205205                });
    206206        });
     207
     208        /**
     209         * Handle request to create missing image sizes.
     210         */
     211        $( document ).ready( function() {
     212                $( document ).on( 'click.wp-update-image-sizes', function( event ) {
     213                        var $target = $( event.target );
     214
     215                        if ( $target.is( 'button.wp-update-image-sizes' ) ) {
     216                                var $parent = $target.parent();
     217                                var $message = $parent.find( 'span.message' );
     218                                var $spinner = $parent.find( 'span.spinner' );
     219
     220                                $spinner.addClass( 'is-active' );
     221
     222                                $.ajax({
     223                                        type: 'post',
     224                                        url: window.ajaxurl,
     225                                        dataType: 'json',
     226                                        data: {
     227                                                action: 'wp-update-image-sizes',
     228                                                update_sizes_nonce: $target.attr( 'data-wp-nonce' ),
     229                                                attachment_id: $target.attr( 'data-wp-attachment-id' )
     230                                        }
     231                                }).always( function() {
     232                                        $spinner.removeClass( 'is-active' );
     233                                }).done( function( response ) {
     234                                        if ( response.data && response.data.message ) {
     235                                                $message.text( response.data.message );
     236                                        }
     237                                }).fail( function() {
     238                                        $message.text( attachMediaBoxL10n.error );
     239                                });
     240                        }
     241                } );
     242        } );
    207243})( jQuery );
  • src/wp-admin/admin-ajax.php

    diff --git src/wp-admin/admin-ajax.php src/wp-admin/admin-ajax.php
    index 8d412dd9b8..59846557e2 100644
    $core_actions_post = array( 
    131131        'edit-theme-plugin-file',
    132132        'wp-privacy-export-personal-data',
    133133        'wp-privacy-erase-personal-data',
     134        'wp-update-image-sizes',
    134135        'health-check-site-status-result',
    135136        'health-check-dotorg-communication',
    136137        'health-check-is-in-debug-mode',
  • src/wp-admin/css/list-tables.css

    diff --git src/wp-admin/css/list-tables.css src/wp-admin/css/list-tables.css
    index 91b1a2c9ce..598f2fbc6f 100644
    table.media .column-title .media-icon img { 
    369369        vertical-align: top; /* Remove descender white-space. */
    370370}
    371371
    372 table.media .column-title .has-media-icon ~ .row-actions {
     372table.media .column-title .has-media-icon ~ .row-actions,
     373table.media .column-title .has-media-icon ~ .update-image-sizes {
    373374        margin-left: 70px; /* 60px image + margin */
    374375}
    375376
    table.media .column-title .filename { 
    377378        margin-bottom: 0.2em;
    378379}
    379380
     381table.media .update-image-sizes .spinner {
     382        float: none;
     383        margin: 2px 10px;
     384}
     385
    380386/* @todo: pick a consistent list table selector */
    381387.wp-list-table a {
    382388        transition: none;
  • src/wp-admin/includes/ajax-actions.php

    diff --git src/wp-admin/includes/ajax-actions.php src/wp-admin/includes/ajax-actions.php
    index 0f1f0f4e04..18d7215e0e 100644
    function wp_ajax_health_check_get_sizes() { 
    50115011
    50125012        wp_send_json_success( $all_sizes );
    50135013}
     5014
     5015/**
     5016 * Ajax handler for updating image sizes.
     5017 *
     5018 * @since 5.0.0
     5019 */
     5020function wp_ajax_wp_update_image_sizes() {
     5021        if ( empty( $_POST['attachment_id'] ) ) {
     5022                wp_send_json_error( __( 'Missing attachment ID.' ) );
     5023        }
     5024
     5025        $attachment_id = (int) $_POST['attachment_id'];
     5026
     5027        if ( ! current_user_can( 'edit_post', $attachment_id ) || ! wp_verify_nonce( $_POST['update_sizes_nonce'], 'update_image_sizes' . $attachment_id ) ) {
     5028                wp_send_json_error( __( 'Invalid request.' ) );
     5029        }
     5030
     5031        $result = wp_update_image_attachment_sizes( $attachment_id );
     5032
     5033        if ( false === $result ) {
     5034                $response = array( 'message' => __( 'New image sub-sizes were not created. All sub-sizes already exist.' ) );
     5035        } else {
     5036                $count = count( $result );
     5037                $response = array( 'message' => sprintf( _n( 'Created %d image sub-size.', 'Created %d image sub-sizes.', $count ), $count ) );
     5038        }
     5039
     5040        wp_send_json_success( $response );
     5041}
  • src/wp-admin/includes/class-wp-media-list-table.php

    diff --git src/wp-admin/includes/class-wp-media-list-table.php src/wp-admin/includes/class-wp-media-list-table.php
    index 1a9970d9f4..ef9c28f261 100644
    class WP_Media_List_Table extends WP_List_Table { 
    411411                        ?>
    412412                </p>
    413413                <?php
     414                $missing_sizes = wp_check_image_attachment_sizes( $post->ID );
     415
     416                if ( ! empty( $missing_sizes ) ) {
     417                        $nonce = wp_create_nonce( 'update_image_sizes' . $post->ID );
     418                        $count = count( $missing_sizes );
     419
     420                        ?>
     421                        <p class="update-image-sizes">
     422                                <span class="message">
     423                                        <?php printf( _n( '%s image sub-size file is missing.', '%s image sub-size files are missing.', $count ), $count ); ?>
     424                                </span>
     425                                <button type="button" class="button button-small wp-update-image-sizes" data-wp-nonce="<?php echo $nonce; ?>" data-wp-attachment-id="<?php echo $post->ID; ?>">
     426                                <?php _e( 'Refresh image sizes' ); ?>
     427                                </button>
     428                                <span class="spinner"></span>
     429                        </p>
     430                        <?php
     431                }
    414432        }
    415433
    416434        /**
  • src/wp-admin/includes/image.php

    diff --git src/wp-admin/includes/image.php src/wp-admin/includes/image.php
    index d0a2954e5f..5ef5fade1c 100644
    function wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $s 
    6666        return $dst_file;
    6767}
    6868
     69function wp_check_image_attachment_sizes( $attachment_id ) {
     70        if ( ! wp_attachment_is_image( $attachment_id ) ) {
     71                return false;
     72        }
     73
     74        $image_meta = wp_get_attachment_metadata( $attachment_id );
     75        $defined_sizes = _wp_get_intermediate_image_sizes_with_data();
     76
     77        // Skip sizes that are too large.
     78        foreach ( $defined_sizes as $size_name => $size_data ) {
     79                $width = ! empty( $size_data['width'] ) ? (int) $size_data['width'] : 0;
     80                $height = ! empty( $size_data['height'] ) ? (int) $size_data['height'] : 0;
     81
     82                if ( $width && $height ) {
     83                        if ( $width > $image_meta['width'] && $height > $image_meta['height'] ) {
     84                                unset( $defined_sizes[ $size_name ] );
     85                        }
     86                } elseif ( ! $width ) {
     87                        if ( $height > $image_meta['height'] ) {
     88                                unset( $defined_sizes[ $size_name ] );
     89                        }
     90                } elseif ( ! $height ) {
     91                        if ( $width > $image_meta['width'] ) {
     92                                unset( $defined_sizes[ $size_name ] );
     93                        }
     94                }
     95        }
     96
     97        if ( empty( $image_meta['sizes'] ) ) {
     98                $image_meta['sizes'] = array();
     99        }
     100
     101        $missing_sizes = array_diff( array_keys( $defined_sizes ), array_keys( $image_meta['sizes'] ) );
     102
     103        /**
     104         * Filters the missing image size files per attachment.
     105         *
     106         * @since 5.0.0
     107         *
     108         * @param array $missing_sizes Array with the missing image sizes.
     109         * @param array $image_meta The image attachment meta data.
     110         * @param string $attachment_id The attachment post ID.
     111         */
     112        return apply_filters( 'wp_check_image_attachment_sizes', $missing_sizes, $image_meta, $attachment_id );
     113}
     114
     115/**
     116 * For an image attachment, if any of the currently defined image sub-sizes are missing,
     117 * creates them and updates the image meta data.
     118 *
     119 * @since 5.0
     120 *
     121 * @param int $attachment_id The image attachment post ID.
     122 * @return bool Whether any sizes were added.
     123 */
     124function wp_update_image_attachment_sizes( $attachment_id ) {
     125        $missing_sizes = wp_check_image_attachment_sizes( $attachment_id );
     126
     127        if ( ! empty( $missing_sizes ) ) {
     128                $file = get_attached_file( $attachment_id );
     129                $image_meta = wp_get_attachment_metadata( $attachment_id );
     130                $new_meta = _wp_create_image_subsizes( $file, $image_meta, $attachment_id );
     131
     132                $updated_sizes = array_diff_assoc( $new_meta['sizes'], $image_meta['sizes'] );
     133
     134                if ( ! empty( $updated_sizes ) ) {
     135                        return $updated_sizes;
     136                }
     137        }
     138
     139        return false;
     140}
     141
     142function _wp_get_intermediate_image_sizes_with_data() {
     143        $_wp_additional_image_sizes = wp_get_additional_image_sizes();
     144        $sizes = array();
     145
     146        foreach ( get_intermediate_image_sizes() as $size ) {
     147                $size_data = array(
     148                        'width'  => '',
     149                        'height' => '',
     150                        'crop'   => false,
     151                );
     152
     153                if ( isset( $_wp_additional_image_sizes[ $size ]['width'] ) ) {
     154                        // For theme-added sizes
     155                        $size_data['width'] = intval( $_wp_additional_image_sizes[ $size ]['width'] );
     156                } else {
     157                        // For default sizes set in options
     158                        $size_data['width'] = get_option( "{$size}_size_w" );
     159                }
     160
     161                if ( isset( $_wp_additional_image_sizes[ $size ]['height'] ) ) {
     162                        // For theme-added sizes
     163                        $size_data['height'] = intval( $_wp_additional_image_sizes[ $size ]['height'] );
     164                } else {
     165                        // For default sizes set in options
     166                        $size_data['height'] = get_option( "{$size}_size_h" );
     167                }
     168
     169                if ( isset( $_wp_additional_image_sizes[ $size ]['crop'] ) ) {
     170                        // For theme-added sizes
     171                        $size_data['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
     172                } else {
     173                        // For default sizes set in options
     174                        $size_data['crop'] = get_option( "{$size}_crop" );
     175                }
     176
     177                if ( empty( $size_data['width'] ) && empty( $size_data['height'] ) ) {
     178                        continue;
     179                }
     180
     181                $sizes[ $size ] = $size_data;
     182        }
     183
     184        return $sizes;
     185}
     186
    69187/**
    70  * Generate post thumbnail attachment meta data.
     188 * Create image sub-sizes and add the related data to the image meta `sizes` array.
     189 *
     190 * Saves/updates the image meta after each sub-size is created.
     191 *
     192 * @since 5.0
     193 *
     194 * @param string $file Full filepath of the attached image.
     195 * @param array $image_meta The attachment meta data.
     196 * @param int $attachment_id Attachment Id to process.
     197 * @return array The attachment meta data with updated `sizes` array.
     198 */
     199function _wp_create_image_subsizes( $file, $image_meta, $attachment_id ) {
     200        $new_sizes = _wp_get_intermediate_image_sizes_with_data();
     201        /**
     202         * Filters the image sizes automatically generated when uploading an image.
     203         *
     204         * @since 2.9.0
     205         * @since 4.4.0 Added the `$metadata` argument.
     206         * @since 5.0.0 Added the `$attachment_id` argument.
     207         *
     208         * @param array $sizes         An associative array of image sizes.
     209         * @param array $metadata      An associative array of image metadata: width, height, file.
     210         * @param int   $attachment_id Current attachment ID.
     211         */
     212        $new_sizes = apply_filters( 'intermediate_image_sizes_advanced', $new_sizes, $image_meta, $attachment_id );
     213
     214        // Check if any of the sizes already exist.
     215        if ( ! empty( $image_meta['sizes'] ) && is_array( $image_meta['sizes'] ) ) {
     216                foreach ( $image_meta['sizes'] as $size_name => $size_data ) {
     217                        if ( array_key_exists( $size_name, $new_sizes ) ) {
     218                                // Can check here if file exists..?
     219                                unset( $new_sizes[ $size_name ] );
     220                        } else {
     221                                // Make sure we are not adding the exact same file under different "size name".
     222                                foreach ( $new_sizes as $new_size_name => $new_size_data ) {
     223                                        if ( $size_data['width'] === $new_size_data['width'] || $size_data['height'] === $new_size_data['height'] ) {
     224                                                // $new_size_data['width'] or $new_size_data['height'] may be empty (meaning the new image size has either max-width or max-height),
     225                                                // or they may be set to max-width and max-height like the default "large" size (1024px width and 1024px height).
     226                                                $check = wp_constrain_dimensions( $size_data['width'], $size_data['height'], $new_size_data['width'], $new_size_data['height'] );
     227
     228                                                if ( $check[0] === $size_data['width'] && $check[1] === $size_data['height'] ) {
     229                                                        unset( $new_sizes[ $new_size_name ] );
     230                                                }
     231                                        }
     232                                }
     233                        }
     234                }
     235        }
     236
     237        if ( ! empty( $new_sizes ) ) {
     238                $editor = wp_get_image_editor( $file );
     239
     240                if ( ! is_wp_error( $editor ) ) {
     241                        if ( empty( $image_meta['sizes'] ) ) {
     242                                $image_meta['sizes'] = array();
     243                        }
     244
     245                        foreach ( $new_sizes as $new_size_name => $new_size_data ) {
     246                                $size_meta = $editor->make_subsize( $new_size_data );
     247
     248                                if ( ! is_wp_error( $size_meta ) ) {
     249                                        // The sub-size was created successfully. Save the size meta value.
     250                                        $image_meta['sizes'][ $new_size_name ] = $size_meta;
     251                                        wp_update_attachment_metadata( $attachment_id, $image_meta );
     252                                }
     253                        }
     254                }
     255        }
     256
     257        return $image_meta;
     258}
     259
     260/**
     261 * Generate attachment meta data and create image sub-sizes for images.
    71262 *
    72263 * @since 2.1.0
    73264 *
    function wp_generate_attachment_metadata( $attachment_id, $file ) { 
    138329                 */
    139330                $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes, $metadata, $attachment_id );
    140331
    141                 if ( $sizes ) {
    142                         $editor = wp_get_image_editor( $file );
    143 
    144                         if ( ! is_wp_error( $editor ) ) {
    145                                 $metadata['sizes'] = $editor->multi_resize( $sizes );
    146                         }
    147                 } else {
    148                         $metadata['sizes'] = array();
    149                 }
    150 
    151332                // Fetch additional metadata from EXIF/IPTC.
    152333                $image_meta = wp_read_image_metadata( $file );
    153334                if ( $image_meta ) {
    154335                        $metadata['image_meta'] = $image_meta;
    155336                }
     337
     338                if ( $sizes ) {
     339                        $metadata = _wp_create_image_subsizes( $file, $metadata, $attachment_id );
     340                } else {
     341                        $metadata['sizes'] = array();
     342                }
     343
    156344        } elseif ( wp_attachment_is( 'video', $attachment ) ) {
    157345                $metadata = wp_read_video_metadata( $file );
    158346                $support  = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' );
  • src/wp-includes/class-wp-image-editor-gd.php

    diff --git src/wp-includes/class-wp-image-editor-gd.php src/wp-includes/class-wp-image-editor-gd.php
    index 72fb04ee72..dfaaba97c4 100644
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    217217         * @return array An array of resized images' metadata by size.
    218218         */
    219219        public function multi_resize( $sizes ) {
    220                 $metadata  = array();
    221                 $orig_size = $this->size;
     220                $metadata = array();
    222221
    223222                foreach ( $sizes as $size => $size_data ) {
    224                         if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
    225                                 continue;
    226                         }
     223                        $meta = $this->make_subsize( $size_data );
    227224
    228                         if ( ! isset( $size_data['width'] ) ) {
    229                                 $size_data['width'] = null;
    230                         }
    231                         if ( ! isset( $size_data['height'] ) ) {
    232                                 $size_data['height'] = null;
     225                        if ( ! is_wp_error( $meta ) ) {
     226                                $metadata[ $size ] = $meta;
    233227                        }
     228                }
    234229
    235                         if ( ! isset( $size_data['crop'] ) ) {
    236                                 $size_data['crop'] = false;
    237                         }
     230                return $metadata;
     231        }
     232
     233        /**
     234         * Create an image sub-size and return the image meta data value for it.
     235         *
     236         * @since 5.0
     237         *
     238         * @param array $size_data Array of height, width and whether to crop.
     239         * @return WP_Error|array WP_Error on error, or the image data array for inclusion in the `sizes` array in the image meta.
     240         */
     241        public function make_subsize( $size_data ) {
     242                if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
     243                        return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) );
     244                }
     245
     246                $orig_size  = $this->size;
     247                $resized    = false;
    238248
    239                         $image     = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
    240                         $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
     249                if ( ! isset( $size_data['width'] ) ) {
     250                        $size_data['width'] = null;
     251                }
     252
     253                if ( ! isset( $size_data['height'] ) ) {
     254                        $size_data['height'] = null;
     255                }
    241256
    242                         if ( ! is_wp_error( $image ) && ! $duplicate ) {
    243                                 $resized = $this->_save( $image );
     257                if ( ! isset( $size_data['crop'] ) ) {
     258                        $size_data['crop'] = false;
     259                }
     260
     261                $image     = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
     262                $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
     263
     264                if ( is_wp_error( $image ) ) {
     265                        return $image;
     266                }
    244267
    245                                 imagedestroy( $image );
     268                if ( ! $duplicate ) {
     269                        $resized = $this->_save( $image );
    246270
    247                                 if ( ! is_wp_error( $resized ) && $resized ) {
    248                                         unset( $resized['path'] );
    249                                         $metadata[ $size ] = $resized;
    250                                 }
     271                        imagedestroy( $image );
     272
     273                        if ( is_wp_error( $resized ) ) {
     274                                return $resized;
    251275                        }
    252276
    253                         $this->size = $orig_size;
     277                        if ( $resized ) {
     278                                unset( $resized['path'] );
     279                        }
    254280                }
    255281
    256                 return $metadata;
     282                $this->size = $orig_size;
     283
     284                if ( ! $resized ) {
     285                        return new WP_Error( 'image_subsize_create_error', __( 'Failed to create image sub-size.' ) );
     286                }
     287
     288                return $resized;
    257289        }
    258290
    259291        /**
  • src/wp-includes/class-wp-image-editor-imagick.php

    diff --git src/wp-includes/class-wp-image-editor-imagick.php src/wp-includes/class-wp-image-editor-imagick.php
    index abb215038b..608d5f37d6 100644
    class WP_Image_Editor_Imagick extends WP_Image_Editor { 
    413413         * @since 3.5.0
    414414         *
    415415         * @param array $sizes {
    416          *     An array of image size arrays. Default sizes are 'small', 'medium', 'medium_large', 'large'.
     416         *     An array of image size arrays. Default sizes are 'thumbnail', 'medium', 'medium_large', 'large'.
    417417         *
    418418         *     Either a height or width must be provided.
    419419         *     If one of the two is set to null, the resize will
    class WP_Image_Editor_Imagick extends WP_Image_Editor { 
    430430         * @return array An array of resized images' metadata by size.
    431431         */
    432432        public function multi_resize( $sizes ) {
    433                 $metadata   = array();
    434                 $orig_size  = $this->size;
    435                 $orig_image = $this->image->getImage();
     433                $metadata = array();
    436434
    437435                foreach ( $sizes as $size => $size_data ) {
    438                         if ( ! $this->image ) {
    439                                 $this->image = $orig_image->getImage();
    440                         }
     436                        $meta = $this->make_subsize( $size_data );
    441437
    442                         if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
    443                                 continue;
     438                        if ( ! is_wp_error( $meta ) ) {
     439                                $metadata[ $size ] = $meta;
    444440                        }
     441                }
    445442
    446                         if ( ! isset( $size_data['width'] ) ) {
    447                                 $size_data['width'] = null;
    448                         }
    449                         if ( ! isset( $size_data['height'] ) ) {
    450                                 $size_data['height'] = null;
    451                         }
     443                return $metadata;
     444        }
    452445
    453                         if ( ! isset( $size_data['crop'] ) ) {
    454                                 $size_data['crop'] = false;
    455                         }
     446        /**
     447         * Create an image sub-size and return the image meta data value for it.
     448         *
     449         * @since 5.0.0
     450         *
     451         * @param array $size_data Array of height, width and whether to crop.
     452         * @return WP_Error|array WP_Error on error, or the image data array for inclusion in the `sizes` array in the image meta.
     453         */
     454        public function make_subsize( $size_data ) {
     455                if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
     456                        return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) );
     457                }
     458
     459                $orig_size  = $this->size;
     460                $orig_image = $this->image->getImage();
     461                $resized    = false;
     462
     463                if ( ! isset( $size_data['width'] ) ) {
     464                        $size_data['width'] = null;
     465                }
     466
     467                if ( ! isset( $size_data['height'] ) ) {
     468                        $size_data['height'] = null;
     469                }
    456470
    457                         $resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
    458                         $duplicate     = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
     471                if ( ! isset( $size_data['crop'] ) ) {
     472                        $size_data['crop'] = false;
     473                }
    459474
    460                         if ( ! is_wp_error( $resize_result ) && ! $duplicate ) {
    461                                 $resized = $this->_save( $this->image );
     475                $resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
     476                $duplicate     = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
    462477
    463                                 $this->image->clear();
    464                                 $this->image->destroy();
    465                                 $this->image = null;
     478                if ( is_wp_error( $resize_result ) ) {
     479                        return $resize_result;
     480                }
    466481
    467                                 if ( ! is_wp_error( $resized ) && $resized ) {
    468                                         unset( $resized['path'] );
    469                                         $metadata[ $size ] = $resized;
    470                                 }
     482                if ( ! $duplicate ) {
     483                        $resized = $this->_save( $this->image );
     484
     485                        $this->image->clear();
     486                        $this->image->destroy();
     487                        $this->image = null;
     488
     489                        if ( is_wp_error( $resized ) ) {
     490                                return $resized;
    471491                        }
    472492
    473                         $this->size = $orig_size;
     493                        if ( $resized ) {
     494                                unset( $resized['path'] );
     495                        }
    474496                }
    475497
    476                 $this->image = $orig_image;
     498                $this->size = $orig_size;
     499                $this->image = $orig_image->getImage();
    477500
    478                 return $metadata;
     501                if ( ! $resized ) {
     502                        return new WP_Error( 'image_subsize_create_error', __( 'Failed to create image sub-size.' ) );
     503                }
     504
     505                return $resized;
    479506        }
    480507
    481508        /**