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

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