From 5a2c3706ee56fabea33df1579dc748ec73ae31ee Mon Sep 17 00:00:00 2001 From: Anthony Burchell Date: Thu, 20 May 2021 22:14:47 +0000 Subject: [PATCH] Media: Introduces `image_editor_output_format` filter for setting default MIME type of sub size image output. This change introduces the `image_editor_output_format` filter, which fires as sub size images are generated allowing to define a default image MIME type for those items. Props adamsilverstein, williampatton, spacedmonkey, mikeschroder, hellofromTonya, justinahinon, Boniu91, antpb, SergeyBiryukov. Fixes #52867. git-svn-id: https://develop.svn.wordpress.org/trunk@50943 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-image-editor.php | 31 +++++++++++++++++++ .../phpunit/tests/image/intermediateSize.php | 23 ++++++++++++++ 2 files changed, 54 insertions(+) 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