Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modern Image Formats: add AVIF output support #1176

Merged
merged 133 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
7113690
Add AVIF output settings, cleanup
adamsilverstein Apr 23, 2024
1929b63
Add AVIF support to output transforms
adamsilverstein Apr 23, 2024
54629fb
Cleanup
adamsilverstein Apr 23, 2024
4f4157e
Remove unused stylesheet callback entirely.
adamsilverstein Apr 23, 2024
4305645
Update plugins/webp-uploads/helper.php
adamsilverstein Apr 25, 2024
0b305e7
Update plugins/webp-uploads/helper.php
adamsilverstein Apr 25, 2024
220747c
Update plugins/webp-uploads/settings.php
adamsilverstein Apr 25, 2024
cd96a72
match tests to updated return shape
adamsilverstein Apr 25, 2024
ad00554
Merge branch 'trunk' into add/avif-support
adamsilverstein Apr 25, 2024
a3d2e53
Ensure the output type is WebP in it_should_allow_the_upload_of_a_web…
adamsilverstein Apr 25, 2024
66494e5
update option first in test
adamsilverstein Apr 25, 2024
8725032
improve test/docs
adamsilverstein Apr 25, 2024
c99b1a3
Doc block improvement
adamsilverstein Apr 30, 2024
56e304c
Ensure existing tests run against WebP output
adamsilverstein Apr 30, 2024
c9c7c7e
Use webp in tests, one more spot
adamsilverstein Apr 30, 2024
a970d6a
Merge branch 'trunk' into add/avif-support
adamsilverstein May 1, 2024
4e19ed2
Update plugins/webp-uploads/helper.php
adamsilverstein May 1, 2024
c965722
Doc block cleanup
adamsilverstein May 1, 2024
8500b1d
Rename perflab_generate_avif_and_webp => perflab_modern_image_format
adamsilverstein May 1, 2024
5737c39
Add webp_uploads_avif_supported helper function
adamsilverstein May 1, 2024
86c8fdd
it_should_prevent_to_upload_a_mime_that_is_not_supported_by_wordpress…
adamsilverstein May 1, 2024
f602b8c
WP_Image_Doesnt_Support_WebP should actually go first
adamsilverstein May 1, 2024
a799b06
docblock update
adamsilverstein May 1, 2024
8c8c5af
complete rename
adamsilverstein May 1, 2024
8782b1e
more renaming
adamsilverstein May 1, 2024
7c68482
featured image test: use data provider to test both avif and webp
adamsilverstein May 1, 2024
b7dede9
add avif to at_least_one_editor_supports test
adamsilverstein May 1, 2024
c6bb649
Specify WebP as output format in existing tests
adamsilverstein May 1, 2024
1e295e6
start updating detection / swapping so it works with AVIF
adamsilverstein May 1, 2024
aad2b64
linting
adamsilverstein May 1, 2024
0a4ea56
revert default trasnforms change; instead add avif
adamsilverstein May 2, 2024
f2df086
Use webp by default for tests
adamsilverstein May 2, 2024
6b641d2
Use data provider for webp, avif tests; cleanup
adamsilverstein May 2, 2024
ca2ad56
Add helper to set the output format for image generation
adamsilverstein May 2, 2024
f70fff0
Ensure tests pass, use webp as default in other tests
adamsilverstein May 2, 2024
65b0919
cleanup
adamsilverstein May 2, 2024
17d235f
add a group tag for image tests
adamsilverstein May 2, 2024
affe91b
vaey it_should_return_jpeg_and_webp_transforms_when_option_generate_w…
adamsilverstein May 2, 2024
769a87f
vary it_should_return_default_transforms_when_filter_returns_non_arra…
adamsilverstein May 2, 2024
67528ba
Add @group images to all image test files
adamsilverstein May 3, 2024
2c6b1fc
Default to WebP for tests
adamsilverstein May 3, 2024
347af2a
doc block cleanup
adamsilverstein May 3, 2024
a68e4ef
improve helper for avif support
adamsilverstein May 3, 2024
94fd905
complete switch to webp_uploads_mime_type_supported
adamsilverstein May 3, 2024
ca2345d
Merge branch 'trunk' into add/avif-support
adamsilverstein May 3, 2024
c3a6ff3
Update plugins/webp-uploads/helper.php
adamsilverstein May 6, 2024
664ef64
Update plugins/webp-uploads/helper.php
adamsilverstein May 6, 2024
f0bf2a7
Update plugins/webp-uploads/helper.php
adamsilverstein May 6, 2024
8cdebcb
Update plugins/webp-uploads/helper.php
adamsilverstein May 6, 2024
6bc4872
Update plugins/webp-uploads/hooks.php
adamsilverstein May 6, 2024
a338898
Update plugins/webp-uploads/hooks.php
adamsilverstein May 6, 2024
9e7ca33
merge trunk
adamsilverstein May 6, 2024
8899b66
Ensure $image_format set even without perflab_modern_image_format option
adamsilverstein May 6, 2024
e21f174
Improve AVIF check for GD false positive
adamsilverstein May 6, 2024
c4c020a
insert detection script with approach that is IDE friendly
adamsilverstein May 6, 2024
7f0499b
language clarification (system may not support AVIF)
adamsilverstein May 6, 2024
89bffc4
Always show settings field for avif
adamsilverstein May 6, 2024
3896293
Always include AVIF settings
adamsilverstein May 6, 2024
88dedcb
disable AVIF in dropdown when not available
adamsilverstein May 6, 2024
599e941
add warning notice when AVIF not available
adamsilverstein May 6, 2024
a10a0a1
Linter fixes
adamsilverstein May 7, 2024
651b621
Improve AVIF support tests
adamsilverstein May 7, 2024
02c3831
Settings: ensure WebP selected if AVIF is not supported.
adamsilverstein May 7, 2024
048315e
Merge branch 'trunk' into add/avif-support
adamsilverstein May 7, 2024
5ff135d
Improve AVIF support test, take 2
adamsilverstein May 7, 2024
c318383
Update tests/plugins/webp-uploads/data/class-wp-image-doesnt-support-…
adamsilverstein May 7, 2024
84c0267
Update plugins/webp-uploads/hooks.php
adamsilverstein May 7, 2024
b6d8273
Update plugins/webp-uploads/settings.php
adamsilverstein May 7, 2024
a345e98
Update plugins/webp-uploads/helper.php
adamsilverstein May 7, 2024
6e4229c
whitespace
adamsilverstein May 7, 2024
be67798
Use a more explicit comparison in Imagick AVIF detection
adamsilverstein May 7, 2024
fe398c5
linting
adamsilverstein May 7, 2024
a2f5464
Update plugins/webp-uploads/hooks.php
adamsilverstein May 7, 2024
281592a
Update plugins/webp-uploads/hooks.php
adamsilverstein May 7, 2024
40d63c7
Update plugins/webp-uploads/hooks.php
adamsilverstein May 7, 2024
2c109bb
Update plugins/webp-uploads/hooks.php
adamsilverstein May 7, 2024
25a6f9d
no need to reset src after check
adamsilverstein May 7, 2024
8b2a069
Update plugins/webp-uploads/helper.php
adamsilverstein May 7, 2024
2c640a0
Update plugins/webp-uploads/helper.php
adamsilverstein May 7, 2024
2c06ac1
Add webp_uploads_get_image_output_format helper, improve detection st…
adamsilverstein May 7, 2024
315518c
“document” -> document
adamsilverstein May 7, 2024
821f48d
lintering
adamsilverstein May 7, 2024
cf64392
make fallback.js work with both avif and webp
adamsilverstein May 8, 2024
af02272
Update plugins/webp-uploads/helper.php
adamsilverstein May 8, 2024
2f4ca21
Update plugins/webp-uploads/helper.php
adamsilverstein May 8, 2024
665adde
Remove assertIsArray() with array will always evaluate to true.
adamsilverstein May 8, 2024
d3dd80a
Pass output fomat as attribute on script
adamsilverstein May 8, 2024
6a48bc0
linter: remove trailing comma
adamsilverstein May 8, 2024
caae2be
Update plugins/webp-uploads/fallback.js
adamsilverstein May 9, 2024
2d643a0
Update plugins/webp-uploads/fallback.js
adamsilverstein May 9, 2024
2ebf88e
Update plugins/webp-uploads/hooks.php
adamsilverstein May 9, 2024
16a7733
Update plugins/webp-uploads/hooks.php
adamsilverstein May 9, 2024
c4da646
Merge branch 'trunk' into add/avif-support, resolving conflicts and c…
adamsilverstein May 10, 2024
85fc761
remove files inadvertantly added during merge resolution
adamsilverstein May 10, 2024
14fbff9
remove files inadvertantly added during merge resolution
adamsilverstein May 10, 2024
98ce73a
cleanup
adamsilverstein May 10, 2024
7b80d2b
restore composer.lock from trunk
adamsilverstein May 10, 2024
27514ae
Cleanup after merge resolution
adamsilverstein May 10, 2024
51096ca
tests should expect slashed data
adamsilverstein May 10, 2024
782fab0
remove slashes from tests
adamsilverstein May 10, 2024
90c4ef3
Merge branch 'trunk' into add/avif-support
adamsilverstein May 10, 2024
2c99fd8
Update plugins/webp-uploads/helper.php
adamsilverstein May 13, 2024
473e3bd
Update plugins/webp-uploads/settings.php
adamsilverstein May 13, 2024
447f8aa
Update plugins/webp-uploads/settings.php
adamsilverstein May 13, 2024
abbbf65
restore docblock
adamsilverstein May 13, 2024
aafa4ff
Merge branch 'trunk' into add/avif-support
adamsilverstein May 14, 2024
2d53a40
merge trunk
adamsilverstein May 24, 2024
2266ea8
Simplify modern image detection in fallback script
adamsilverstein May 24, 2024
afb34fa
Consolidate logic to validate a format is supported by the plugin
adamsilverstein May 24, 2024
82c55c7
Fallback to avif when unsupported format specified
adamsilverstein May 24, 2024
ac925e4
Update readme with new functionality and changelog notice for upgrade
adamsilverstein May 24, 2024
2778ae8
Update plugins/webp-uploads/helper.php
adamsilverstein May 24, 2024
4754d21
Simplify sanitize_callback
adamsilverstein May 24, 2024
f6ba11d
Simplify webp_uploads_get_image_output_format
adamsilverstein May 24, 2024
c071ab1
Merge branch 'trunk' into add/avif-support
adamsilverstein May 24, 2024
0520ff8
Merge branch 'trunk' into add/avif-support
adamsilverstein May 24, 2024
283ce11
remove extraneous group notations in webp-upload tests
adamsilverstein May 24, 2024
6a17ca8
whitespace
adamsilverstein May 24, 2024
1d1b108
Update plugins/webp-uploads/settings.php
adamsilverstein May 28, 2024
c7a5f8b
Merge branch 'trunk' into add/avif-support
adamsilverstein May 28, 2024
329d37a
test linting
adamsilverstein May 28, 2024
2aa462e
restore removed whitespace
adamsilverstein May 28, 2024
48eaf67
Update tests/plugins/webp-uploads/load-tests.php
adamsilverstein May 28, 2024
da75c39
Update tests/plugins/webp-uploads/load-tests.php
adamsilverstein May 28, 2024
27caee7
Update tests/plugins/webp-uploads/load-tests.php
adamsilverstein May 28, 2024
c678bae
Update tests/plugins/webp-uploads/load-tests.php
adamsilverstein May 28, 2024
b9b8136
Update tests/plugins/webp-uploads/load-tests.php
adamsilverstein May 28, 2024
aabfcc3
Update tests/plugins/webp-uploads/load-tests.php
adamsilverstein May 28, 2024
3c4967d
Merge branch 'trunk' into add/avif-support
adamsilverstein May 28, 2024
f02c2d2
move webp_uploads_media_setting_style to deprecated.php
adamsilverstein May 28, 2024
b82059c
fun fun function
adamsilverstein May 28, 2024
e49062c
whitespace
adamsilverstein May 28, 2024
443ef0c
Merge branch 'trunk' into add/avif-support
adamsilverstein May 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions plugins/webp-uploads/helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,24 @@
* for example an image/jpeg can be converted into an image/webp.
*
* @since 1.0.0
* @since n.e.x.t Added support for AVIF.
*
* @return array<string, array<string>> An array of valid mime types, where the key is the mime type and the value is the extension type.
*/
function webp_uploads_get_upload_image_mime_transforms() {
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved

// Check the selected output format.
$output_format = get_option( 'perflab_generate_avif_and_webp', wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ? 'avif' : 'webp' );
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved

$default_transforms = array(
'image/jpeg' => array( 'image/webp' ),
'image/webp' => array( 'image/webp' ),
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
'image/jpeg' => array( 'image/' . $output_format ),
);

// Check setting for whether to generate both JPEG and WebP.
// Check setting for whether to generate both JPEG and the modern output format.
if ( true === (bool) get_option( 'perflab_generate_webp_and_jpeg' ) ) {
$default_transforms = array(
'image/jpeg' => array( 'image/jpeg', 'image/webp' ),
'image/webp' => array( 'image/webp', 'image/jpeg' ),
'image/jpeg' => array( 'image/jpeg', 'image/' . $output_format ),
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
'image/' . $output_format => array( 'image/' . $output_format, 'image/jpeg' ),
);
}

Expand Down
81 changes: 53 additions & 28 deletions plugins/webp-uploads/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,26 @@
}

