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

Enable end user opt-in to generate all sizes in fallback format #1689

Open
wants to merge 8 commits into
base: trunk
Choose a base branch
from
11 changes: 11 additions & 0 deletions plugins/webp-uploads/helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 True if the option is enabled, false otherwise.
*/
function webp_uploads_should_generate_all_fallback_sizes(): bool {
return (bool) get_option( 'perflab_generate_all_fallback_sizes' );
}

/**
* Retrieves the image URL for a specified MIME type from the attachment metadata.
*
Expand Down
26 changes: 26 additions & 0 deletions plugins/webp-uploads/hooks.php
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,10 @@ function webp_uploads_modify_webp_quality( int $quality, string $mime_type ): in
function webp_uploads_render_generator(): void {
// Use the plugin slug as it is immutable.
echo '<meta name="generator" content="webp-uploads ' . esc_attr( WEBP_UPLOADS_VERSION ) . '">' . "\n";

if ( webp_uploads_should_generate_all_fallback_sizes() ) {
echo '<meta name="generator" content="webp-uploads-fallback-all-sizes ' . esc_attr( WEBP_UPLOADS_VERSION ) . '">' . "\n";
}
}
add_action( 'wp_head', 'webp_uploads_render_generator' );

Expand Down Expand Up @@ -806,3 +810,25 @@ 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<string, bool> $allowed_sizes A map of image size names and whether they are allowed to have additional MIME types.
*
* @return array<string, bool> 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' );
110 changes: 110 additions & 0 deletions plugins/webp-uploads/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -178,6 +200,94 @@ function webp_uploads_generate_webp_jpeg_setting_callback(): void {
<?php
}


/**
* Renders the settings field for generating all fallback image sizes.
*
* @since n.e.x.t
*/
function webp_uploads_generate_all_fallback_sizes_callback(): void {
$all_fallback_sizes_enabled = 1 === (int) get_option( 'perflab_generate_all_fallback_sizes', 0 );
$fallback_enabled = webp_uploads_is_fallback_enabled();
$all_fallback_sizes_hidden_id = 'perflab_generate_all_fallback_sizes_hidden';

?>
<style>
#perflab_generate_all_fallback_sizes_fieldset.disabled label,
#perflab_generate_all_fallback_sizes_fieldset.disabled p {
opacity: 0.7;
}
</style>
<div id="perflab_generate_all_fallback_sizes_notice" class="notice notice-info inline" <?php echo $fallback_enabled ? 'hidden' : ''; ?>>
<p><?php esc_html_e( 'This setting requires fallback image output to be enabled.', 'webp-uploads' ); ?></p>
</div>
<div id="perflab_generate_all_fallback_sizes_fieldset" class="<?php echo ! $fallback_enabled ? 'disabled' : ''; ?>">
<label for="perflab_generate_all_fallback_sizes" id="perflab_generate_all_fallback_sizes_label">
<input
type="checkbox"
id="perflab_generate_all_fallback_sizes"
name="perflab_generate_all_fallback_sizes"
aria-describedby="perflab_generate_all_fallback_sizes_description"
value="1"
<?php checked( $all_fallback_sizes_enabled ); ?>
<?php disabled( ! $fallback_enabled ); ?>
>
<?php
/*
* If the checkbox is disabled, but the option is enabled, include a hidden input to continue sending the
* same value upon form submission.
*/
if ( ! $fallback_enabled && $all_fallback_sizes_enabled ) {
?>
<input
type="hidden"
id="<?php echo esc_attr( $all_fallback_sizes_hidden_id ); ?>"
name="perflab_generate_all_fallback_sizes"
value="1"
>
<?php
}
esc_html_e( 'Generate all fallback image sizes including custom sizes', 'webp-uploads' );
?>
</label>
<p class="description" id="perflab_generate_all_fallback_sizes_description"><?php esc_html_e( 'Enabling this option will generate all fallback image sizes including custom sizes. Note: uses even more storage space.', 'webp-uploads' ); ?></p>
</div>
<script>
( function ( allFallbackSizesHiddenId ) {
const fallbackCheckbox = document.getElementById( 'perflab_generate_webp_and_jpeg' );
const allFallbackSizesCheckbox = document.getElementById( 'perflab_generate_all_fallback_sizes' );
const allFallbackSizesFieldset = document.getElementById( 'perflab_generate_all_fallback_sizes_fieldset' );
const allFallbackSizesNotice = document.getElementById( 'perflab_generate_all_fallback_sizes_notice' );

function toggleAllFallbackSizes() {
const fallbackEnabled = fallbackCheckbox.checked;
allFallbackSizesFieldset.classList.toggle( 'disabled', ! fallbackEnabled );
allFallbackSizesCheckbox.disabled = ! fallbackEnabled;
allFallbackSizesNotice.hidden = fallbackEnabled;

// Remove or inject hidden input to preserve original setting value as needed.
if ( fallbackEnabled ) {
const hiddenInput = document.getElementById( allFallbackSizesHiddenId );
if ( hiddenInput ) {
hiddenInput.parentElement.removeChild( hiddenInput );
}
} else if ( allFallbackSizesCheckbox.checked && ! document.getElementById( allFallbackSizesHiddenId ) ) {
// The hidden input is only needed if the value was originally set (i.e., the checkbox enabled).
const hiddenInput = document.createElement( 'input' );
hiddenInput.type = 'hidden';
hiddenInput.id = allFallbackSizesHiddenId;
hiddenInput.name = allFallbackSizesCheckbox.name;
hiddenInput.value = allFallbackSizesCheckbox.value;
allFallbackSizesCheckbox.parentElement.insertBefore( hiddenInput, allFallbackSizesCheckbox.nextSibling );
}
}

fallbackCheckbox.addEventListener( 'change', toggleAllFallbackSizes );
} )( <?php echo wp_json_encode( $all_fallback_sizes_hidden_id ); ?> );
</script>
<?php
}

/**
* Renders the settings field for the 'webp_uploads_use_picture_element' setting.
*
Expand Down
1 change: 1 addition & 0 deletions plugins/webp-uploads/uninstall.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' );
}
Loading