@@ -40,6 +40,18 @@ function webp_uploads_register_media_settings_field(): void {
40
40
'show_in_rest ' => false ,
41
41
)
42
42
);
43
+
44
+ // Add a setting to generate fallback images in all sizes including custom sizes.
45
+ register_setting (
46
+ 'media ' ,
47
+ 'perflab_generate_all_fallback_sizes ' ,
48
+ array (
49
+ 'type ' => 'boolean ' ,
50
+ 'default ' => false ,
51
+ 'show_in_rest ' => false ,
52
+ )
53
+ );
54
+
43
55
// Add a setting to use the picture element.
44
56
register_setting (
45
57
'media ' ,
@@ -96,6 +108,16 @@ function webp_uploads_add_media_settings_fields(): void {
96
108
array ( 'class ' => 'perflab-generate-webp-and-jpeg ' )
97
109
);
98
110
111
+ // Add setting field for generating fallback images in all sizes including custom sizes.
112
+ add_settings_field (
113
+ 'perflab_generate_all_fallback_sizes ' ,
114
+ __ ( 'Generate all fallback image sizes ' , 'webp-uploads ' ),
115
+ 'webp_uploads_generate_all_fallback_sizes_callback ' ,
116
+ 'media ' ,
117
+ 'perflab_modern_image_format_settings ' ,
118
+ array ( 'class ' => 'perflab-generate-fallback-all-sizes ' )
119
+ );
120
+
99
121
// Add picture element support settings field.
100
122
add_settings_field (
101
123
'webp_uploads_use_picture_element ' ,
@@ -178,6 +200,94 @@ function webp_uploads_generate_webp_jpeg_setting_callback(): void {
178
200
<?php
179
201
}
180
202
203
+
204
+ /**
205
+ * Renders the settings field for generating all fallback image sizes.
206
+ *
207
+ * @since n.e.x.t
208
+ */
209
+ function webp_uploads_generate_all_fallback_sizes_callback (): void {
210
+ $ all_fallback_sizes_enabled = webp_uploads_should_generate_all_fallback_sizes ();
211
+ $ fallback_enabled = webp_uploads_is_fallback_enabled ();
212
+ $ all_fallback_sizes_hidden_id = 'perflab_generate_all_fallback_sizes_hidden ' ;
213
+
214
+ ?>
215
+ <style>
216
+ #perflab_generate_all_fallback_sizes_fieldset.disabled label,
217
+ #perflab_generate_all_fallback_sizes_fieldset.disabled p {
218
+ opacity: 0.7;
219
+ }
220
+ </style>
221
+ <div id="perflab_generate_all_fallback_sizes_notice" class="notice notice-info inline" <?php echo $ fallback_enabled ? 'hidden ' : '' ; ?> >
222
+ <p><?php esc_html_e ( 'This setting requires fallback image output to be enabled. ' , 'webp-uploads ' ); ?> </p>
223
+ </div>
224
+ <div id="perflab_generate_all_fallback_sizes_fieldset" class="<?php echo ! $ fallback_enabled ? 'disabled ' : '' ; ?> ">
225
+ <label for="perflab_generate_all_fallback_sizes" id="perflab_generate_all_fallback_sizes_label">
226
+ <input
227
+ type="checkbox"
228
+ id="perflab_generate_all_fallback_sizes"
229
+ name="perflab_generate_all_fallback_sizes"
230
+ aria-describedby="perflab_generate_all_fallback_sizes_description"
231
+ value="1"
232
+ <?php checked ( $ all_fallback_sizes_enabled ); ?>
233
+ <?php disabled ( ! $ fallback_enabled ); ?>
234
+ >
235
+ <?php
236
+ /*
237
+ * If the checkbox is disabled, but the option is enabled, include a hidden input to continue sending the
238
+ * same value upon form submission.
239
+ */
240
+ if ( ! $ fallback_enabled && $ all_fallback_sizes_enabled ) {
241
+ ?>
242
+ <input
243
+ type="hidden"
244
+ id="<?php echo esc_attr ( $ all_fallback_sizes_hidden_id ); ?> "
245
+ name="perflab_generate_all_fallback_sizes"
246
+ value="1"
247
+ >
248
+ <?php
249
+ }
250
+ esc_html_e ( 'Generate all fallback image sizes including custom sizes ' , 'webp-uploads ' );
251
+ ?>
252
+ </label>
253
+ <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>
254
+ </div>
255
+ <script>
256
+ ( function ( allFallbackSizesHiddenId ) {
257
+ const fallbackCheckbox = document.getElementById( 'perflab_generate_webp_and_jpeg' );
258
+ const allFallbackSizesCheckbox = document.getElementById( 'perflab_generate_all_fallback_sizes' );
259
+ const allFallbackSizesFieldset = document.getElementById( 'perflab_generate_all_fallback_sizes_fieldset' );
260
+ const allFallbackSizesNotice = document.getElementById( 'perflab_generate_all_fallback_sizes_notice' );
261
+
262
+ function toggleAllFallbackSizes() {
263
+ const fallbackEnabled = fallbackCheckbox.checked;
264
+ allFallbackSizesFieldset.classList.toggle( 'disabled', ! fallbackEnabled );
265
+ allFallbackSizesCheckbox.disabled = ! fallbackEnabled;
266
+ allFallbackSizesNotice.hidden = fallbackEnabled;
267
+
268
+ // Remove or inject hidden input to preserve original setting value as needed.
269
+ if ( fallbackEnabled ) {
270
+ const hiddenInput = document.getElementById( allFallbackSizesHiddenId );
271
+ if ( hiddenInput ) {
272
+ hiddenInput.parentElement.removeChild( hiddenInput );
273
+ }
274
+ } else if ( allFallbackSizesCheckbox.checked && ! document.getElementById( allFallbackSizesHiddenId ) ) {
275
+ // The hidden input is only needed if the value was originally set (i.e., the checkbox enabled).
276
+ const hiddenInput = document.createElement( 'input' );
277
+ hiddenInput.type = 'hidden';
278
+ hiddenInput.id = allFallbackSizesHiddenId;
279
+ hiddenInput.name = allFallbackSizesCheckbox.name;
280
+ hiddenInput.value = allFallbackSizesCheckbox.value;
281
+ allFallbackSizesCheckbox.parentElement.insertBefore( hiddenInput, allFallbackSizesCheckbox.nextSibling );
282
+ }
283
+ }
284
+
285
+ fallbackCheckbox.addEventListener( 'change', toggleAllFallbackSizes );
286
+ } )( <?php echo wp_json_encode ( $ all_fallback_sizes_hidden_id ); ?> );
287
+ </script>
288
+ <?php
289
+ }
290
+
181
291
/**
182
292
* Renders the settings field for the 'webp_uploads_use_picture_element' setting.
183
293
*
0 commit comments