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;
}