PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.4.7
Squeeze – Image Optimization & Compression, WEBP Conversion v1.4.7
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.4.7, at src/settings.php

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