_wp_make_subsizes

The timeline below displays how wordpress function _wp_make_subsizes has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 5.9

/**
 * 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
 *
 * @param 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)
{
    if (empty($image_meta) || !is_array($image_meta)) {
        // Not an image attachment.
        return array();
    }
    // 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]);
            }
        }
    } else {
        $image_meta['sizes'] = array();
    }
    if (empty($new_sizes)) {
        // Nothing to do...
        return $image_meta;
    }
    /*
     * Sort the image sub-sizes in order of priority when creating them.
     * This ensures there is an appropriate sub-size the user can access immediately
     * even when there was an error and not all sub-sizes were created.
     */
    $priority = array('medium' => null, 'large' => null, 'thumbnail' => null, 'medium_large' => null);
    $new_sizes = array_filter(array_merge($priority, $new_sizes));
    $editor = wp_get_image_editor($file);
    if (is_wp_error($editor)) {
        // The image cannot be edited.
        return $image_meta;
    }
    // If stored EXIF data exists, rotate the source image before creating sub-sizes.
    if (!empty($image_meta['image_meta'])) {
        $rotated = $editor->maybe_exif_rotate();
        if (is_wp_error($rotated)) {
            // TODO: Log errors.
        }
    }
    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);
            if (is_wp_error($new_size_meta)) {
                // TODO: Log errors.
            } else {
                // 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);
            wp_update_attachment_metadata($attachment_id, $image_meta);
        }
    }
    return $image_meta;
}

WordPress Version: 5.4

/**
 * 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
 *
 * @param 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)
{
    if (empty($image_meta) || !is_array($image_meta)) {
        // Not an image attachment.
        return array();
    }
    // 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]);
            }
        }
    } else {
        $image_meta['sizes'] = array();
    }
    if (empty($new_sizes)) {
        // Nothing to do...
        return $image_meta;
    }
    /*
     * Sort the image sub-sizes in order of priority when creating them.
     * This ensures there is an appropriate sub-size the user can access immediately
     * even when there was an error and not all sub-sizes were created.
     */
    $priority = array('medium' => null, 'large' => null, 'thumbnail' => null, 'medium_large' => null);
    $new_sizes = array_filter(array_merge($priority, $new_sizes));
    $editor = wp_get_image_editor($file);
    if (is_wp_error($editor)) {
        // The image cannot be edited.
        return $image_meta;
    }
    // If stored EXIF data exists, rotate the source image before creating sub-sizes.
    if (!empty($image_meta['image_meta'])) {
        $rotated = $editor->maybe_exif_rotate();
        if (is_wp_error($rotated)) {
            // TODO: Log errors.
        }
    }
    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);
            if (is_wp_error($new_size_meta)) {
                // TODO: Log errors.
            } else {
                // 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);
            wp_update_attachment_metadata($attachment_id, $image_meta);
        }
    }
    return $image_meta;
}

WordPress Version: 5.3

/**
 * 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
 *
 * @param 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)
{
    if (empty($image_meta) || !is_array($image_meta)) {
        // Not an image attachment.
        return array();
    }
    // 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]);
            }
        }
    } else {
        $image_meta['sizes'] = array();
    }
    if (empty($new_sizes)) {
        // Nothing to do...
        return $image_meta;
    }
    // Sort the image sub-sizes in order of priority when creating them.
    // This ensures there is an appropriate sub-size the user can access immediately
    // even when there was an error and not all sub-sizes were created.
    $priority = array('medium' => null, 'large' => null, 'thumbnail' => null, 'medium_large' => null);
    $new_sizes = array_filter(array_merge($priority, $new_sizes));
    $editor = wp_get_image_editor($file);
    if (is_wp_error($editor)) {
        // The image cannot be edited.
        return $image_meta;
    }
    // If stored EXIF data exists, rotate the source image before creating sub-sizes.
    if (!empty($image_meta['image_meta'])) {
        $rotated = $editor->maybe_exif_rotate();
        if (is_wp_error($rotated)) {
            // TODO: log errors.
        }
    }
    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);
            if (is_wp_error($new_size_meta)) {
                // TODO: log errors.
            } else {
                // 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);
            wp_update_attachment_metadata($attachment_id, $image_meta);
        }
    }
    return $image_meta;
}