diff --git a/src/wp-includes/class-wp-image-editor.php b/src/wp-includes/class-wp-image-editor.php index 7dcdc91d5a..d322d6a7cb 100644 --- a/src/wp-includes/class-wp-image-editor.php +++ b/src/wp-includes/class-wp-image-editor.php @@ -316,6 +316,37 @@ abstract class WP_Image_Editor { $new_ext = $file_ext; } + /** + * Filters the image editor output format mapping. + * + * Enables filtering the mime type used to save images. By default, + * the mapping array is empty, so the mime type matches the source image. + * + * @see src/wp-includes/class-wp-image-editor.php -> get_output_format() + * + * @since 5.8.0 + * + * @param array $wp_image_editor_output_format { + * An array of mime type mappings. Maps a source mime type to a new + * destination mime type. Empty by default. + * + * @type array $mime_type The source mime type { + * @type string $mime_type The new mime type. + * } + * @param string $filename Path to the image. + * @param string $mime_type The source image mime type. + * } + */ + $wp_image_editor_output_format = apply_filters( 'image_editor_output_format', array(), $filename, $mime_type ); + + if ( + isset( $wp_image_editor_output_format[ $mime_type ] ) && + $this->supports_mime_type( $wp_image_editor_output_format[ $mime_type ] ) + ) { + $mime_type = $wp_image_editor_output_format[ $mime_type ]; + $new_ext = $this->get_extension( $mime_type ); + } + // Double-check that the mime-type selected is supported by the editor. // If not, choose a default instead. if ( ! $this->supports_mime_type( $mime_type ) ) { diff --git a/tests/phpunit/tests/image/intermediateSize.php b/tests/phpunit/tests/image/intermediateSize.php index b92c833a9d..28ccb220a6 100644 --- a/tests/phpunit/tests/image/intermediateSize.php +++ b/tests/phpunit/tests/image/intermediateSize.php @@ -62,6 +62,29 @@ class Tests_Image_Intermediate_Size extends WP_UnitTestCase { unlink( DIR_TESTDATA . '/images/a2-small-100x75.jpg' ); } + /** + * @requires function imagejpeg + * @ticket 52867 + */ + function test_image_editor_output_format_filter() { + add_filter( + 'image_editor_output_format', + function() { + return array( 'image/jpeg' => 'image/webp' ); + } + ); + $file = DIR_TESTDATA . '/images/waffles.jpg'; + $image = image_make_intermediate_size( $file, 100, 75, true ); + $editor = wp_get_image_editor( $file ); + if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/webp' ) ) { + $this->assertSame( 'image/jpeg', $image['mime-type'] ); + } else { + $this->assertSame( 'image/webp', $image['mime-type'] ); + } + unlink( DIR_TESTDATA . '/images/' . $image['file'] ); + remove_all_filters( 'image_editor_output_format' ); + } + /** * @ticket 17626 * @requires function imagejpeg