0 ? round( $compressed_count / $total_count * 100, 2 ) : 0 ); $dasharray = $compressed_percentage * 560 / 100; //$total_count = array_sum((array)wp_count_attachments("image")); $not_compressed_posts = implode( ",", squeeze_get_uncompressed_images() ); $all_posts = implode( ",", squeeze_get_total_images() ); $directory_path = ( get_transient( 'squeeze_bulk_path' ) ? get_transient( 'squeeze_bulk_path' ) : array('/wp-content/uploads/') ); $directory_path_json = wp_json_encode( $directory_path ); ?>

%
/

'squeeze_basic', ) ); add_settings_field( 'squeeze_setting_auto_compress', __( 'Squeeze on upload', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'auto_compress', 'class' => 'squeeze_setting_auto_compress', 'type' => 'checkbox', ) ); 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', ) ); add_settings_field( 'squeeze_setting_auto_webp', __( 'Generate WEBP', 'squeeze' ) . squeeze_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' ) ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'auto_webp', 'class' => 'squeeze_setting_auto_webp', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_webp_replace_urls', __( 'Replace images URLs', 'squeeze' ) . squeeze_get_hint( __( 'Replace original URLs of images with the related WEBP images.', 'squeeze' ) ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'webp_replace_urls', 'class' => 'squeeze_setting_webp_replace_urls', 'type' => 'checkbox', 'hidden' => ( $options['auto_webp'] ? '' : true ), ) ); add_settings_field( 'squeeze_setting_compress_thumbs', __( 'Squeeze thumbnails', 'squeeze' ) . squeeze_get_hint( __( 'Choose which image thumbnail sizes you want to squeeze along with the original image.', 'squeeze' ) ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'compress_thumbs', 'class' => 'squeeze_setting_compress_thumbs', 'type' => 'thumbs_checkbox_group', ) ); add_settings_field( 'squeeze_setting_timeout', __( 'Squeeze timeout', 'squeeze' ) . squeeze_get_hint( __( 'Time limit for squeezing an image. If you get an error during image squeezing, try to increase this value.', 'squeeze' ) ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'timeout', 'class' => 'squeeze_setting_timeout', 'type' => 'number', 'units' => 'sec', 'min' => 1, ) ); add_settings_field( 'squeeze_setting_restore_defaults', '', 'squeeze_options_callback', 'squeeze_options', 'squeeze_basic_settings', array( 'label_for' => 'restore_defaults', 'class' => 'squeeze_setting_restore_defaults', 'type' => 'hidden', ) ); add_settings_section( 'squeeze_jpeg_settings', __( 'JPEG Settings', 'squeeze' ), 'squeeze_setting_jpeg_desc', 'squeeze_options', array( 'section_class' => 'squeeze_jpeg', ) ); 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', ) ); 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', ) ); add_settings_field( 'squeeze_setting_jpeg_baseline', __( 'Pointless spec compliance', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_baseline', 'class' => 'squeeze_setting_jpeg_baseline', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_arithmetic', __( 'Arithmetic', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_arithmetic', 'class' => 'squeeze_setting_jpeg_arithmetic', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_progressive', __( 'Progressive rendering', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_progressive', 'class' => 'squeeze_setting_jpeg_progressive', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_optimize_coding', __( 'Optimize Huffman table', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_optimize_coding', 'class' => 'squeeze_setting_jpeg_optimize_coding', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_color_space', __( 'Channels', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_color_space', 'class' => 'squeeze_setting_jpeg_color_space', 'type' => 'select', 'options' => array( '3' => 'YCbCr', '1' => 'Grayscale', '2' => 'RGB', ), ) ); add_settings_field( 'squeeze_setting_jpeg_quant_table', __( 'Quantization', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_quant_table', 'class' => 'squeeze_setting_jpeg_quant_table', 'type' => 'select', 'options' => array( '0' => 'JPEG Annex K', '1' => 'Flat', '2' => 'MSSIM-tuned Kodak', '3' => 'ImageMagick', '4' => 'PSNR-HVS-M-tuned Kodak', '5' => 'Klein et al', '6' => 'Watson et al', '7' => 'Ahumada et al', '8' => 'Peterson et al', ), ) ); add_settings_field( 'squeeze_setting_jpeg_trellis_multipass', __( 'Trellis multipass', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_trellis_multipass', 'class' => 'squeeze_setting_jpeg_trellis_multipass', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_trellis_opt_zero', __( 'Optimize zero block runs', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_trellis_opt_zero', 'class' => 'squeeze_setting_jpeg_trellis_opt_zero', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_trellis_opt_table', __( 'Optimize after trellis quantization', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_trellis_opt_table', 'class' => 'squeeze_setting_jpeg_trellis_opt_table', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_trellis_loops', __( 'Trellis quantization passes', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_trellis_loops', 'class' => 'squeeze_setting_jpeg_trellis_loops', 'type' => 'range', 'min' => 1, 'max' => 50, ) ); add_settings_field( 'squeeze_setting_jpeg_auto_subsample', __( 'Auto subsample chroma', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_auto_subsample', 'class' => 'squeeze_setting_jpeg_auto_subsample', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_chroma_subsample', __( 'Subsample chroma by', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_chroma_subsample', 'class' => 'squeeze_setting_jpeg_chroma_subsample', 'type' => 'range', 'min' => 1, 'max' => 4, ) ); add_settings_field( 'squeeze_setting_jpeg_separate_chroma_quality', __( 'Separate chroma quality', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_separate_chroma_quality', 'class' => 'squeeze_setting_jpeg_separate_chroma_quality', 'type' => 'checkbox', ) ); add_settings_field( 'squeeze_setting_jpeg_chroma_quality', __( 'Chroma quality', 'squeeze' ), 'squeeze_options_callback', 'squeeze_options', 'squeeze_jpeg_advanced_settings', array( 'label_for' => 'jpeg_chroma_quality', 'class' => 'squeeze_setting_jpeg_chroma_quality', 'type' => 'range', ) ); add_settings_section( 'squeeze_png_settings', __( 'PNG Settings', 'squeeze' ), 'squeeze_setting_png_desc', 'squeeze_options', array( 'section_class' => 'squeeze_png', ) ); 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, ) ); 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', ) ); add_settings_section( 'squeeze_webp_settings', __( 'WEBP Settings', 'squeeze' ), 'squeeze_setting_webp_desc', 'squeeze_options', array( 'section_class' => 'squeeze_webp', ) ); 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, ) ); 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, ) ); 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', ) ); 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, ) ); add_settings_section( 'squeeze_avif_settings', __( 'AVIF Settings', 'squeeze' ), 'squeeze_setting_avif_desc', 'squeeze_options', array( 'section_class' => 'squeeze_avif', ) ); 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, ) ); } function squeeze_get_hint( $hint, $class = 'squeeze-hint' ) { return '' . esc_html( $hint ) . ''; } /** * Sanitize and validate input. Accepts an array, return a sanitized array. * @param array $input */ function squeeze_options_validate( $input ) { $input['jpeg_quality'] = absint( $input['jpeg_quality'] ); $input['jpeg_smoothing'] = absint( $input['jpeg_smoothing'] ); $input['jpeg_color_space'] = absint( $input['jpeg_color_space'] ); $input['jpeg_quant_table'] = absint( $input['jpeg_quant_table'] ); $input['jpeg_trellis_loops'] = absint( $input['jpeg_trellis_loops'] ); $input['jpeg_chroma_subsample'] = absint( $input['jpeg_chroma_subsample'] ); $input['jpeg_chroma_quality'] = absint( $input['jpeg_chroma_quality'] ); $input['png_level'] = absint( $input['png_level'] ); $input['webp_method'] = absint( $input['webp_method'] ); $input['webp_quality'] = absint( $input['webp_quality'] ); $input['webp_near_lossless'] = absint( $input['webp_near_lossless'] ); $input['avif_cqLevel'] = absint( $input['avif_cqLevel'] ); $input['jpeg_baseline'] = ( isset( $input['jpeg_baseline'] ) ? $input['jpeg_baseline'] : '0' ); $input['jpeg_arithmetic'] = ( isset( $input['jpeg_arithmetic'] ) ? $input['jpeg_arithmetic'] : '0' ); $input['jpeg_progressive'] = ( isset( $input['jpeg_progressive'] ) ? $input['jpeg_progressive'] : '0' ); $input['jpeg_optimize_coding'] = ( isset( $input['jpeg_optimize_coding'] ) ? $input['jpeg_optimize_coding'] : '0' ); $input['jpeg_trellis_multipass'] = ( isset( $input['jpeg_trellis_multipass'] ) ? $input['jpeg_trellis_multipass'] : '0' ); $input['jpeg_trellis_opt_zero'] = ( isset( $input['jpeg_trellis_opt_zero'] ) ? $input['jpeg_trellis_opt_zero'] : '0' ); $input['jpeg_trellis_opt_table'] = ( isset( $input['jpeg_trellis_opt_table'] ) ? $input['jpeg_trellis_opt_table'] : '0' ); $input['jpeg_auto_subsample'] = ( isset( $input['jpeg_auto_subsample'] ) ? $input['jpeg_auto_subsample'] : '0' ); $input['jpeg_separate_chroma_quality'] = ( isset( $input['jpeg_separate_chroma_quality'] ) ? $input['jpeg_separate_chroma_quality'] : '0' ); $input['png_interlace'] = ( isset( $input['png_interlace'] ) ? $input['png_interlace'] : '0' ); $input['webp_lossless'] = ( isset( $input['webp_lossless'] ) ? $input['webp_lossless'] : '0' ); $input['auto_compress'] = ( isset( $input['auto_compress'] ) ? $input['auto_compress'] : '0' ); $input['auto_webp'] = ( isset( $input['auto_webp'] ) ? $input['auto_webp'] : '0' ); $input['webp_replace_urls'] = ( isset( $input['webp_replace_urls'] ) && $input['auto_webp'] ? $input['webp_replace_urls'] : '0' ); $input['backup_original'] = ( isset( $input['backup_original'] ) ? $input['backup_original'] : '0' ); $input['compress_thumbs'] = ( isset( $input['compress_thumbs'] ) ? $input['compress_thumbs'] : array() ); $input['max_width'] = ( isset( $input['max_width'] ) && $input['max_width'] > 0 ? absint( $input['max_width'] ) : '' ); $input['max_height'] = ( isset( $input['max_height'] ) && $input['max_height'] > 0 ? absint( $input['max_height'] ) : '' ); $input['timeout'] = ( isset( $input['timeout'] ) && $input['timeout'] > 0 ? absint( $input['timeout'] ) : 1 ); $input['restore_defaults'] = ( isset( $input['restore_defaults'] ) ? $input['restore_defaults'] : '0' ); if ( !isset( $input['restore_defaults'] ) || $input['restore_defaults'] !== '1' ) { add_settings_error( 'squeeze_notices', 'settings_updated', __( 'Settings have been updated.', 'squeeze' ), 'success' ); } return $input; } /** * Display and fill the form field * @param array $args */ function squeeze_options_callback( $args ) { $label_for = $args['label_for']; $class = $args['class']; $type = $args['type']; $default = squeeze_get_default_value( $label_for ); $options = get_option( 'squeeze_options' ); $is_hidden = ( isset( $args['hidden'] ) && $args['hidden'] ? 'hidden' : '' ); $extra_classes = []; if ( $is_hidden ) { $extra_classes[] = 'squeeze-hidden'; } $extra_classes = implode( ' ', $extra_classes ); switch ( $type ) { case 'text': $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default ); echo ""; break; case 'number': $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default ); $units = ( isset( $args['units'] ) ? $args['units'] : '' ); $min = ( isset( $args['min'] ) ? $args['min'] : '' ); $max = ( isset( $args['max'] ) ? $args['max'] : '' ); echo ""; if ( $units ) { echo "" . esc_html( $units ) . ""; } break; case 'range': $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default ); $min = ( isset( $args['min'] ) ? $args['min'] : 0 ); $max = ( isset( $args['max'] ) ? $args['max'] : 100 ); $step = ( isset( $args['step'] ) ? $args['step'] : 1 ); echo ""; echo ''; ?> "; echo ''; break; case 'select': $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default ); echo ""; break; case 'thumbs_checkbox_group': $thumbs = array(); $value = ( isset( $options[$label_for] ) ? (array) $options[$label_for] : $default ); $available_sizes = wp_get_registered_image_subsizes(); foreach ( $available_sizes as $key => $size ) { $thumbs[$key] = ucwords( str_replace( '_', ' ', $key ) ) . ' (' . $size['width'] . 'x' . $size['height'] . ')'; } // Add the scaled image size option $big_image_size_threshold = apply_filters( 'big_image_size_threshold', 2560 ); $thumbs['full'] = 'Scaled (' . $big_image_size_threshold . 'x' . $big_image_size_threshold . ')'; echo '
'; echo '
'; foreach ( $thumbs as $key => $option ) { echo '
'; echo " "; echo ""; echo '
'; } echo '
'; echo '
'; break; case 'hidden': $value = ( isset( $options[$label_for] ) ? $options[$label_for] : $default ); echo ""; break; } } /** * Get default value for option * @param string $option * @param bool $all */ function squeeze_get_default_value( $option, $all = false ) { $options_defaults = apply_filters( 'squeeze_options_default', array( 'jpeg_quality' => 75, 'jpeg_baseline' => false, 'jpeg_arithmetic' => false, 'jpeg_progressive' => true, 'jpeg_optimize_coding' => true, 'jpeg_smoothing' => 0, 'jpeg_color_space' => 3, 'jpeg_quant_table' => 3, 'jpeg_trellis_multipass' => false, 'jpeg_trellis_opt_zero' => false, 'jpeg_trellis_opt_table' => false, 'jpeg_trellis_loops' => 1, 'jpeg_auto_subsample' => true, 'jpeg_chroma_subsample' => 2, 'jpeg_separate_chroma_quality' => false, 'jpeg_chroma_quality' => 75, 'png_level' => 2, 'png_interlace' => false, 'webp_method' => 4, 'webp_quality' => 75, 'webp_lossless' => false, 'webp_near_lossless' => 100, 'avif_cqLevel' => 70, 'auto_compress' => true, 'auto_webp' => true, 'webp_replace_urls' => false, 'backup_original' => true, 'compress_thumbs' => array( 'large' => 'on', 'full' => 'on', ), 'max_width' => '', 'max_height' => '', 'timeout' => 60, 'restore_defaults' => false, ) ); if ( $all ) { return $options_defaults; } return ( in_array( $option, array_keys( $options_defaults ) ) ? $options_defaults[$option] : false ); } function squeeze_setting_basic_desc() { echo '

