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

564 lines 30.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // Exit if accessed directly.
3 if (!defined('ABSPATH')) {
4 exit;
5 }
6
7 define('SQUEEZE_ALLOWED_IMAGE_MIME_TYPES', array(
8 'image/jpeg',
9 'image/jpg',
10 'image/png',
11 'image/webp',
12 'image/avif',
13 ));
14
15 add_action('admin_menu', 'squeeze_options_page');
16 /**
17 * Add submenu page with settings under Media
18 */
19 function squeeze_options_page() {
20 add_submenu_page(
21 'upload.php',
22 __('Squeeze', 'squeeze'),
23 __('Squeeze', 'squeeze'),
24 'manage_options',
25 'squeeze',
26 'squeeze_options_page_html'
27 );
28 }
29
30 add_action('admin_menu', 'squeeze_options_bulk_page');
31 /**
32 * Add submenu page with bulk compression under Media
33 */
34 function squeeze_options_bulk_page() {
35 add_submenu_page(
36 'upload.php',
37 __('Bulk Compress With Squeeze', 'squeeze'),
38 __('Squeeze Bulk', 'squeeze'),
39 'manage_options',
40 'squeeze-bulk',
41 'squeeze_options_bulk_page_html'
42 );
43 }
44
45 /**
46 * Bulk compression page callback function
47 */
48 function squeeze_options_bulk_page_html() {
49 // check user capabilities
50 if (!current_user_can('manage_options')) {
51 return;
52 }
53 $mimes = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES;
54 $query_not_compressed = new WP_Query( array(
55 'post_type' => 'attachment',
56 'post_status' => 'inherit',
57 'post_mime_type' => $mimes,
58 'posts_per_page' => -1,
59 'fields' => 'ids',
60 'meta_query' => array(
61 'relation' => 'OR',
62 array(
63 'key' => 'squeeze_is_compressed',
64 'compare' => 'NOT EXISTS'
65 ),
66 array(
67 'key' => 'squeeze_is_compressed',
68 'compare' => '!=',
69 'value' => '1'
70 )
71 )
72 ) );
73 $query_all = new WP_Query( array(
74 'post_type' => 'attachment',
75 'post_status' => 'inherit',
76 'post_mime_type' => $mimes,
77 'posts_per_page' => -1,
78 'fields' => 'ids',
79 ) );
80 $uncompressed_count = $query_not_compressed->found_posts;
81 $total_count = $query_all->found_posts;
82 //$total_count = array_sum((array)wp_count_attachments("image"));
83
84 $not_compressed_posts = implode(",", $query_not_compressed->posts);
85 $all_posts = implode(",", $query_all->posts);
86 ?>
87 <div class="wrap">
88 <h1>
89 <?php echo esc_html(get_admin_page_title()); ?>
90 </h1>
91 <p><?php esc_html_e('This page allows you to compress all images in your media library.', 'squeeze'); ?></p>
92 <p><strong><?php esc_html_e('Do not close this page during the compressing process.', 'squeeze'); ?></strong></p>
93 <p><?php esc_html_e('Please note that this process may take a long time depending on the number of images in your library.', 'squeeze'); ?></p>
94
95 <?php if ($uncompressed_count === 0) { ?>
96 <p><strong><?php esc_html_e('All images in your media library are compressed.', 'squeeze'); ?></strong></p>
97 <?php } else { ?>
98 <?php /* translators: %1$d is replaced with number of uncompressed images, %2$d is replaced with number of compressed images */ ?>
99 <p><?php echo sprintf(wp_kses_data('You have <strong>%1$d</strong> uncompressed JPG/PNG/WEBP images from total <strong>%2$d</strong> JPG/PNG/WEBP images in your media library.', 'squeeze'), esc_attr($uncompressed_count), esc_attr($total_count)); ?></p>
100 <input name="squeeze_bulk" class="button button-primary" type="button" value="<?php esc_attr_e( 'Optimise uncompressed images' ); ?>" />
101 <input name="squeeze_bulk_again" class="button button-secondary" type="button" value="<?php esc_attr_e( 'Re-Optimise all images' ); ?>" />
102
103 <p>
104 <label>
105 <?php esc_html_e('Optimise images from custom path', 'squeeze'); ?>:<br>
106 <strong><?php esc_html_e('WARNING! Backup option is NOT applicable here, please backup your images manually before optimising them.', 'squeeze'); ?></strong><br>
107 <input type="text" name="squeeze_bulk_path" value="<?php esc_html_e('/wp-content/uploads/', 'squeeze'); ?>" placeholder="<?php esc_html_e('/wp-content/uploads/', 'squeeze'); ?>" />
108 </label>
109 <input type="button" name="squeeze_bulk_path_button" class="button button-secondary" value="<?php esc_html_e('Optimise images from custom path', 'squeeze'); ?>" />
110 </p>
111
112 <input type="hidden" value="<?php echo wp_kses_data($not_compressed_posts); ?>" name="squeeze_bulk_ids" />
113 <input type="hidden" value="<?php echo wp_kses_data($all_posts); ?>" name="squeeze_bulk_all_ids" />
114 <p><textarea name="squeeze_bulk_log" id="squeeze_bulk_log" cols="100" rows="10" readonly></textarea></p>
115 <?php } ?>
116 </div>
117 <?php
118 }
119
120 /**
121 * Options page callback function
122 */
123 function squeeze_options_page_html() {
124 // check user capabilities
125 if (!current_user_can('manage_options')) {
126 return;
127 }
128 ?>
129 <div class="wrap">
130 <h1>
131 <?php echo esc_html(get_admin_page_title()); ?>
132 </h1>
133 <nav class="nav-tab-wrapper">
134 <a href="#squeeze_basic" class="nav-tab nav-tab-active"><?php esc_html_e('Basic Settings', 'squeeze'); ?></a>
135 <a href="#squeeze_jpeg" class="nav-tab"><?php esc_html_e('JPEG Settings', 'squeeze'); ?></a>
136 <a href="#squeeze_png" class="nav-tab"><?php esc_html_e('PNG Settings', 'squeeze'); ?></a>
137 <a href="#squeeze_webp" class="nav-tab"><?php esc_html_e('WEBP Settings', 'squeeze'); ?></a>
138 <a href="#squeeze_avif" class="nav-tab"><?php esc_html_e('AVIF Settings', 'squeeze'); ?></a>
139 </nav>
140 <div class="tab-content">
141 <form action="options.php" method="post">
142 <?php
143 settings_errors( 'squeeze_notices' );
144 settings_fields( 'squeeze_options' );
145 do_settings_sections( 'squeeze_options' );
146 ?>
147 <?php submit_button(); ?>
148 <!--<input name="submit" class="button button-primary" type="submit" value="<?php esc_attr_e( 'Save' ); ?>" />-->
149 <input name="restore" class="button button-secondary" type="button" value="<?php esc_attr_e( 'Restore defaults' ); ?>" />
150 </form>
151 </div>
152 </div>
153 <script>
154 (function() {
155 const restore = document.querySelector("input[name='restore']")
156 /**
157 * Handle restore defaults button click
158 */
159 restore.addEventListener("click", (event) => {
160 jQuery.ajax({
161 url: squeeze.ajaxUrl,
162 type: 'POST',
163 data: {
164 action: 'squeeze_restore_defaults',
165 _ajax_nonce: squeeze.nonce
166 },
167 beforeSend: function () {
168 restore.disabled = true
169 },
170 error: function (error) {
171 console.error(error)
172 },
173 success: function (response) {
174 console.log(response)
175 let url = new URL(window.location.href);
176 if (response.success) {
177 url.searchParams.append('restore_defaults', true)
178 } else {
179 restore.disabled = false
180 url.searchParams.append('restore_defaults', false)
181 }
182 window.location.replace(url.href)
183 }
184 })
185 })
186
187 /**
188 * jQuery tabs
189 * https://gist.github.com/wesamly/03491ebf53e17c75480b8d2de1bf230c
190 */
191 let tabs;
192 /**
193 * Get Tab Key
194 */
195 function getTabKey(href) {
196 return href.replace('#', '');
197 }
198 /**
199 * Hide all tabs
200 */
201 function hideAllTabs() {
202 tabs.each(function(){
203 var href = getTabKey(jQuery(this).attr('href'));
204 jQuery('#' + href).hide();
205 });
206 }
207 /**
208 * Activate Tab
209 */
210 function activateTab(tab) {
211 let href = getTabKey(tab.attr('href'));
212 tabs.removeClass('nav-tab-active');
213 tab.addClass('nav-tab-active');
214 jQuery('#' + href).show();
215 window.history.pushState({tab: href}, tab.text(), `#${href}`);
216 }
217 window.onpopstate = history.onpushstate = function (e) {
218 const tab = e.state.tab;
219 if (tab) {
220 hideAllTabs();
221 activateTab(jQuery(`a[href="#${tab}"]`));
222 }
223 };
224 jQuery(document).ready(function($){
225 let activeTab, firstTab;
226 // First load, activate first tab or tab with nav-tab-active class
227 firstTab = false;
228 activeTab = false;
229 tabs = $('a.nav-tab');
230 let hash = window.location.hash;
231 hideAllTabs();
232 tabs.each(function(){
233 let href = $(this).attr('href').replace('#', '');
234 if (!firstTab) {
235 firstTab = $(this);
236 }
237 if ($(this).hasClass('nav-tab-active')) {
238 activeTab = $(this);
239 }
240 });
241 if (hash) {
242 activeTab = $('a[href="' + hash + '"]');
243 }
244 if (!activeTab || !activeTab.length) {
245 activeTab = firstTab;
246 }
247 activateTab(activeTab);
248
249 //Click tab
250 tabs.click(function(e) {
251 e.preventDefault();
252 hideAllTabs();
253 activateTab($(this));
254 });
255 });
256
257 })()
258 </script>
259 <?php
260 }
261
262 add_action( 'admin_init', 'squeeze_register_settings' );
263 /**
264 * Register the settings and add the sections and fields
265 */
266 function squeeze_register_settings() {
267 register_setting( 'squeeze_options', 'squeeze_options', 'squeeze_options_validate' );
268
269 add_settings_section( 'squeeze_basic_settings', __('Basic Settings', 'squeeze'), 'squeeze_setting_basic_desc', 'squeeze_options', array( 'before_section' => '<div id="%s">', 'after_section' => '</div>', 'section_class' => 'squeeze_basic' ) );
270
271 add_settings_field( 'squeeze_setting_auto_compress', __('Auto compress', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'auto_compress', 'class' => 'squeeze_setting_auto_compress', 'type' => 'checkbox' ) );
272 //add_settings_field( 'squeeze_setting_auto_compress_original', __('Auto compress original', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'auto_compress_original', 'class' => 'squeeze_setting_auto_compress_original', 'type' => 'checkbox' ) );
273 add_settings_field( 'squeeze_setting_backup_original', __('Backup original image', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'backup_original', 'class' => 'squeeze_setting_backup_original', 'type' => 'checkbox' ) );
274
275 add_settings_section( 'squeeze_jpeg_settings', __('JPEG Settings', 'squeeze'), 'squeeze_setting_jpeg_desc', 'squeeze_options', array( 'before_section' => '<div id="%s">', 'after_section' => '</div>', 'section_class' => 'squeeze_jpeg' ) );
276
277 add_settings_field( 'squeeze_setting_jpeg_quality', __('Quality', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_quality', 'class' => 'squeeze_setting_jpeg_quality', 'type' => 'range' ) );
278 add_settings_field( 'squeeze_setting_jpeg_baseline', __('Pointless spec compliance', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_baseline', 'class' => 'squeeze_setting_jpeg_baseline', 'type' => 'checkbox' ) );
279 add_settings_field( 'squeeze_setting_jpeg_arithmetic', __('Arithmetic', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_arithmetic', 'class' => 'squeeze_setting_jpeg_arithmetic', 'type' => 'checkbox' ) );
280 add_settings_field( 'squeeze_setting_jpeg_progressive', __('Progressive rendering', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_progressive', 'class' => 'squeeze_setting_jpeg_progressive', 'type' => 'checkbox' ) );
281 add_settings_field( 'squeeze_setting_jpeg_optimize_coding', __('Optimize Huffman table', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_optimize_coding', 'class' => 'squeeze_setting_jpeg_optimize_coding', 'type' => 'checkbox' ) );
282 add_settings_field( 'squeeze_setting_jpeg_smoothing', __('Smoothing', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_smoothing', 'class' => 'squeeze_setting_jpeg_smoothing', 'type' => 'range' ) );
283 add_settings_field( 'squeeze_setting_jpeg_color_space', __('Channels', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_color_space', 'class' => 'squeeze_setting_jpeg_color_space', 'type' => 'select', 'options' => array( '3' => 'YCbCr', '1' => 'Grayscale', '2' => 'RGB' ) ) );
284 add_settings_field( 'squeeze_setting_jpeg_quant_table', __('Quantization', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_quant_table', 'class' => 'squeeze_setting_jpeg_quant_table', 'type' => 'select', 'options' => array(
285 '0' => 'JPEG Annex K',
286 '1' => 'Flat',
287 '2' => 'MSSIM-tuned Kodak',
288 '3' => 'ImageMagick',
289 '4' => 'PSNR-HVS-M-tuned Kodak',
290 '5' => 'Klein et al',
291 '6' => 'Watson et al' ,
292 '7' => 'Ahumada et al' ,
293 '8' => 'Peterson et al' ,
294 ) ) );
295 add_settings_field( 'squeeze_setting_jpeg_trellis_multipass', __('Trellis multipass', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_trellis_multipass', 'class' => 'squeeze_setting_jpeg_trellis_multipass', 'type' => 'checkbox' ) );
296 add_settings_field( 'squeeze_setting_jpeg_trellis_opt_zero', __('Optimize zero block runs', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_trellis_opt_zero', 'class' => 'squeeze_setting_jpeg_trellis_opt_zero', 'type' => 'checkbox' ) );
297 add_settings_field( 'squeeze_setting_jpeg_trellis_opt_table', __('Optimize after trellis quantization', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_trellis_opt_table', 'class' => 'squeeze_setting_jpeg_trellis_opt_table', 'type' => 'checkbox' ) );
298 add_settings_field( 'squeeze_setting_jpeg_trellis_loops', __('Trellis quantization passes', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_trellis_loops', 'class' => 'squeeze_setting_jpeg_trellis_loops', 'type' => 'range', 'min' => 1, 'max' => 50 ) );
299 add_settings_field( 'squeeze_setting_jpeg_auto_subsample', __('Auto subsample chroma', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_auto_subsample', 'class' => 'squeeze_setting_jpeg_auto_subsample', 'type' => 'checkbox' ) );
300 add_settings_field( 'squeeze_setting_jpeg_chroma_subsample', __('Subsample chroma by', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_chroma_subsample', 'class' => 'squeeze_setting_jpeg_chroma_subsample', 'type' => 'range', 'min' => 1, 'max' => 4 ) );
301 add_settings_field( 'squeeze_setting_jpeg_separate_chroma_quality', __('Separate chroma quality', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_separate_chroma_quality', 'class' => 'squeeze_setting_jpeg_separate_chroma_quality', 'type' => 'checkbox' ) );
302 add_settings_field( 'squeeze_setting_jpeg_chroma_quality', __('Chroma quality', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_settings', array( 'label_for' => 'jpeg_chroma_quality', 'class' => 'squeeze_setting_jpeg_chroma_quality', 'type' => 'range', ) );
303
304 add_settings_section( 'squeeze_png_settings', __('PNG Settings', 'squeeze'), 'squeeze_setting_png_desc', 'squeeze_options', array( 'before_section' => '<div id="%s">', 'after_section' => '</div>', 'section_class' => 'squeeze_png' ) );
305
306 add_settings_field( 'squeeze_setting_png_level', __('Effort', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_png_settings', array( 'label_for' => 'png_level', 'class' => 'squeeze_setting_png_level', 'type' => 'range', 'min' => 0, 'max' => 3 ) );
307 add_settings_field( 'squeeze_setting_png_interlace', __('Interlace', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_png_settings', array( 'label_for' => 'png_interlace', 'class' => 'squeeze_setting_png_interlace', 'type' => 'checkbox' ) );
308
309 add_settings_section( 'squeeze_webp_settings', __('WEBP Settings', 'squeeze'), 'squeeze_setting_webp_desc', 'squeeze_options', array( 'before_section' => '<div id="%s">', 'after_section' => '</div>', 'section_class' => 'squeeze_webp' ) );
310
311 add_settings_field( 'squeeze_setting_webp_method', __('Effort', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_webp_settings', array( 'label_for' => 'webp_method', 'class' => 'squeeze_setting_webp_method', 'type' => 'range', 'min' => 0, 'max' => 6 ) );
312 add_settings_field( 'squeeze_setting_webp_quality', __('Quality', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_webp_settings', array( 'label_for' => 'webp_quality', 'class' => 'squeeze_setting_webp_quality', 'type' => 'range', 'min' => 0, 'max' => 100 ) );
313 add_settings_field( 'squeeze_setting_webp_lossless', __('Lossless', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_webp_settings', array( 'label_for' => 'webp_lossless', 'class' => 'squeeze_setting_webp_lossless', 'type' => 'checkbox' ) );
314 add_settings_field( 'squeeze_setting_webp_near_lossless', __('Near lossless', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_webp_settings', array( 'label_for' => 'webp_near_lossless', 'class' => 'squeeze_setting_webp_near_lossless', 'type' => 'range', 'min' => 0, 'max' => 100 ) );
315
316 add_settings_section( 'squeeze_avif_settings', __('AVIF Settings', 'squeeze'), 'squeeze_setting_avif_desc', 'squeeze_options', array( 'before_section' => '<div id="%s">', 'after_section' => '</div>', 'section_class' => 'squeeze_avif' ) );
317
318 add_settings_field( 'squeeze_setting_avif_cqLevel', __('Quality', 'squeeze'), 'squeeze_options_callback', 'squeeze_options', 'squeeze_avif_settings', array( 'label_for' => 'avif_cqLevel', 'class' => 'squeeze_setting_avif_cqLevel', 'type' => 'range', 'min' => 1, 'max' => 100 ) );
319
320 }
321
322 /**
323 * Sanitize and validate input. Accepts an array, return a sanitized array.
324 * @param array $input
325 */
326 function squeeze_options_validate( $input ) {
327 $input['jpeg_quality'] = absint($input['jpeg_quality']);
328 $input['jpeg_smoothing'] = absint($input['jpeg_smoothing']);
329 $input['jpeg_color_space'] = absint($input['jpeg_color_space']);
330 $input['jpeg_quant_table'] = absint($input['jpeg_quant_table']);
331 $input['jpeg_trellis_loops'] = absint($input['jpeg_trellis_loops']);
332 $input['jpeg_chroma_subsample'] = absint($input['jpeg_chroma_subsample']);
333 $input['jpeg_chroma_quality'] = absint($input['jpeg_chroma_quality']);
334 $input['png_level'] = absint($input['png_level']);
335 $input['webp_method'] = absint($input['webp_method']);
336 $input['webp_quality'] = absint($input['webp_quality']);
337 $input['webp_near_lossless'] = absint($input['webp_near_lossless']);
338 $input['avif_cqLevel'] = absint($input['avif_cqLevel']);
339
340 $input['jpeg_baseline'] = isset( $input['jpeg_baseline'] ) ? $input['jpeg_baseline'] : '0';
341 $input['jpeg_arithmetic'] = isset( $input['jpeg_arithmetic'] ) ? $input['jpeg_arithmetic'] : '0';
342 $input['jpeg_progressive'] = isset( $input['jpeg_progressive'] ) ? $input['jpeg_progressive'] : '0';
343 $input['jpeg_optimize_coding'] = isset( $input['jpeg_optimize_coding'] ) ? $input['jpeg_optimize_coding'] : '0';
344 $input['jpeg_trellis_multipass'] = isset( $input['jpeg_trellis_multipass'] ) ? $input['jpeg_trellis_multipass'] : '0';
345 $input['jpeg_trellis_opt_zero'] = isset( $input['jpeg_trellis_opt_zero'] ) ? $input['jpeg_trellis_opt_zero'] : '0';
346 $input['jpeg_trellis_opt_table'] = isset( $input['jpeg_trellis_opt_table'] ) ? $input['jpeg_trellis_opt_table'] : '0';
347 $input['jpeg_auto_subsample'] = isset( $input['jpeg_auto_subsample'] ) ? $input['jpeg_auto_subsample'] : '0';
348 $input['jpeg_separate_chroma_quality'] = isset( $input['jpeg_separate_chroma_quality'] ) ? $input['jpeg_separate_chroma_quality'] : '0';
349 $input['png_interlace'] = isset( $input['png_interlace'] ) ? $input['png_interlace'] : '0';
350 $input['webp_lossless'] = isset( $input['webp_lossless'] ) ? $input['webp_lossless'] : '0';
351 $input['auto_compress'] = isset( $input['auto_compress'] ) ? $input['auto_compress'] : '0';
352 //$input['auto_compress_original'] = isset( $input['auto_compress_original'] ) ? $input['auto_compress_original'] : '0';
353 $input['backup_original'] = isset( $input['backup_original'] ) ? $input['backup_original'] : '0';
354
355 add_settings_error( 'squeeze_notices', 'settings_updated', __( 'Settings have been updated.', 'squeeze' ), 'success' );
356
357 return $input;
358 }
359
360 /**
361 * Display and fill the form field
362 * @param array $args
363 */
364 function squeeze_options_callback( $args ) {
365 $label_for = $args['label_for'];
366 $class = $args['class'];
367 $type = $args['type'];
368 $default = squeeze_get_default_value($label_for);
369 $options = get_option( 'squeeze_options' );
370
371 switch ($type) {
372 case 'text':
373 $value = isset($options[$label_for]) ? $options[$label_for] : $default;
374 echo "<input id='squeeze_setting_".esc_attr($label_for)."' name='squeeze_options[".esc_attr($label_for)."]' type='text' value='" . esc_attr( $value ) . "' />";
375 break;
376 case 'range':
377 $value = isset($options[$label_for]) ? $options[$label_for] : $default;
378 $min = isset($args['min']) ? $args['min'] : 0;
379 $max = isset($args['max']) ? $args['max'] : 100;
380 $step = isset($args['step']) ? $args['step'] : 1;
381 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 ) . "' />";
382 echo '<output id="squeeze_setting_'.esc_attr($label_for).'_value"></output>';
383 ?>
384 <script>
385 (function () {
386 const value = document.querySelector("#squeeze_setting_<?php echo esc_attr($label_for); ?>_value")
387 const input = document.querySelector("#squeeze_setting_<?php echo esc_attr($label_for); ?>")
388 value.textContent = input.value
389 input.addEventListener("input", (event) => {
390 value.textContent = event.target.value
391 })
392 })()
393 </script>
394 <?php
395 break;
396 case 'checkbox':
397 $value = isset($options[$label_for]) ? (bool) $options[$label_for] : $default;
398 echo "<input id='squeeze_setting_".esc_attr($label_for)."' name='squeeze_options[".esc_attr($label_for)."]' type='checkbox' ".checked( $value, true, false )." />";
399 break;
400 case 'select':
401 $value = isset($options[$label_for]) ? $options[$label_for] : $default;
402 echo "<select id='squeeze_setting_".esc_attr($label_for)."' name='squeeze_options[".esc_attr($label_for)."]'>";
403 foreach ($args['options'] as $key => $option) {
404 echo "<option value='".esc_attr($key)."' ".selected( $value, $key, false ).">".esc_html($option)."</option>";
405 }
406 echo "</select>";
407 break;
408 }
409 }
410
411 /**
412 * Get default value for option
413 * @param string $option
414 * @param bool $all
415 */
416 function squeeze_get_default_value ( $option, $all = false ) {
417 $options_defaults = apply_filters('squeeze_options_default',
418 array(
419 // JPEG settings
420 'jpeg_quality' => 75,
421 'jpeg_baseline' => false,
422 'jpeg_arithmetic' => false,
423 'jpeg_progressive' => true,
424 'jpeg_optimize_coding' => true,
425 'jpeg_smoothing' => 0,
426 'jpeg_color_space' => 3,
427 'jpeg_quant_table' => 3,
428 'jpeg_trellis_multipass' => false,
429 'jpeg_trellis_opt_zero' => false,
430 'jpeg_trellis_opt_table' => false,
431 'jpeg_trellis_loops' => 1,
432 'jpeg_auto_subsample' => true,
433 'jpeg_chroma_subsample' => 2,
434 'jpeg_separate_chroma_quality' => false,
435 'jpeg_chroma_quality' => 75,
436
437 // PNG settings
438 'png_level' => 2,
439 'png_interlace' => false,
440
441 // WEBP settings
442 'webp_method' => 4,
443 'webp_quality' => 75,
444 'webp_lossless' => false,
445 'webp_near_lossless' => 100,
446
447 // AVIF settings
448 'avif_cqLevel' => 30,
449
450
451 // General settings
452 'auto_compress' => true,
453 //'auto_compress_original' => false,
454 'backup_original' => true,
455 )
456 );
457 if ($all) {
458 return $options_defaults;
459 }
460 return in_array($option, array_keys($options_defaults)) ? $options_defaults[$option] : false;
461 }
462
463 function squeeze_setting_basic_desc() {
464 echo '<p>'.esc_html__('Basic options', 'squeeze').'</p>';
465 }
466 function squeeze_setting_jpeg_desc() {
467 echo '<p>'.esc_html__('Compress settings for JPEG images using MozJPEG encoder', 'squeeze').'</p>';
468 }
469 function squeeze_setting_png_desc() {
470 echo '<p>'.esc_html__('Compress settings for PNG images using OxiPNG encoder', 'squeeze').'</p>';
471 }
472 function squeeze_setting_webp_desc() {
473 echo '<p>'.esc_html__('Compress settings for WEBP images using WebP encoder', 'squeeze').'</p>';
474 }
475
476 function squeeze_setting_avif_desc() {
477 echo '<p>'.esc_html__('Compress settings for AVIF images using AVIF encoder', 'squeeze').'</p>';
478 }
479
480 add_action('wp_ajax_squeeze_restore_defaults', 'squeeze_restore_defaults');
481 /**
482 * Restore default settings
483 */
484 function squeeze_restore_defaults() {
485 check_ajax_referer( 'squeeze-nonce', '_ajax_nonce' );
486 if (get_option('squeeze_options')) {
487 $result = delete_option('squeeze_options', "");
488 if (!$result) {
489 wp_send_json_error($result);
490 }
491 wp_send_json_success($result);
492 }
493 wp_send_json_success(true);
494 }
495
496 add_action( 'admin_init', 'squeeze_add_notices' );
497 /**
498 * Add custom admin notices
499 */
500 function squeeze_add_notices() {
501 global $pagenow;
502
503 if ( is_admin() && $pagenow === "upload.php" && isset($_GET['page']) && $_GET['page'] === "squeeze" && isset($_GET['restore_defaults']) && !isset($_GET['settings-updated']) ) {
504 add_settings_error( 'squeeze_notices', 'settings_restored', __( 'Settings have been restored.', 'squeeze' ), 'success' );
505 }
506
507 }
508
509 add_filter('attachment_fields_to_edit', 'squeeze_add_custom_field_to_attachment', 10, 2);
510 /**
511 * Add custom text/textarea attachment field
512 */
513 function squeeze_add_custom_field_to_attachment( $form_fields, $post ) {
514 $allowed_mimes = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES;
515 if ( in_array( $post->post_mime_type, $allowed_mimes ) ) {
516 $is_compressed = get_post_meta($post->ID, 'squeeze_is_compressed', true);
517 $can_restore = squeeze_can_restore($post->ID);
518 $form_fields['squeeze_is_compressed'] = array(
519 'label' => __('Squeeze', 'squeeze'),
520 'input' => 'html',
521 'html' => ($is_compressed ?
522 '<label><span class="squeeze_status"><span style="padding-top: 0; line-height: 1; color: green;" class="dashicons dashicons-yes-alt"></span>&nbsp;' . __('Compressed', 'squeeze') . '</span></label>' . ($can_restore ? '
523 <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>
524 <button name="squeeze_compress_again" type="button" class="button button-primary squeeze-compress-button" data-attachment="' . $post->ID . '">' . __('Compress again', 'squeeze') . '</button></p>'
525 :
526 '<label><span class="squeeze_status"><span style="padding-top: 0; line-height: 1; color: red;" class="dashicons dashicons-no-alt"></span>&nbsp;' . __('Not compressed', 'squeeze') . '</span></label>
527 <br><br><button name="squeeze_compress_single" type="button" class="button button-primary squeeze-compress-button" data-attachment="' . $post->ID . '">' . __('Compress', 'squeeze') . '</button>'
528 )
529 );
530 }
531 return $form_fields;
532 }
533
534 add_filter( 'manage_media_columns', 'squeeze_add_media_columns' );
535 /**
536 * Filter the Media list table columns to add a Squeeze column.
537 *
538 * @param array $posts_columns Existing array of columns displayed in the Media list table.
539 * @return array Amended array of columns to be displayed in the Media list table.
540 */
541 function squeeze_add_media_columns( $posts_columns ) {
542 $posts_columns['squeeze'] = __( 'Squeeze', 'squeeze' );
543
544 return $posts_columns;
545 }
546
547 add_action( 'manage_media_custom_column', 'squeeze_media_custom_column', 10, 2 );
548 /**
549 * Display attachment uploaded time under `Time` custom column in the Media list table.
550 *
551 * @param string $column_name Name of the custom column.
552 */
553 function squeeze_media_custom_column( $column_name, $post_id ) {
554 if ( 'squeeze' !== $column_name ) {
555 return;
556 }
557
558 $form_fields = squeeze_add_custom_field_to_attachment( array(), get_post( $post_id ) );
559
560 if ($form_fields)
561 echo wp_kses_post($form_fields['squeeze_is_compressed']['html']);
562
563 }
564