A WordPress-centric search engine for devs and theme authors



_wp_make_subsizes ›

Since5.3.0
Deprecatedn/a
_wp_make_subsizes ( $new_sizes, $file, $image_meta, $attachment_id )
Access:
  • private
Parameters: (4)
  • (array) $new_sizes Array defining what sizes to create.
    Required: Yes
  • (string) $file Full path to the image file.
    Required: Yes
  • (array) $image_meta The attachment meta data array.
    Required: Yes
  • (int) $attachment_id Attachment Id to process.
    Required: Yes
Returns:
  • (array) The attachment meta data with updated `sizes` array. Includes an array of errors encountered while resizing.
Defined at:
Codex:

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.



Source

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 ( 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 ) ) {
				$error_code = $new_size_meta->get_error_code();

				if ( $error_code === 'error_getting_dimensions' ) {
					// Ignore errors when `image_resize_dimensions()` returns false.
					// They mean that the requested size is larger than the original image and should be skipped.
					continue;
				}

				if ( empty( $image_meta['subsize_errors'] ) ) {
					$image_meta['subsize_errors'] = array();
				}

				$error = array(
					'error_code'    => $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 );
		}
	}

	return $image_meta;
}