' . esc_html__( 'Basic squeezing settings.', 'squeeze' ) . '

'; } function squeeze_setting_jpeg_desc() { echo '

' . esc_html__( 'Squeezing settings for JPEG images.', 'squeeze' ) . '

'; } function squeeze_setting_jpeg_advanced_desc() { echo '

' . esc_html__( 'More precise settings for experienced users.', 'squeeze' ) . '

'; } function squeeze_setting_png_desc() { echo '

' . esc_html__( 'Squeezing settings for PNG images.', 'squeeze' ) . '

'; } function squeeze_setting_webp_desc() { echo '

' . esc_html__( 'Squeezing settings for WebP images.', 'squeeze' ) . '

'; } function squeeze_setting_avif_desc() { echo '

' . esc_html__( 'Squeezing settings for Avif images.', 'squeeze' ) . '

'; } add_action( 'update_option_squeeze_options', 'squeeze_restore_defaults', 10, 2 ); /** * Restore default settings */ function squeeze_restore_defaults( $old_value, $value ) { if ( isset( $value['restore_defaults'] ) && $value['restore_defaults'] === '1' ) { $result = delete_option( 'squeeze_options', "" ); if ( $result ) { add_settings_error( 'squeeze_notices', 'settings_restored', __( 'Settings have been restored.', 'squeeze' ), 'success' ); } else { add_settings_error( 'squeeze_notices', 'settings_not_restored', __( 'Settings have not been restored.', 'squeeze' ), 'error' ); } } } add_filter( 'attachment_fields_to_edit', 'squeeze_add_custom_field_to_attachment', 10, 2 ); /** * Add custom text/textarea attachment field */ function squeeze_add_custom_field_to_attachment( $form_fields, $post ) { $allowed_mimes = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES; if ( in_array( $post->post_mime_type, $allowed_mimes ) ) { $is_compressed = get_post_meta( $post->ID, 'squeeze_is_compressed', true ); $can_restore = squeeze_can_restore( $post->ID ); $form_fields['squeeze_is_compressed'] = array( 'label' => __( 'Squeeze', 'squeeze' ), 'input' => 'html', 'html' => ( $is_compressed ? '' . (( $can_restore ? '

