diff --git a/plugins/webp-uploads/helper.php b/plugins/webp-uploads/helper.php index 312bd45d68..95fc15e18e 100644 --- a/plugins/webp-uploads/helper.php +++ b/plugins/webp-uploads/helper.php @@ -411,6 +411,17 @@ function webp_uploads_is_fallback_enabled(): bool { return (bool) get_option( 'perflab_generate_webp_and_jpeg' ); } +/** + * Checks if the `perflab_generate_all_fallback_sizes` option is enabled. + * + * @since n.e.x.t + * + * @return bool Whether the option is enabled. Default is false. + */ +function webp_uploads_should_generate_all_fallback_sizes(): bool { + return (bool) get_option( 'perflab_generate_all_fallback_sizes', 0 ); +} + /** * Retrieves the image URL for a specified MIME type from the attachment metadata. * diff --git a/plugins/webp-uploads/hooks.php b/plugins/webp-uploads/hooks.php index ce4c38a635..0e36bbca5a 100644 --- a/plugins/webp-uploads/hooks.php +++ b/plugins/webp-uploads/hooks.php @@ -806,3 +806,24 @@ function webp_uploads_opt_in_extra_image_sizes(): void { } } add_action( 'plugins_loaded', 'webp_uploads_opt_in_extra_image_sizes' ); + +/** + * Enables additional MIME type support for all image sizes based on the generate all fallback sizes settings. + * + * @since n.e.x.t + * + * @param array $allowed_sizes A map of image size names and whether they are allowed to have additional MIME types. + * @return array Modified map of image sizes with additional MIME type support. + */ +function webp_uploads_enable_additional_mime_type_support_for_all_sizes( array $allowed_sizes ): array { + if ( ! webp_uploads_should_generate_all_fallback_sizes() ) { + return $allowed_sizes; + } + + foreach ( array_keys( $allowed_sizes ) as $size ) { + $allowed_sizes[ $size ] = true; + } + + return $allowed_sizes; +} +add_filter( 'webp_uploads_image_sizes_with_additional_mime_type_support', 'webp_uploads_enable_additional_mime_type_support_for_all_sizes' ); diff --git a/plugins/webp-uploads/settings.php b/plugins/webp-uploads/settings.php index c44d6c452a..cad0352e11 100644 --- a/plugins/webp-uploads/settings.php +++ b/plugins/webp-uploads/settings.php @@ -40,6 +40,18 @@ function webp_uploads_register_media_settings_field(): void { 'show_in_rest' => false, ) ); + + // Add a setting to generate fallback images in all sizes including custom sizes. + register_setting( + 'media', + 'perflab_generate_all_fallback_sizes', + array( + 'type' => 'boolean', + 'default' => false, + 'show_in_rest' => false, + ) + ); + // Add a setting to use the picture element. register_setting( 'media', @@ -96,6 +108,16 @@ function webp_uploads_add_media_settings_fields(): void { array( 'class' => 'perflab-generate-webp-and-jpeg' ) ); + // Add setting field for generating fallback images in all sizes including custom sizes. + add_settings_field( + 'perflab_generate_all_fallback_sizes', + __( 'Generate all fallback image sizes', 'webp-uploads' ), + 'webp_uploads_generate_all_fallback_sizes_callback', + 'media', + 'perflab_modern_image_format_settings', + array( 'class' => 'perflab-generate-fallback-all-sizes' ) + ); + // Add picture element support settings field. add_settings_field( 'webp_uploads_use_picture_element', @@ -178,6 +200,94 @@ function webp_uploads_generate_webp_jpeg_setting_callback(): void { + +
> +

+
+
+ +

+
+ + markTestSkipped( 'Mime type ' . $mime_type . ' is not supported.' ); + } + + // Register custom image sizes. + add_image_size( 'custom_size_1', 200, 200, true ); + add_image_size( 'custom_size_2', 400, 400, true ); + + // Generate image output type and fallback image. + update_option( 'perflab_generate_webp_and_jpeg', true ); + + // Generate fallback images for all sizes. + update_option( 'perflab_generate_all_fallback_sizes', true ); + + $this->set_image_output_type( $image_type ); + + $attachment_id = self::factory()->attachment->create_upload_object( TESTS_PLUGIN_DIR . '/tests/data/images/leaves.jpg' ); + + // Clean up custom sizes. + remove_image_size( 'custom_size_1' ); + remove_image_size( 'custom_size_2' ); + + // Verify that fallback images are generated for custom sizes. + foreach ( array( 'custom_size_1', 'custom_size_2' ) as $size_name ) { + $this->assertImageHasSizeSource( $attachment_id, $size_name, 'image/jpeg' ); + $this->assertImageHasSizeSource( $attachment_id, $size_name, $mime_type ); + } + + wp_delete_attachment( $attachment_id ); + } } diff --git a/plugins/webp-uploads/uninstall.php b/plugins/webp-uploads/uninstall.php index 46fba3c78d..8b3fae0aee 100644 --- a/plugins/webp-uploads/uninstall.php +++ b/plugins/webp-uploads/uninstall.php @@ -38,4 +38,5 @@ */ function webp_uploads_delete_plugin_option(): void { delete_option( 'perflab_generate_webp_and_jpeg' ); + delete_option( 'perflab_generate_all_fallback_sizes' ); }