PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.5
Squeeze – Image Optimization & Compression, WEBP Conversion v1.5
1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 trunk 1.0 1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5 1.5.1 1.5.2 1.6 All 42 releases
squeeze / src / settings.php

settings.php in Squeeze – Image Optimization & Compression, WEBP Conversion 1.5, at src/settings.php

1,324 lines 53.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // Exit if accessed directly.
4 if ( !defined( 'ABSPATH' ) ) {
5 exit;
6 }
7 add_action( 'admin_menu', 'squeeze_options_page' );
8 /**
9 * Add submenu page with settings under Media
10 */
11 function squeeze_options_page() {
12 add_submenu_page(
13 'options-general.php',
14 __( 'Squeeze Settings', 'squeeze' ),
15 __( 'Squeeze', 'squeeze' ),
16 'manage_options',
17 'squeeze',
18 'squeeze_options_page_html'
19 );
20 }
21
22 add_action( 'admin_menu', 'squeeze_options_bulk_page' );
23 /**
24 * Add submenu page with bulk compression under Media
25 */
26 function squeeze_options_bulk_page() {
27 add_submenu_page(
28 'upload.php',
29 __( 'Bulk Squeeze', 'squeeze' ),
30 __( 'Bulk Squeeze', 'squeeze' ),
31 'manage_options',
32 'squeeze-bulk',
33 'squeeze_options_bulk_page_html'
34 );
35 }
36
37 /**
38 * Bulk compression page callback function
39 */
40 function squeeze_options_bulk_page_html() {
41 // check user capabilities
42 if ( !current_user_can( 'manage_options' ) ) {
43 return;
44 }
45 $uncompressed_count = squeeze_get_uncompressed_images_count();
46 $uncompressed_pages = ceil( $uncompressed_count / SQUEEZE_MEDIA_PER_PAGE );
47 $total_count = squeeze_get_total_images_count();
48 $total_pages = ceil( $total_count / SQUEEZE_MEDIA_PER_PAGE );
49 $compressed_count = $total_count - $uncompressed_count;
50 $compressed_percentage = ( $total_count > 0 ? round( $compressed_count / $total_count * 100, 2 ) : 0 );
51 $dasharray = $compressed_percentage * 560 / 100;
52 //$total_count = array_sum((array)wp_count_attachments("image"));
53 $not_compressed_posts = implode( ",", squeeze_get_uncompressed_images() );
54 $all_posts = implode( ",", squeeze_get_total_images() );
55 $directory_path = ( get_transient( 'squeeze_bulk_path' ) ? get_transient( 'squeeze_bulk_path' ) : array('/wp-content/uploads/') );
56 $directory_path_json = wp_json_encode( $directory_path );
57 ?>
58 <div class="wrap">
59 <h1>
60 <?php
61 echo esc_html( get_admin_page_title() );
62 ?>
63 </h1>
64 <section class="squeeze-box">
65 <div class="squeeze-box-bulk-grid">
66 <div class="squeeze-box-bulk-grid__col">
67 <div class="squeeze-box-header">
68 <h2><?php
69 esc_html_e( 'Bulk Media Library Squeeze', 'squeeze' );
70 ?></h2>
71 </div>
72 <div class="squeeze-box-content">
73 <div class="squeeze-box-content__row">
74 <div class="squeeze-box-content__col">
75 <div class="squeeze-bulk-media-stats">
76 <div class="squeeze-bulk-media-stats-chart" style="--squeeze-dasharray: <?php
77 echo esc_attr( $dasharray );
78 ?>;">
79 <svg width="200" height="200">
80 <circle cx="100" cy="100" r="90" class="squeeze-bulk-media-stats-chart-total" fill="none" />
81 <circle cx="100" cy="100" r="90" class="squeeze-bulk-media-stats-chart-squeezed" fill="none"/>
82
83 <g class="squeeze-bulk-media-stats-chart-value">
84 <text x="100" y="100" alignment-baseline="central" text-anchor="middle"><?php
85 echo esc_html( $compressed_percentage );
86 ?>%</text>
87 </g>
88 </svg>
89 </div>
90 <div class="squeeze-bulk-media-stats-item">
91 <div class="squeeze-bulk-media-stats-item-label"><?php
92 esc_html_e( 'Squeezed images: ', 'squeeze' );
93 ?></div>
94 <div class="squeeze-bulk-media-stats-item-value"><?php
95 echo esc_html( $compressed_count );
96 ?> / <?php
97 echo esc_html( $total_count );
98 ?></div>
99 </div>
100 </div>
101 </div>
102 <div class="squeeze-box-content__col squeeze-bulk-media-actions">
103 <button name="squeeze_bulk" class="button button-primary button-hero" type="button" <?php
104 echo ( $uncompressed_count === 0 ? 'hidden disabled' : '' );
105 ?>>
106 <svg class="squeeze-icon">
107 <use xlink:href="#play-button-round-icon"></use>
108 </svg>
109 <?php
110 esc_attr_e( 'Run Bulk Squeeze', 'squeeze' );
111 ?>
112 </button>
113 <button name="squeeze_bulk_again" class="button button-secondary button-large" type="button">
114 <svg class="squeeze-icon">
115 <use xlink:href="#combine-left-right-outline-icon"></use>
116 </svg>
117 <?php
118 esc_attr_e( 'Repeat Bulk Squeeze', 'squeeze' );
119 ?>
120 </button>
121 </div>
122 </div>
123 </div>
124 </div>
125 <div class="squeeze-box-bulk-grid__col">
126 <div class="squeeze-box-header">
127 <h2><?php
128 esc_html_e( 'Directory Squeeze', 'squeeze' );
129 ?></h2>
130 </div>
131 <div class="squeeze-box-content">
132 <div class="squeeze-banner squeeze-banner--warning">
133 <svg class="squeeze-icon">
134 <use xlink:href="#exclamation-triangle-line-icon"></use>
135 </svg>
136 <div class="squeeze-banner__content">
137 <p><?php
138 esc_html_e( 'Warning! Backup option is NOT applicable here.', 'squeeze' );
139 ?></p>
140 <p><?php
141 esc_html_e( 'Please backup your images manually before optimising them.', 'squeeze' );
142 ?></p>
143 </div>
144 </div>
145 <div class="squeeze-box-content__row">
146 <div class="squeeze-box-content__col">
147 <label>
148 <?php
149 esc_html_e( 'Directory Path:', 'squeeze' );
150 ?><br>
151
152 <input type="hidden" name="squeeze_bulk_path" value="<?php
153 echo esc_attr( $directory_path_json );
154 ?>" />
155
156 <div class="squeeze-path-list">
157 <?php
158 foreach ( $directory_path as $path ) {
159 ?>
160 <input type="text" class="squeeze-path-list__item" value="<?php
161 echo esc_attr( $path );
162 ?>" readonly />
163 <?php
164 }
165 ?>
166 </div>
167 </label>
168 <button name="squeeze_select_path_button" class="button button-secondary button-large" type="button">
169 <svg class="squeeze-icon">
170 <use xlink:href="#open-folder-outline-icon"></use>
171 </svg>
172 <?php
173 esc_attr_e( 'Select Directory', 'squeeze' );
174 ?>
175 </button>
176 <dialog id="squeeze-path-dialog">
177 <div class="squeeze-box-header">
178 <h2><?php
179 esc_html_e( "Select Directory for Squeeze", "squeeze" );
180 ?></h2>
181 <button name="squeeze_close_path_dialog_button" class="button button-link" type="button">
182 <svg class="squeeze-icon">
183 <use xlink:href="#close-round-icon"></use>
184 </svg>
185 </button>
186 </div>
187
188 <div id="squeeze-bulk-directory-list">
189 <svg class="squeeze-icon">
190 <use xlink:href="#reload-sync-icon"></use>
191 </svg>
192 <?php
193 esc_attr_e( "Loading directories...", "squeeze" );
194 ?>
195 </div>
196
197 <div class="squeeze-box-footer">
198 <button disabled name="squeeze_save_path_button" class="button button-secondary button-large" type="button">
199 <svg class="squeeze-icon">
200 <use xlink:href="#open-folder-outline-icon"></use>
201 </svg>
202 <?php
203 esc_attr_e( 'Select Directory', 'squeeze' );
204 ?>
205 </button>
206 </div>
207 </dialog>
208 </div>
209 <div class="squeeze-box-content__col">
210 <button name="squeeze_bulk_path_button" class="button button-primary button-hero" type="button">
211 <svg class="squeeze-icon">
212 <use xlink:href="#play-button-round-icon"></use>
213 </svg>
214 <?php
215 esc_attr_e( 'Run Directory Squeeze', 'squeeze' );
216 ?>
217 </button>
218 </div>
219 </div>
220 </div>
221 </div>
222 <div class="squeeze-box-bulk-grid__row">
223 <div class="squeeze-box-content">
224 <p class="squeeze-hint"><?php
225 esc_html_e( 'Supported formats: JPG, PNG, AVIF, WebP', 'squeeze' );
226 ?></p>
227 </div>
228 </div>
229 </div>
230 </section>
231 <section class="squeeze-box" name="squeeze_bulk_log" id="squeeze_bulk_log" contenteditable="false">
232 <div class="squeeze-log-placeholder">
233 <?php
234 esc_html_e( 'Log will be displayed here', 'squeeze' );
235 ?>
236 </div>
237 <div id="squeeze-log-data"></div>
238 <div id="squeeze-anchor"></div><!-- to force scroll to the bottom -->
239 <input type="hidden" value="<?php
240 echo wp_kses_data( $not_compressed_posts );
241 ?>" name="squeeze_bulk_ids" />
242 <input type="hidden" value="<?php
243 echo wp_kses_data( $all_posts );
244 ?>" name="squeeze_bulk_all_ids" /><?php
245 // TBD: split into chunks for better performance
246 ?>
247 <input type="hidden" value="<?php
248 echo wp_kses_data( $total_pages );
249 ?>" name="squeeze_bulk_total_pages" />
250 <input type="hidden" value="<?php
251 echo wp_kses_data( $uncompressed_pages );
252 ?>" name="squeeze_bulk_uncompressed_pages" />
253 </section>
254 </div>
255 <?php
256 }
257
258 /**
259 * Options page callback function
260 */
261 function squeeze_options_page_html() {
262 // check user capabilities
263 if ( !current_user_can( 'manage_options' ) ) {
264 return;
265 }
266 ?>
267 <div class="wrap">
268 <h1>
269 <?php
270 echo esc_html( get_admin_page_title() );
271 ?>
272 </h1>
273 <nav class="nav-tab-wrapper">
274 <a href="#squeeze_basic" class="nav-tab nav-tab-active"><?php
275 esc_html_e( 'Basic Settings', 'squeeze' );
276 ?></a>
277 <a href="#squeeze_jpeg" class="nav-tab"><?php
278 esc_html_e( 'JPEG Settings', 'squeeze' );
279 ?></a>
280 <a href="#squeeze_png" class="nav-tab"><?php
281 esc_html_e( 'PNG Settings', 'squeeze' );
282 ?></a>
283 <a href="#squeeze_webp" class="nav-tab"><?php
284 esc_html_e( 'WEBP Settings', 'squeeze' );
285 ?></a>
286 <a href="#squeeze_avif" class="nav-tab"><?php
287 esc_html_e( 'AVIF Settings', 'squeeze' );
288 ?></a>
289 </nav>
290 <div class="tab-content">
291 <form action="options.php" method="post">
292 <?php
293 settings_errors( 'squeeze_notices' );
294 settings_fields( 'squeeze_options' );
295 //do_settings_sections( 'squeeze_options' );
296 ?>
297
298 <section id="squeeze_basic">
299 <div class="squeeze-box squeeze-box--settings">
300 <div class="squeeze-box-header">
301 <div class="squeeze-box-header__col">
302 <h2><?php
303 esc_html_e( 'Basic Settings', 'squeeze' );
304 ?></h2>
305 <?php
306 squeeze_setting_basic_desc();
307 ?>
308 </div>
309 </div>
310 <table class="form-table" role="presentation">
311 <?php
312 do_settings_fields( 'squeeze_options', 'squeeze_basic_settings' );
313 ?>
314 </table>
315 </div>
316 </section>
317 <section id="squeeze_jpeg">
318 <div class="squeeze-box squeeze-box--settings">
319 <div class="squeeze-box-header">
320 <div class="squeeze-box-header__col">
321 <h2><?php
322 esc_html_e( 'JPEG Settings', 'squeeze' );
323 ?></h2>
324 <?php
325 squeeze_setting_jpeg_desc();
326 ?>
327 </div>
328 </div>
329 <table class="form-table" role="presentation">
330 <?php
331 do_settings_fields( 'squeeze_options', 'squeeze_jpeg_settings' );
332 ?>
333 </table>
334 </div>
335 <div class="squeeze-box">
336 <div class="squeeze-box-header">
337 <div class="squeeze-box-header__col">
338 <h2><?php
339 esc_html_e( 'JPEG Advanced Settings', 'squeeze' );
340 ?></h2>
341 <?php
342 squeeze_setting_jpeg_advanced_desc();
343 ?>
344 </div>
345 </div>
346 <table class="form-table" role="presentation">
347 <?php
348 do_settings_fields( 'squeeze_options', 'squeeze_jpeg_advanced_settings' );
349 ?>
350 </table>
351 </div>
352 </section>
353 <section id="squeeze_png">
354 <div class="squeeze-box squeeze-box--settings">
355 <div class="squeeze-box-header">
356 <div class="squeeze-box-header__col">
357 <h2><?php
358 esc_html_e( 'PNG Settings', 'squeeze' );
359 ?></h2>
360 <?php
361 squeeze_setting_png_desc();
362 ?>
363 </div>
364 </div>
365 <table class="form-table" role="presentation">
366 <?php
367 do_settings_fields( 'squeeze_options', 'squeeze_png_settings' );
368 ?>
369 </table>
370 </div>
371 </section>
372 <section id="squeeze_webp">
373 <div class="squeeze-box squeeze-box--settings">
374 <div class="squeeze-box-header">
375 <div class="squeeze-box-header__col">
376 <h2><?php
377 esc_html_e( 'WEBP Settings', 'squeeze' );
378 ?></h2>
379 <?php
380 squeeze_setting_webp_desc();
381 ?>
382 </div>
383 </div>
384 <table class="form-table" role="presentation">
385 <?php
386 do_settings_fields( 'squeeze_options', 'squeeze_webp_settings' );
387 ?>
388 </table>
389 </div>
390 </section>
391 <section id="squeeze_avif">
392 <div class="squeeze-box squeeze-box--settings">
393 <div class="squeeze-box-header">
394 <div class="squeeze-box-header__col">
395 <h2><?php
396 esc_html_e( 'AVIF Settings', 'squeeze' );
397 ?></h2>
398 <?php
399 squeeze_setting_avif_desc();
400 ?>
401 </div>
402 </div>
403 <table class="form-table" role="presentation">
404 <?php
405 do_settings_fields( 'squeeze_options', 'squeeze_avif_settings' );
406 ?>
407 </table>
408 </div>
409 </section>
410
411 <p class="submit">
412 <input type="submit" name="submit" id="submit" class="button button-primary" value="<?php
413 esc_attr_e( 'Save Changes' );
414 ?>">
415 <input name="squeeze_restore_button" class="button button-secondary" type="button" value="<?php
416 esc_attr_e( 'Restore defaults', 'squeeze' );
417 ?>" />
418 </p>
419 </form>
420 </div>
421 </div>
422 <?php
423 }
424
425 add_action( 'admin_init', 'squeeze_register_settings' );
426 /**
427 * Register the settings and add the sections and fields
428 */
429 function squeeze_register_settings() {
430 $options = get_option( 'squeeze_options' );
431 register_setting( 'squeeze_options', 'squeeze_options', 'squeeze_options_validate' );
432 add_settings_section(
433 'squeeze_basic_settings',
434 __( 'Basic Settings', 'squeeze' ),
435 'squeeze_setting_basic_desc',
436 'squeeze_options',
437 array(
438 'section_class' => 'squeeze_basic',
439 )
440 );
441 add_settings_field(
442 'squeeze_setting_auto_compress',
443 __( 'Squeeze on upload', 'squeeze' ),
444 'squeeze_options_callback',
445 'squeeze_options',
446 'squeeze_basic_settings',
447 array(
448 'label_for' => 'auto_compress',
449 'class' => 'squeeze_setting_auto_compress',
450 'type' => 'checkbox',
451 )
452 );
453 add_settings_field(
454 'squeeze_setting_backup_original',
455 __( 'Backup original image', 'squeeze' ),
456 'squeeze_options_callback',
457 'squeeze_options',
458 'squeeze_basic_settings',
459 array(
460 'label_for' => 'backup_original',
461 'class' => 'squeeze_setting_backup_original',
462 'type' => 'checkbox',
463 )
464 );
465 add_settings_field(
466 'squeeze_setting_auto_webp',
467 __( 'Generate WEBP', 'squeeze' ) . squeeze_get_hint( __( 'Generate and serve WEBP images for all uploaded images. The original image URL remains the same, instead the image will be served in a WEBP format.', 'squeeze' ) ),
468 'squeeze_options_callback',
469 'squeeze_options',
470 'squeeze_basic_settings',
471 array(
472 'label_for' => 'auto_webp',
473 'class' => 'squeeze_setting_auto_webp',
474 'type' => 'checkbox',
475 )
476 );
477 add_settings_field(
478 'squeeze_setting_webp_replace_urls',
479 __( 'Replace images URLs', 'squeeze' ) . squeeze_get_hint( __( 'Replace original URLs of images with the related WEBP images.', 'squeeze' ) ),
480 'squeeze_options_callback',
481 'squeeze_options',
482 'squeeze_basic_settings',
483 array(
484 'label_for' => 'webp_replace_urls',
485 'class' => 'squeeze_setting_webp_replace_urls',
486 'type' => 'checkbox',
487 'hidden' => ( $options['auto_webp'] ? '' : true ),
488 )
489 );
490 add_settings_field(
491 'squeeze_setting_compress_thumbs',
492 __( 'Squeeze thumbnails', 'squeeze' ) . squeeze_get_hint( __( 'Choose which image thumbnail sizes you want to squeeze along with the original image.', 'squeeze' ) ),
493 'squeeze_options_callback',
494 'squeeze_options',
495 'squeeze_basic_settings',
496 array(
497 'label_for' => 'compress_thumbs',
498 'class' => 'squeeze_setting_compress_thumbs',
499 'type' => 'thumbs_checkbox_group',
500 )
501 );
502 add_settings_field(
503 'squeeze_setting_timeout',
504 __( 'Squeeze timeout', 'squeeze' ) . squeeze_get_hint( __( 'Time limit for squeezing an image. If you get an error during image squeezing, try to increase this value.', 'squeeze' ) ),
505 'squeeze_options_callback',
506 'squeeze_options',
507 'squeeze_basic_settings',
508 array(
509 'label_for' => 'timeout',
510 'class' => 'squeeze_setting_timeout',
511 'type' => 'number',
512 'units' => 'sec',
513 'min' => 1,
514 )
515 );
516 add_settings_field(
517 'squeeze_setting_restore_defaults',
518 '',
519 'squeeze_options_callback',
520 'squeeze_options',
521 'squeeze_basic_settings',
522 array(
523 'label_for' => 'restore_defaults',
524 'class' => 'squeeze_setting_restore_defaults',
525 'type' => 'hidden',
526 )
527 );
528 add_settings_section(
529 'squeeze_jpeg_settings',
530 __( 'JPEG Settings', 'squeeze' ),
531 'squeeze_setting_jpeg_desc',
532 'squeeze_options',
533 array(
534 'section_class' => 'squeeze_jpeg',
535 )
536 );
537 add_settings_field(
538 'squeeze_setting_jpeg_quality',
539 __( 'Quality', 'squeeze' ),
540 'squeeze_options_callback',
541 'squeeze_options',
542 'squeeze_jpeg_settings',
543 array(
544 'label_for' => 'jpeg_quality',
545 'class' => 'squeeze_setting_jpeg_quality',
546 'type' => 'range',
547 )
548 );
549 add_settings_field(
550 'squeeze_setting_jpeg_smoothing',
551 __( 'Smoothing', 'squeeze' ),
552 'squeeze_options_callback',
553 'squeeze_options',
554 'squeeze_jpeg_settings',
555 array(
556 'label_for' => 'jpeg_smoothing',
557 'class' => 'squeeze_setting_jpeg_smoothing',
558 'type' => 'range',
559 )
560 );
561 add_settings_field(
562 'squeeze_setting_jpeg_baseline',
563 __( 'Pointless spec compliance', 'squeeze' ),
564 'squeeze_options_callback',
565 'squeeze_options',
566 'squeeze_jpeg_advanced_settings',
567 array(
568 'label_for' => 'jpeg_baseline',
569 'class' => 'squeeze_setting_jpeg_baseline',
570 'type' => 'checkbox',
571 )
572 );
573 add_settings_field(
574 'squeeze_setting_jpeg_arithmetic',
575 __( 'Arithmetic', 'squeeze' ),
576 'squeeze_options_callback',
577 'squeeze_options',
578 'squeeze_jpeg_advanced_settings',
579 array(
580 'label_for' => 'jpeg_arithmetic',
581 'class' => 'squeeze_setting_jpeg_arithmetic',
582 'type' => 'checkbox',
583 )
584 );
585 add_settings_field(
586 'squeeze_setting_jpeg_progressive',
587 __( 'Progressive rendering', 'squeeze' ),
588 'squeeze_options_callback',
589 'squeeze_options',
590 'squeeze_jpeg_advanced_settings',
591 array(
592 'label_for' => 'jpeg_progressive',
593 'class' => 'squeeze_setting_jpeg_progressive',
594 'type' => 'checkbox',
595 )
596 );
597 add_settings_field(
598 'squeeze_setting_jpeg_optimize_coding',
599 __( 'Optimize Huffman table', 'squeeze' ),
600 'squeeze_options_callback',
601 'squeeze_options',
602 'squeeze_jpeg_advanced_settings',
603 array(
604 'label_for' => 'jpeg_optimize_coding',
605 'class' => 'squeeze_setting_jpeg_optimize_coding',
606 'type' => 'checkbox',
607 )
608 );
609 add_settings_field(
610 'squeeze_setting_jpeg_color_space',
611 __( 'Channels', 'squeeze' ),
612 'squeeze_options_callback',
613 'squeeze_options',
614 'squeeze_jpeg_advanced_settings',
615 array(
616 'label_for' => 'jpeg_color_space',
617 'class' => 'squeeze_setting_jpeg_color_space',
618 'type' => 'select',
619 'options' => array(
620 '3' => 'YCbCr',
621 '1' => 'Grayscale',
622 '2' => 'RGB',
623 ),
624 )
625 );
626 add_settings_field(
627 'squeeze_setting_jpeg_quant_table',
628 __( 'Quantization', 'squeeze' ),
629 'squeeze_options_callback',
630 'squeeze_options',
631 'squeeze_jpeg_advanced_settings',
632 array(
633 'label_for' => 'jpeg_quant_table',
634 'class' => 'squeeze_setting_jpeg_quant_table',
635 'type' => 'select',
636 'options' => array(
637 '0' => 'JPEG Annex K',
638 '1' => 'Flat',
639 '2' => 'MSSIM-tuned Kodak',
640 '3' => 'ImageMagick',
641 '4' => 'PSNR-HVS-M-tuned Kodak',
642 '5' => 'Klein et al',
643 '6' => 'Watson et al',
644 '7' => 'Ahumada et al',
645 '8' => 'Peterson et al',
646 ),
647 )
648 );
649 add_settings_field(
650 'squeeze_setting_jpeg_trellis_multipass',
651 __( 'Trellis multipass', 'squeeze' ),
652 'squeeze_options_callback',
653 'squeeze_options',
654 'squeeze_jpeg_advanced_settings',
655 array(
656 'label_for' => 'jpeg_trellis_multipass',
657 'class' => 'squeeze_setting_jpeg_trellis_multipass',
658 'type' => 'checkbox',
659 )
660 );
661 add_settings_field(
662 'squeeze_setting_jpeg_trellis_opt_zero',
663 __( 'Optimize zero block runs', 'squeeze' ),
664 'squeeze_options_callback',
665 'squeeze_options',
666 'squeeze_jpeg_advanced_settings',
667 array(
668 'label_for' => 'jpeg_trellis_opt_zero',
669 'class' => 'squeeze_setting_jpeg_trellis_opt_zero',
670 'type' => 'checkbox',
671 )
672 );
673 add_settings_field(
674 'squeeze_setting_jpeg_trellis_opt_table',
675 __( 'Optimize after trellis quantization', 'squeeze' ),
676 'squeeze_options_callback',
677 'squeeze_options',
678 'squeeze_jpeg_advanced_settings',
679 array(
680 'label_for' => 'jpeg_trellis_opt_table',
681 'class' => 'squeeze_setting_jpeg_trellis_opt_table',
682 'type' => 'checkbox',
683 )
684 );
685 add_settings_field(
686 'squeeze_setting_jpeg_trellis_loops',
687 __( 'Trellis quantization passes', 'squeeze' ),
688 'squeeze_options_callback',
689 'squeeze_options',
690 'squeeze_jpeg_advanced_settings',
691 array(
692 'label_for' => 'jpeg_trellis_loops',
693 'class' => 'squeeze_setting_jpeg_trellis_loops',
694 'type' => 'range',
695 'min' => 1,
696 'max' => 50,
697 )
698 );
699 add_settings_field(
700 'squeeze_setting_jpeg_auto_subsample',
701 __( 'Auto subsample chroma', 'squeeze' ),
702 'squeeze_options_callback',
703 'squeeze_options',
704 'squeeze_jpeg_advanced_settings',
705 array(
706 'label_for' => 'jpeg_auto_subsample',
707 'class' => 'squeeze_setting_jpeg_auto_subsample',
708 'type' => 'checkbox',
709 )
710 );
711 add_settings_field(
712 'squeeze_setting_jpeg_chroma_subsample',
713 __( 'Subsample chroma by', 'squeeze' ),
714 'squeeze_options_callback',
715 'squeeze_options',
716 'squeeze_jpeg_advanced_settings',
717 array(
718 'label_for' => 'jpeg_chroma_subsample',
719 'class' => 'squeeze_setting_jpeg_chroma_subsample',
720 'type' => 'range',
721 'min' => 1,
722 'max' => 4,
723 )
724 );
725 add_settings_field(
726 'squeeze_setting_jpeg_separate_chroma_quality',
727 __( 'Separate chroma quality', 'squeeze' ),
728 'squeeze_options_callback',
729 'squeeze_options',
730 'squeeze_jpeg_advanced_settings',
731 array(
732 'label_for' => 'jpeg_separate_chroma_quality',
733 'class' => 'squeeze_setting_jpeg_separate_chroma_quality',
734 'type' => 'checkbox',
735 )
736 );
737 add_settings_field(
738 'squeeze_setting_jpeg_chroma_quality',
739 __( 'Chroma quality', 'squeeze' ),
740 'squeeze_options_callback',
741 'squeeze_options',
742 'squeeze_jpeg_advanced_settings',
743 array(
744 'label_for' => 'jpeg_chroma_quality',
745 'class' => 'squeeze_setting_jpeg_chroma_quality',
746 'type' => 'range',
747 )
748 );
749 add_settings_section(
750 'squeeze_png_settings',
751 __( 'PNG Settings', 'squeeze' ),
752 'squeeze_setting_png_desc',
753 'squeeze_options',
754 array(
755 'section_class' => 'squeeze_png',
756 )
757 );
758 add_settings_field(
759 'squeeze_setting_png_level',
760 __( 'Effort', 'squeeze' ),
761 'squeeze_options_callback',
762 'squeeze_options',
763 'squeeze_png_settings',
764 array(
765 'label_for' => 'png_level',
766 'class' => 'squeeze_setting_png_level',
767 'type' => 'range',
768 'min' => 0,
769 'max' => 3,
770 )
771 );
772 add_settings_field(
773 'squeeze_setting_png_interlace',
774 __( 'Interlace', 'squeeze' ),
775 'squeeze_options_callback',
776 'squeeze_options',
777 'squeeze_png_settings',
778 array(
779 'label_for' => 'png_interlace',
780 'class' => 'squeeze_setting_png_interlace',
781 'type' => 'checkbox',
782 )
783 );
784 add_settings_section(
785 'squeeze_webp_settings',
786 __( 'WEBP Settings', 'squeeze' ),
787 'squeeze_setting_webp_desc',
788 'squeeze_options',
789 array(
790 'section_class' => 'squeeze_webp',
791 )
792 );
793 add_settings_field(
794 'squeeze_setting_webp_method',
795 __( 'Effort', 'squeeze' ),
796 'squeeze_options_callback',
797 'squeeze_options',
798 'squeeze_webp_settings',
799 array(
800 'label_for' => 'webp_method',
801 'class' => 'squeeze_setting_webp_method',
802 'type' => 'range',
803 'min' => 0,
804 'max' => 6,
805 )
806 );
807 add_settings_field(
808 'squeeze_setting_webp_quality',
809 __( 'Quality', 'squeeze' ),
810 'squeeze_options_callback',
811 'squeeze_options',
812 'squeeze_webp_settings',
813 array(
814 'label_for' => 'webp_quality',
815 'class' => 'squeeze_setting_webp_quality',
816 'type' => 'range',
817 'min' => 0,
818 'max' => 100,
819 )
820 );
821 add_settings_field(
822 'squeeze_setting_webp_lossless',
823 __( 'Lossless', 'squeeze' ),
824 'squeeze_options_callback',
825 'squeeze_options',
826 'squeeze_webp_settings',
827 array(
828 'label_for' => 'webp_lossless',
829 'class' => 'squeeze_setting_webp_lossless',
830 'type' => 'checkbox',
831 )
832 );
833 add_settings_field(
834 'squeeze_setting_webp_near_lossless',
835 __( 'Near lossless', 'squeeze' ),
836 'squeeze_options_callback',
837 'squeeze_options',
838 'squeeze_webp_settings',
839 array(
840 'label_for' => 'webp_near_lossless',
841 'class' => 'squeeze_setting_webp_near_lossless',
842 'type' => 'range',
843 'min' => 0,
844 'max' => 100,
845 )
846 );
847 add_settings_section(
848 'squeeze_avif_settings',
849 __( 'AVIF Settings', 'squeeze' ),
850 'squeeze_setting_avif_desc',
851 'squeeze_options',
852 array(
853 'section_class' => 'squeeze_avif',
854 )
855 );
856 add_settings_field(
857 'squeeze_setting_avif_cqLevel',
858 __( 'Quality', 'squeeze' ),
859 'squeeze_options_callback',
860 'squeeze_options',
861 'squeeze_avif_settings',
862 array(
863 'label_for' => 'avif_cqLevel',
864 'class' => 'squeeze_setting_avif_cqLevel',
865 'type' => 'range',
866 'min' => 1,
867 'max' => 100,
868 )
869 );
870 }
871
872 function squeeze_get_hint( $hint, $class = 'squeeze-hint' ) {
873 return '<span class="' . esc_attr( $class ) . '">' . esc_html( $hint ) . '</span>';
874 }
875
876 /**
877 * Sanitize and validate input. Accepts an array, return a sanitized array.
878 * @param array $input
879 */
880 function squeeze_options_validate( $input ) {
881 $input['jpeg_quality'] = absint( $input['jpeg_quality'] );
882 $input['jpeg_smoothing'] = absint( $input['jpeg_smoothing'] );
883 $input['jpeg_color_space'] = absint( $input['jpeg_color_space'] );
884 $input['jpeg_quant_table'] = absint( $input['jpeg_quant_table'] );
885 $input['jpeg_trellis_loops'] = absint( $input['jpeg_trellis_loops'] );
886 $input['jpeg_chroma_subsample'] = absint( $input['jpeg_chroma_subsample'] );
887 $input['jpeg_chroma_quality'] = absint( $input['jpeg_chroma_quality'] );
888 $input['png_level'] = absint( $input['png_level'] );
889 $input['webp_method'] = absint( $input['webp_method'] );
890 $input['webp_quality'] = absint( $input['webp_quality'] );
891 $input['webp_near_lossless'] = absint( $input['webp_near_lossless'] );
892 $input['avif_cqLevel'] = absint( $input['avif_cqLevel'] );
893 $input['jpeg_baseline'] = ( isset( $input['jpeg_baseline'] ) ? $input['jpeg_baseline'] : '0' );
894 $input['jpeg_arithmetic'] = ( isset( $input['jpeg_arithmetic'] ) ? $input['jpeg_arithmetic'] : '0' );
895 $input['jpeg_progressive'] = ( isset( $input['jpeg_progressive'] ) ? $input['jpeg_progressive'] : '0' );
896 $input['jpeg_optimize_coding'] = ( isset( $input['jpeg_optimize_coding'] ) ? $input['jpeg_optimize_coding'] : '0' );
897 $input['jpeg_trellis_multipass'] = ( isset( $input['jpeg_trellis_multipass'] ) ? $input['jpeg_trellis_multipass'] : '0' );
898 $input['jpeg_trellis_opt_zero'] = ( isset( $input['jpeg_trellis_opt_zero'] ) ? $input['jpeg_trellis_opt_zero'] : '0' );
899 $input['jpeg_trellis_opt_table'] = ( isset( $input['jpeg_trellis_opt_table'] ) ? $input['jpeg_trellis_opt_table'] : '0' );
900 $input['jpeg_auto_subsample'] = ( isset( $input['jpeg_auto_subsample'] ) ? $input['jpeg_auto_subsample'] : '0' );
901 $input['jpeg_separate_chroma_quality'] = ( isset( $input['jpeg_separate_chroma_quality'] ) ? $input['jpeg_separate_chroma_quality'] : '0' );
902 $input['png_interlace'] = ( isset( $input['png_interlace'] ) ? $input['png_interlace'] : '0' );
903 $input['webp_lossless'] = ( isset( $input['webp_lossless'] ) ? $input['webp_lossless'] : '0' );
904 $input['auto_compress'] = ( isset( $input['auto_compress'] ) ? $input['auto_compress'] : '0' );
905 $input['auto_webp'] = ( isset( $input['auto_webp'] ) ? $input['auto_webp'] : '0' );
906 $input['webp_replace_urls'] = ( isset( $input['webp_replace_urls'] ) && $input['auto_webp'] ? $input['webp_replace_urls'] : '0' );
907 $input['backup_original'] = ( isset( $input['backup_original'] ) ? $input['backup_original'] : '0' );
908 $input['compress_thumbs'] = ( isset( $input['compress_thumbs'] ) ? $input['compress_thumbs'] : array() );
909 $input['max_width'] = ( isset( $input['max_width'] ) && $input['max_width'] > 0 ? absint( $input['max_width'] ) : '' );
910 $input['max_height'] = ( isset( $input['max_height'] ) && $input['max_height'] > 0 ? absint( $input['max_height'] ) : '' );
911 $input['timeout'] = ( isset( $input['timeout'] ) && $input['timeout'] > 0 ? absint( $input['timeout'] ) : 1 );
912 $input['restore_defaults'] = ( isset( $input['restore_defaults'] ) ? $input['restore_defaults'] : '0' );
913 if ( !isset( $input['restore_defaults'] ) || $input['restore_defaults'] !== '1' ) {
914 add_settings_error(
915 'squeeze_notices',
916 'settings_updated',
917 __( 'Settings have been updated.', 'squeeze' ),
918 'success'
919 );
920 }
921 return $input;
922 }
923
924 /**
925 * Display and fill the form field
926 * @param array $args
927 */
928 function squeeze_options_callback( $args ) {
929 $label_for = $args['label_for'];
930 $class = $args['class'];
931 $type = $args['type'];
932 $default = squeeze_get_default_value( $label_for );
933 $options = get_option( 'squeeze_options' );
934 $is_hidden = ( isset( $args['hidden'] ) && $args['hidden'] ? 'hidden' : '' );
935 $extra_classes = [];
936 if ( $is_hidden ) {
937 $extra_classes[] = 'squeeze-hidden';
938 }
939 $extra_classes = implode( ' ', $extra_classes );
940 switch ( $type ) {
941 case 'text':
942 $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default );
943 echo "<input class='" . esc_attr( $extra_classes ) . "' id='squeeze_setting_" . esc_attr( $label_for ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "]' type='text' value='" . esc_attr( $value ) . "' />";
944 break;
945 case 'number':
946 $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default );
947 $units = ( isset( $args['units'] ) ? $args['units'] : '' );
948 $min = ( isset( $args['min'] ) ? $args['min'] : '' );
949 $max = ( isset( $args['max'] ) ? $args['max'] : '' );
950 echo "<input class='" . esc_attr( $extra_classes ) . "' id='squeeze_setting_" . esc_attr( $label_for ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "]' type='number' value='" . esc_attr( $value ) . "' " . (( $min ? "min='" . esc_attr( $min ) . "'" : "" )) . " " . (( $max ? "min='" . esc_attr( $max ) . "'" : "" )) . " />";
951 if ( $units ) {
952 echo "<span class='squeeze-setting-units'>" . esc_html( $units ) . "</span>";
953 }
954 break;
955 case 'range':
956 $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default );
957 $min = ( isset( $args['min'] ) ? $args['min'] : 0 );
958 $max = ( isset( $args['max'] ) ? $args['max'] : 100 );
959 $step = ( isset( $args['step'] ) ? $args['step'] : 1 );
960 echo "<input class='" . esc_attr( $extra_classes ) . "' id='squeeze_setting_" . esc_attr( $label_for ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "]' min='" . (int) $min . "' max='" . (int) $max . "' step='" . (int) $step . "' type='range' value='" . esc_attr( $value ) . "' />";
961 echo '<output id="squeeze_setting_' . esc_attr( $label_for ) . '_value"></output>';
962 ?>
963 <script>
964 (function () {
965 const value = document.querySelector("#squeeze_setting_<?php
966 echo esc_attr( $label_for );
967 ?>_value")
968 const input = document.querySelector("#squeeze_setting_<?php
969 echo esc_attr( $label_for );
970 ?>")
971 value.textContent = input.value
972 input.addEventListener("input", (event) => {
973 value.textContent = event.target.value
974 })
975 })()
976 </script>
977 <?php
978 break;
979 case 'checkbox':
980 $value = ( isset( $options[$label_for] ) ? (bool) $options[$label_for] : $default );
981 echo "<input class='squeeze-ios8-switch " . esc_attr( $extra_classes ) . "' id='squeeze_setting_" . esc_attr( $label_for ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "]' type='checkbox' " . checked( $value, true, false ) . " />";
982 echo '<label for="squeeze_setting_' . esc_attr( $label_for ) . '"></label>';
983 break;
984 case 'select':
985 $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default );
986 echo "<select class='" . esc_attr( $extra_classes ) . "' id='squeeze_setting_" . esc_attr( $label_for ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "]'>";
987 foreach ( $args['options'] as $key => $option ) {
988 echo "<option value='" . esc_attr( $key ) . "' " . selected( $value, $key, false ) . ">" . esc_html( $option ) . "</option>";
989 }
990 echo "</select>";
991 break;
992 case 'thumbs_checkbox_group':
993 $thumbs = array();
994 $value = ( isset( $options[$label_for] ) ? (array) $options[$label_for] : $default );
995 $available_sizes = wp_get_registered_image_subsizes();
996 foreach ( $available_sizes as $key => $size ) {
997 $thumbs[$key] = ucwords( str_replace( '_', ' ', $key ) ) . ' (' . $size['width'] . 'x' . $size['height'] . ')';
998 }
999 // Add the scaled image size option
1000 $big_image_size_threshold = apply_filters( 'big_image_size_threshold', 2560 );
1001 $thumbs['full'] = 'Scaled (' . $big_image_size_threshold . 'x' . $big_image_size_threshold . ')';
1002 echo '<div class="squeeze-box squeeze-box--fieldset">';
1003 echo '<div class="squeeze-box-content">';
1004 foreach ( $thumbs as $key => $option ) {
1005 echo '<div class="squeeze-suboption">';
1006 echo "<input class='squeeze-ios8-switch' id='squeeze_setting_" . esc_attr( $label_for ) . "_" . esc_attr( $key ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "][" . esc_attr( $key ) . "]' type='checkbox' " . checked( array_key_exists( $key, $value ), true, false ) . " /> ";
1007 echo "<label for='squeeze_setting_" . esc_attr( $label_for ) . "_" . esc_attr( $key ) . "'>" . esc_html( $option ) . "</label>";
1008 echo '</div>';
1009 }
1010 echo '</div>';
1011 echo '</div>';
1012 break;
1013 case 'hidden':
1014 $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default );
1015 echo "<input id='squeeze_setting_" . esc_attr( $label_for ) . "' name='squeeze_options[" . esc_attr( $label_for ) . "]' type='hidden' value='" . esc_attr( $value ) . "' />";
1016 break;
1017 }
1018 }
1019
1020 /**
1021 * Get default value for option
1022 * @param string $option
1023 * @param bool $all
1024 */
1025 function squeeze_get_default_value( $option, $all = false ) {
1026 $options_defaults = apply_filters( 'squeeze_options_default', array(
1027 'jpeg_quality' => 75,
1028 'jpeg_baseline' => false,
1029 'jpeg_arithmetic' => false,
1030 'jpeg_progressive' => true,
1031 'jpeg_optimize_coding' => true,
1032 'jpeg_smoothing' => 0,
1033 'jpeg_color_space' => 3,
1034 'jpeg_quant_table' => 3,
1035 'jpeg_trellis_multipass' => false,
1036 'jpeg_trellis_opt_zero' => false,
1037 'jpeg_trellis_opt_table' => false,
1038 'jpeg_trellis_loops' => 1,
1039 'jpeg_auto_subsample' => true,
1040 'jpeg_chroma_subsample' => 2,
1041 'jpeg_separate_chroma_quality' => false,
1042 'jpeg_chroma_quality' => 75,
1043 'png_level' => 2,
1044 'png_interlace' => false,
1045 'webp_method' => 4,
1046 'webp_quality' => 75,
1047 'webp_lossless' => false,
1048 'webp_near_lossless' => 100,
1049 'avif_cqLevel' => 70,
1050 'auto_compress' => true,
1051 'auto_webp' => true,
1052 'webp_replace_urls' => false,
1053 'backup_original' => true,
1054 'compress_thumbs' => array(
1055 'large' => 'on',
1056 'full' => 'on',
1057 ),
1058 'max_width' => '',
1059 'max_height' => '',
1060 'timeout' => 60,
1061 'restore_defaults' => false,
1062 ) );
1063 if ( $all ) {
1064 return $options_defaults;
1065 }
1066 return ( in_array( $option, array_keys( $options_defaults ) ) ? $options_defaults[$option] : false );
1067 }
1068
1069 function squeeze_setting_basic_desc() {
1070 echo '<p>' . esc_html__( 'Basic squeezing settings.', 'squeeze' ) . '</p>';
1071 }
1072
1073 function squeeze_setting_jpeg_desc() {
1074 echo '<p>' . esc_html__( 'Squeezing settings for JPEG images.', 'squeeze' ) . '</p>';
1075 }
1076
1077 function squeeze_setting_jpeg_advanced_desc() {
1078 echo '<p>' . esc_html__( 'More precise settings for experienced users.', 'squeeze' ) . '</p>';
1079 }
1080
1081 function squeeze_setting_png_desc() {
1082 echo '<p>' . esc_html__( 'Squeezing settings for PNG images.', 'squeeze' ) . '</p>';
1083 }
1084
1085 function squeeze_setting_webp_desc() {
1086 echo '<p>' . esc_html__( 'Squeezing settings for WebP images.', 'squeeze' ) . '</p>';
1087 }
1088
1089 function squeeze_setting_avif_desc() {
1090 echo '<p>' . esc_html__( 'Squeezing settings for Avif images.', 'squeeze' ) . '</p>';
1091 }
1092
1093 add_action(
1094 'update_option_squeeze_options',
1095 'squeeze_restore_defaults',
1096 10,
1097 2
1098 );
1099 /**
1100 * Restore default settings
1101 */
1102 function squeeze_restore_defaults( $old_value, $value ) {
1103 if ( isset( $value['restore_defaults'] ) && $value['restore_defaults'] === '1' ) {
1104 $result = delete_option( 'squeeze_options', "" );
1105 if ( $result ) {
1106 add_settings_error(
1107 'squeeze_notices',
1108 'settings_restored',
1109 __( 'Settings have been restored.', 'squeeze' ),
1110 'success'
1111 );
1112 } else {
1113 add_settings_error(
1114 'squeeze_notices',
1115 'settings_not_restored',
1116 __( 'Settings have not been restored.', 'squeeze' ),
1117 'error'
1118 );
1119 }
1120 }
1121 }
1122
1123 add_filter(
1124 'attachment_fields_to_edit',
1125 'squeeze_add_custom_field_to_attachment',
1126 10,
1127 2
1128 );
1129 /**
1130 * Add custom text/textarea attachment field
1131 */
1132 function squeeze_add_custom_field_to_attachment( $form_fields, $post ) {
1133 $allowed_mimes = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES;
1134 if ( in_array( $post->post_mime_type, $allowed_mimes ) ) {
1135 $is_compressed = get_post_meta( $post->ID, 'squeeze_is_compressed', true );
1136 $can_restore = squeeze_can_restore( $post->ID );
1137 $form_fields['squeeze_is_compressed'] = array(
1138 'label' => __( 'Squeeze', 'squeeze' ),
1139 'input' => 'html',
1140 'html' => ( $is_compressed ? '<label><span class="squeeze_status"><span style="padding-top: 0; line-height: 1; color: green;" class="dashicons dashicons-yes-alt"></span>&nbsp;' . __( 'Squeezed', 'squeeze' ) . '</span></label>' . (( $can_restore ? '
1141 <br><br><p><button name="squeeze_restore" type="button" class="button button-secondary squeeze-restore-button" data-attachment="' . $post->ID . '">' . __( 'Restore original', 'squeeze' ) . '</button></p>' : '' )) . '<p>
1142 <button name="squeeze_compress_again" type="button" class="button button-primary squeeze-compress-button" data-attachment="' . $post->ID . '">' . __( 'Squeeze again', 'squeeze' ) . '</button></p>' : '<label><span class="squeeze_status"><span style="padding-top: 0; line-height: 1; color: red;" class="dashicons dashicons-no-alt"></span>&nbsp;' . __( 'Not squeezed', 'squeeze' ) . '</span></label>
1143 <br><br><button name="squeeze_compress_single" type="button" class="button button-primary squeeze-compress-button" data-attachment="' . $post->ID . '">' . __( 'Squeeze', 'squeeze' ) . '</button>' ),
1144 );
1145 }
1146 return $form_fields;
1147 }
1148
1149 add_filter( 'manage_media_columns', 'squeeze_add_media_columns' );
1150 /**
1151 * Filter the Media list table columns to add a Squeeze column.
1152 *
1153 * @param array $posts_columns Existing array of columns displayed in the Media list table.
1154 * @return array Amended array of columns to be displayed in the Media list table.
1155 */
1156 function squeeze_add_media_columns( $posts_columns ) {
1157 $posts_columns['squeeze'] = __( 'Squeeze', 'squeeze' );
1158 return $posts_columns;
1159 }
1160
1161 add_action(
1162 'manage_media_custom_column',
1163 'squeeze_media_custom_column',
1164 10,
1165 2
1166 );
1167 /**
1168 * Display attachment uploaded time under `Time` custom column in the Media list table.
1169 *
1170 * @param string $column_name Name of the custom column.
1171 */
1172 function squeeze_media_custom_column( $column_name, $post_id ) {
1173 if ( 'squeeze' !== $column_name ) {
1174 return;
1175 }
1176 $form_fields = squeeze_add_custom_field_to_attachment( array(), get_post( $post_id ) );
1177 if ( $form_fields ) {
1178 echo wp_kses_post( $form_fields['squeeze_is_compressed']['html'] );
1179 }
1180 }
1181
1182 add_filter( 'manage_upload_sortable_columns', 'squeeze_sortable_columns' );
1183 /**
1184 * Add sortable Squeeze column
1185 */
1186 function squeeze_sortable_columns( $columns ) {
1187 $columns['squeeze'] = 'squeeze';
1188 return $columns;
1189 }
1190
1191 add_action( 'pre_get_posts', 'squeeze_sortable_columns_orderby' );
1192 /**
1193 * Order by Squeeze column
1194 */
1195 function squeeze_sortable_columns_orderby( $query ) {
1196 if ( !is_admin() || !$query->is_main_query() ) {
1197 return;
1198 }
1199 $orderby = $query->get( 'orderby' );
1200 if ( 'squeeze' === $orderby ) {
1201 // Define the allowed image formats
1202 $allowed_formats = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES;
1203 // include all media
1204 $query->set( 'meta_query', array(
1205 'relation' => 'OR',
1206 array(
1207 'key' => 'squeeze_is_compressed',
1208 'compare' => 'NOT EXISTS',
1209 ),
1210 array(
1211 'key' => 'squeeze_is_compressed',
1212 'compare' => 'EXISTS',
1213 ),
1214 ) );
1215 // Add the meta_query to filter by specific image formats
1216 //$query->set('post_mime_type', $allowed_formats);
1217 $query->set( 'orderby', 'meta_value' );
1218 }
1219 }
1220
1221 add_action( 'restrict_manage_posts', 'squeeze_media_filter_dropdown' );
1222 /**
1223 * Add a dropdown filter to the media library
1224 */
1225 function squeeze_media_filter_dropdown() {
1226 global $wp_query;
1227 $post_type = 'attachment';
1228 if ( isset( $_GET['post_type'] ) ) {
1229 $post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) );
1230 }
1231 if ( 'attachment' === $post_type ) {
1232 $selected = ( isset( $_GET['squeeze_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['squeeze_filter'] ) ) : '' );
1233 $options = array(
1234 'all' => __( 'Squeeze: All images', 'squeeze' ),
1235 'non-squeezed' => __( 'Non Squeezed Images', 'squeeze' ),
1236 );
1237 echo '<select name="squeeze_filter" id="squeeze-filter">';
1238 foreach ( $options as $value => $label ) {
1239 printf(
1240 '<option value="%s"%s>%s</option>',
1241 esc_attr( $value ),
1242 selected( $selected, $value, false ),
1243 esc_html( $label )
1244 );
1245 }
1246 echo '</select>';
1247 }
1248 }
1249
1250 add_action( 'pre_get_posts', 'squeeze_media_filter_query' );
1251 /**
1252 * Filter the media library query
1253 */
1254 function squeeze_media_filter_query( $query ) {
1255 global $current_screen;
1256 if ( !is_admin() || !empty( $current_screen ) && 'upload' !== $current_screen->base || 'attachment' !== $query->get( 'post_type' ) ) {
1257 return $query;
1258 }
1259 if ( isset( $_GET['squeeze_filter'] ) ) {
1260 $squeeze_filter = sanitize_text_field( wp_unslash( $_GET['squeeze_filter'] ) );
1261 if ( 'non-squeezed' === $squeeze_filter ) {
1262 $query->set( 'meta_query', array(
1263 'relation' => 'OR',
1264 array(
1265 'key' => 'squeeze_is_compressed',
1266 'compare' => '!=',
1267 'value' => '1',
1268 ),
1269 array(
1270 'key' => 'squeeze_is_compressed',
1271 'compare' => 'NOT EXISTS',
1272 ),
1273 ) );
1274 $query->set( 'orderby', 'meta_value' );
1275 $query->set( 'post_mime_type', SQUEEZE_ALLOWED_IMAGE_MIME_TYPES );
1276 }
1277 }
1278 return $query;
1279 }
1280
1281 add_filter(
1282 'ajax_query_attachments_args',
1283 'squeeze_media_filter_ajax_query',
1284 10,
1285 1
1286 );
1287 /**
1288 * Filter the media library query for AJAX requests
1289 */
1290 function squeeze_media_filter_ajax_query( $query ) {
1291 if ( !isset( $_POST['query']['squeeze_filter'] ) ) {
1292 return $query;
1293 }
1294 $squeeze_filter = sanitize_text_field( wp_unslash( $_POST['query']['squeeze_filter'] ) );
1295 if ( 'non-squeezed' === $squeeze_filter ) {
1296 $query['meta_query'] = array(
1297 'relation' => 'OR',
1298 array(
1299 'key' => 'squeeze_is_compressed',
1300 'compare' => '!=',
1301 'value' => '1',
1302 ),
1303 array(
1304 'key' => 'squeeze_is_compressed',
1305 'compare' => 'NOT EXISTS',
1306 ),
1307 );
1308 $query['orderby'] = 'meta_value';
1309 $query['post_mime_type'] = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES;
1310 }
1311 return $query;
1312 }
1313
1314 add_action( 'admin_footer', 'squeeze_svg_sprite_output' );
1315 /**
1316 * Output SVG sprite
1317 */
1318 function squeeze_svg_sprite_output() {
1319 global $pagenow;
1320 if ( $pagenow === 'upload.php' && isset( $_GET['page'] ) && $_GET['page'] === 'squeeze-bulk' ) {
1321 include SQUEEZE_PLUGIN_DIR . 'assets/images/sprite.svg';
1322 }
1323 }
1324