' : '' )) . '

' : '

' ), ); } return $form_fields; } add_filter( 'manage_media_columns', 'squeeze_add_media_columns' ); /** * Filter the Media list table columns to add a Squeeze column. * * @param array $posts_columns Existing array of columns displayed in the Media list table. * @return array Amended array of columns to be displayed in the Media list table. */ function squeeze_add_media_columns( $posts_columns ) { $posts_columns['squeeze'] = __( 'Squeeze', 'squeeze' ); return $posts_columns; } add_action( 'manage_media_custom_column', 'squeeze_media_custom_column', 10, 2 ); /** * Display attachment uploaded time under `Time` custom column in the Media list table. * * @param string $column_name Name of the custom column. */ function squeeze_media_custom_column( $column_name, $post_id ) { if ( 'squeeze' !== $column_name ) { return; } $form_fields = squeeze_add_custom_field_to_attachment( array(), get_post( $post_id ) ); if ( $form_fields ) { echo wp_kses_post( $form_fields['squeeze_is_compressed']['html'] ); } } add_filter( 'manage_upload_sortable_columns', 'squeeze_sortable_columns' ); /** * Add sortable Squeeze column */ function squeeze_sortable_columns( $columns ) { $columns['squeeze'] = 'squeeze'; return $columns; } add_action( 'pre_get_posts', 'squeeze_sortable_columns_orderby' ); /** * Order by Squeeze column */ function squeeze_sortable_columns_orderby( $query ) { if ( !is_admin() || !$query->is_main_query() ) { return; } $orderby = $query->get( 'orderby' ); if ( 'squeeze' === $orderby ) { // Define the allowed image formats $allowed_formats = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES; // include all media $query->set( 'meta_query', array( 'relation' => 'OR', array( 'key' => 'squeeze_is_compressed', 'compare' => 'NOT EXISTS', ), array( 'key' => 'squeeze_is_compressed', 'compare' => 'EXISTS', ), ) ); // Add the meta_query to filter by specific image formats //$query->set('post_mime_type', $allowed_formats); $query->set( 'orderby', 'meta_value' ); } } add_action( 'restrict_manage_posts', 'squeeze_media_filter_dropdown' ); /** * Add a dropdown filter to the media library */ function squeeze_media_filter_dropdown() { global $wp_query; $post_type = 'attachment'; if ( isset( $_GET['post_type'] ) ) { $post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); } if ( 'attachment' === $post_type ) { $selected = ( isset( $_GET['squeeze_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['squeeze_filter'] ) ) : '' ); $options = array( 'all' => __( 'Squeeze: All images', 'squeeze' ), 'non-squeezed' => __( 'Non Squeezed Images', 'squeeze' ), ); echo ''; } } add_action( 'pre_get_posts', 'squeeze_media_filter_query' ); /** * Filter the media library query */ function squeeze_media_filter_query( $query ) { global $current_screen; if ( !is_admin() || !empty( $current_screen ) && 'upload' !== $current_screen->base || 'attachment' !== $query->get( 'post_type' ) ) { return $query; } if ( isset( $_GET['squeeze_filter'] ) ) { $squeeze_filter = sanitize_text_field( wp_unslash( $_GET['squeeze_filter'] ) ); if ( 'non-squeezed' === $squeeze_filter ) { $query->set( 'meta_query', array( 'relation' => 'OR', array( 'key' => 'squeeze_is_compressed', 'compare' => '!=', 'value' => '1', ), array( 'key' => 'squeeze_is_compressed', 'compare' => 'NOT EXISTS', ), ) ); $query->set( 'orderby', 'meta_value' ); $query->set( 'post_mime_type', SQUEEZE_ALLOWED_IMAGE_MIME_TYPES ); } } return $query; } add_filter( 'ajax_query_attachments_args', 'squeeze_media_filter_ajax_query', 10, 1 ); /** * Filter the media library query for AJAX requests */ function squeeze_media_filter_ajax_query( $query ) { if ( !isset( $_POST['query']['squeeze_filter'] ) ) { return $query; } $squeeze_filter = sanitize_text_field( wp_unslash( $_POST['query']['squeeze_filter'] ) ); if ( 'non-squeezed' === $squeeze_filter ) { $query['meta_query'] = array( 'relation' => 'OR', array( 'key' => 'squeeze_is_compressed', 'compare' => '!=', 'value' => '1', ), array( 'key' => 'squeeze_is_compressed', 'compare' => 'NOT EXISTS', ), ); $query['orderby'] = 'meta_value'; $query['post_mime_type'] = SQUEEZE_ALLOWED_IMAGE_MIME_TYPES; } return $query; } add_action( 'admin_footer', 'squeeze_svg_sprite_output' ); /** * Output SVG sprite */ function squeeze_svg_sprite_output() { global $pagenow; if ( $pagenow === 'upload.php' && isset( $_GET['page'] ) && $_GET['page'] === 'squeeze-bulk' ) { include SQUEEZE_PLUGIN_DIR . 'assets/images/sprite.svg'; } }