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

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