PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.6
Squeeze – Image Optimization & Compression, WEBP Conversion v1.6
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 / inc / settings.php

settings.php in Squeeze – Image Optimization & Compression, WEBP Conversion 1.6, at inc/settings.php

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