/**
* Registers setting for generating both JPEG and WebP versions for image uploads.
* Registers setting for generating JPEG in addition to the selected modern format for image uploads.
*
* @since 1.0.0
* @since n.e.x.t The setting was made more general to coveroutputting JPEG as a secondary type. The "webp" option naming
* was left unchanged for backward compatibility.
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
* @since n.e.x.t The `perflab_generate_avif_and_webp` was added to enable selecting between AVIF and WebP output.
*/
function webp_uploads_register_media_settings_field() {
if ( wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
register_setting(
'media',
'perflab_generate_avif_and_webp',
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
array(
'type' => 'string',
'default' => 'avif',
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
'show_in_rest' => false,
)
);
}

register_setting(
'media',
'perflab_generate_webp_and_jpeg',
Expand All @@ -35,10 +50,24 @@ function webp_uploads_register_media_settings_field() {
* @since 1.0.0
*/
function webp_uploads_add_media_settings_field() {

// If AVIF is supported, add a dropdown to select the output format between AVIF and WebP.
if ( wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
add_settings_field(
'perflab_generate_avif_and_webp',
__( 'Modern image format', 'webp-uploads' ),
'webp_uploads_generate_avif_webp_setting_callback',
'media',
is_multisite() ? 'default' : 'uploads',
array( 'class' => 'perflab-generate-avif-and-webp' )
);

}

// Add settings field.
add_settings_field(
'perflab_generate_webp_and_jpeg',
__( 'WebP and JPEG', 'webp-uploads' ),
__( 'Also output JPEG', 'webp-uploads' ),
'webp_uploads_generate_webp_jpeg_setting_callback',
'media',
is_multisite() ? 'default' : 'uploads',
Expand All @@ -48,45 +77,41 @@ function webp_uploads_add_media_settings_field() {
add_action( 'admin_init', 'webp_uploads_add_media_settings_field' );

/**
* Renders the settings field for the 'perflab_generate_webp_and_jpeg' setting.
* Renders the settings field for the 'perflab_generate_avif_and_webp' setting.
*
* @since 1.0.0
* @since n.e.x.t
*/
function webp_uploads_generate_webp_jpeg_setting_callback() {
if ( ! is_multisite() ) {
?>
</td>
<td class="td-full">
<?php
}
function webp_uploads_generate_avif_webp_setting_callback() {

$selected = get_option( 'perflab_generate_avif_and_webp', 'avif' );
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
?>
<label for="perflab_generate_webp_and_jpeg">
<input name="perflab_generate_webp_and_jpeg" type="checkbox" id="perflab_generate_webp_and_jpeg" aria-describedby="perflab_generate_webp_and_jpeg_description" value="1"<?php checked( '1', get_option( 'perflab_generate_webp_and_jpeg' ) ); ?> />
<?php esc_html_e( 'Generate JPEG files in addition to WebP', 'webp-uploads' ); ?>
</label>
<p class="description" id="perflab_generate_webp_and_jpeg_description"><?php esc_html_e( 'Enabling JPEG in addition to WebP can improve compatibility, but will effectively double the filesystem storage use of your images.', 'webp-uploads' ); ?></p>
<label for="perflab_generate_avif_and_webp">
<select name="perflab_generate_avif_and_webp" id="perflab_generate_avif_and_webp" aria-describedby="perflab_generate_avif_and_webp_description">
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
<option value="webp"<?php selected( 'webp', $selected ); ?>><?php esc_html_e( 'WebP', 'webp-uploads' ); ?></option>
<option value="avif"<?php selected( 'avif', $selected ); ?>><?php esc_html_e( 'AVIF', 'webp-uploads' ); ?></option>
</select>
<?php esc_html_e( 'Generate images in this format', 'webp-uploads' ); ?>
</label>
<p class="description" id="perflab_generate_avif_and_webp_description"><?php esc_html_e( 'Select the format to use when generating new images from uploaded JPEGs.', 'webp-uploads' ); ?></p>
<?php
}

/**
* Adds custom styles to hide specific elements in media settings.
* Renders the settings field for the 'perflab_generate_webp_and_jpeg' setting.
*
* @since 1.0.0
*/
function webp_uploads_media_setting_style() {
if ( is_multisite() ) {
return;
}
function webp_uploads_generate_webp_jpeg_setting_callback() {

?>
<style>
.form-table .perflab-generate-webp-and-jpeg th,
.form-table .perflab-generate-webp-and-jpeg td:not(.td-full) {
display: none;
}
</style>

<label for="perflab_generate_webp_and_jpeg">
<input name="perflab_generate_webp_and_jpeg" type="checkbox" id="perflab_generate_webp_and_jpeg" aria-describedby="perflab_generate_webp_and_jpeg_description" value="1"<?php checked( '1', get_option( 'perflab_generate_webp_and_jpeg' ) ); ?> />
<?php esc_html_e( 'Output JPEG images in addition to the modern format', 'webp-uploads' ); ?>
</label>
<p class="description" id="perflab_generate_webp_and_jpeg_description"><?php esc_html_e( 'Enabling JPEG in addition to AVIF or WebP can improve compatibility, but will increase the filesystem storage use of your images.', 'webp-uploads' ); ?></p>
<?php
}
add_action( 'admin_head-options-media.php', 'webp_uploads_media_setting_style' );
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved

/**
* Adds a settings link to the plugin's action links.
Expand Down
Loading