' . __FUNCTION__ . '()' ); if ( ! empty( $_POST['ewww_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['ewww_nonce'] ), 'ewww_image_optimizer_clear_queue' ) && ! empty( $_POST['action'] ) && 'ewww_image_optimizer_clear_queue' === $_POST['action'] && current_user_can( 'manage_options' ) ) { ewwwio()->background_media->cancel_process(); ewwwio()->background_image->cancel_process(); update_option( 'ewwwio_stop_scheduled_scan', true, false ); } echo "
" . /* translators: %s: number of images */ sprintf( esc_html__( 'The plugin keeps track of already optimized images to prevent re-optimization. There are %s images that have been optimized so far.', 'ewww-image-optimizer' ), esc_html( number_format_i18n( $already_optimized ) ) ) . "
\n"; echo "\n"; ewwwio_table_nav_controls(); echo ''; ewwwio_table_nav_controls(); echo "\n" . sprintf( esc_html__( 'Current queue status: %s', 'ewww-image-optimizer' ), esc_html( $queue_status ) ) . "
\n";
if ( $queue_count ) {
/* translators: %d: number of images */
echo sprintf( esc_html__( 'There are %d images in the queue currently.', 'ewww-image-optimizer' ), (int) $queue_count ) . "
" . esc_html__( 'The optimization history prevents the plugin from re-optimizing images, but you may erase the history to reduce database size or to force the plugin to re-optimize all images.', 'ewww-image-optimizer' ); echo "
\n"; echo "\n";
if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_backup_files' ) ) {
/* translators: %s: 'cloud' or 'local', translated separately */
printf( esc_html__( 'Restore all your images from %s backups in case of image corruption or degraded quality.', 'ewww-image-optimizer' ), esc_html( $backup_mode ) );
if ( ! get_option( 'ewww_image_optimizer_bulk_restore_position' ) ) {
echo '
';
esc_html_e( '*As such things are quite rare, it is highly recommended to contact support first, as this may be due to a plugin conflict.', 'ewww-image-optimizer' );
}
} else {
esc_html_e( 'Backups are currently disabled in the Local settings.', 'ewww-image-optimizer' );
}
echo "
- '>
\n"; echo ""; echo ""; echo ""; echo '" . esc_html__( 'When WordPress scales down large images, it keeps the original on disk for thumbnail generation. You may delete them to save disk space.', 'ewww-image-optimizer' ) . "
\n"; echo "\n" .
esc_html__( 'If you have converted images (PNG to JPG and friends) without deleting the originals, you may remove them when ready.', 'ewww-image-optimizer' ) . "
\n" .
'' . esc_html__( 'Please perform a site backup before proceeding.', 'ewww-image-optimizer' ) . "
" . esc_html__( 'You may remove all the WebP images from your site if you no longer need them. For example, sites that use Easy IO do not need local WebP images.', 'ewww-image-optimizer' ) . "
\n"; echo "\n"; if ( get_option( 'ewww_image_optimizer_webp_clean_position' ) ) { ?>- '>
\n"; echo ""; echo ""; $as3cf_remove = false; if ( class_exists( 'Amazon_S3_And_CloudFront' ) ) { global $as3cf; if ( $as3cf->get_setting( 'serve-from-s3' ) && $as3cf->get_setting( 'remove-local-file' ) ) { $as3cf_remove = true; } } if ( ! ewww_image_optimizer_s3_uploads_enabled() && ! function_exists( 'ud_get_stateless_media' ) && ! $as3cf_remove ) { echo '" .
esc_html__( 'Older sites may have duplicate records or references to deleted files. Use the cleanup tool to remove such records.', 'ewww-image-optimizer' ) . '
' .
'' . esc_html__( 'If you offload your media to external storage like Amazon S3, and remove the local files, do not run this tool.', 'ewww-image-optimizer' ) . "
" . /* translators: 1: postmeta table name 2: ewwwio_images table name */ esc_html( sprintf( __( 'Sites using EWWW IO for 3+ years may have optimization data that still needs to be migrated between the %1$s and %2$s tables.', 'ewww-image-optimizer' ), $wpdb->postmeta, $wpdb->ewwwio_images ) ) . "
\n"; echo "\n" . esc_html__( 'Some plugins have bugs that cause them to re-create thumbnails and trigger re-optimization when the images are modified. Turn on the Debugging option to record trace logs for further investigation.', 'ewww-image-optimizer' ) . "
\n"; echo "\n"; echo "' . esc_html__( 'Restoring', 'ewww-image-optimizer' ) . "
' . esc_html__( 'Finished', 'ewww-image-optimizer' ) . '
', 'stage1' => esc_html__( 'Stage 1:', 'ewww-image-optimizer' ), 'stage2' => esc_html__( 'Stage 2:', 'ewww-image-optimizer' ), /* translators: used for Table Cleanup progress bar, like so: batch 32/346 */ 'batch' => esc_html__( 'batch', 'ewww-image-optimizer' ), 'erase_warning' => $erase_warning, 'tool_warning' => esc_html__( 'Please be sure to backup your site before proceeding. Do you wish to continue?', 'ewww-image-optimizer' ), 'too_far' => esc_html__( 'More images have been processed than expected. Unless you have added new images, you should refresh the page to stop the process and contact support.', 'ewww-image-optimizer' ), 'restorable_images' => $restorable_images, 'webp_cleanable' => $webp_cleanable, ) ); // Load the stylesheet for the jquery progressbar. wp_enqueue_style( 'jquery-ui-progressbar', plugins_url( '/includes/jquery-ui-1.10.1.custom.css', __FILE__ ) ); ewwwio_memory( __FUNCTION__ ); } /** * Presents the bulk optimize form. */ function ewww_image_optimizer_bulk_preview() { ewwwio_debug_message( '' . __FUNCTION__ . '()' ); ewwwio_debug_version_info(); // Retrieve the attachment IDs that were pre-loaded in the database. echo ''; esc_html_e( 'Please disable Scheduled optimization before continuing.', 'ewww-image-optimizer' ); echo '
' . esc_html__( 'You do not appear to have uploaded any images yet.', 'ewww-image-optimizer' ) . '
'; } else { if ( 'true' === $resume ) { echo '' . esc_html__( 'Resume where you left off:', 'ewww-image-optimizer' ) . '
'; } else { $resizes = ewww_image_optimizer_get_image_sizes(); if ( is_array( $resizes ) ) { $resize_count = count( $resizes ); } $resize_count = ( ! empty( $resize_count ) && $resize_count > 1 ? $resize_count : 6 ); if ( ! empty( $_REQUEST['ids'] ) && ( preg_match( '/^[\d,]+$/', sanitize_text_field( wp_unslash( $_REQUEST['ids'] ) ) ) || is_numeric( sanitize_text_field( wp_unslash( $_REQUEST['ids'] ) ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification echo '' . /* translators: 1: number of images 2: number of registered image sizes */ esc_html( sprintf( _n( '%1$s uploaded item in the Media Library has been selected with up to %2$d image files per upload.', '%1$s uploaded items in the Media Library have been selected with up to %2$d image files per upload.', $fullsize_count, 'ewww-image-optimizer' ), number_format_i18n( $fullsize_count ), $resize_count ) ) . ' ' . esc_html__( 'The total number of images found will be displayed before optimization begins.', 'ewww-image-optimizer' ) . '
'; } else { echo '' .
/* translators: 1: number of images 2: number of registered image sizes */
esc_html( sprintf( _n( '%1$s uploaded item in the Media Library has been selected with up to %2$d image files per upload.', '%1$s uploaded items in the Media Library have been selected with up to %2$d image files per upload.', $fullsize_count, 'ewww-image-optimizer' ), number_format_i18n( $fullsize_count ), $resize_count ) ) .
' ' . esc_html__( 'The total number of images found will be displayed before optimization begins.', 'ewww-image-optimizer' ) .
'
' .
esc_html__( 'The active theme, BuddyPress, WP Symposium, and folders that you have configured will also be scanned for unoptimized images.', 'ewww-image-optimizer' ) .
'
>
>
' . __FUNCTION__ . '()' ); ewwwio_debug_message( "scanning for $gallery" ); global $wpdb; $full_count = 0; $resize_count = 0; $attachment_query = ''; $started = microtime( true ); // Retrieve the time when the counting starts. $max_query = apply_filters( 'ewww_image_optimizer_count_optimized_queries', 4000 ); $max_query = (int) $max_query; $attachment_query_count = 0; switch ( $gallery ) { case 'media': return ewww_image_optimizer_count_attachments(); break; case 'ngg': // See if we were given attachment IDs to work with via GET/POST. if ( ! empty( $_REQUEST['doaction'] ) || get_option( 'ewww_image_optimizer_bulk_ngg_resume' ) ) { // phpcs:ignore WordPress.Security.NonceVerification // Retrieve the attachment IDs that were pre-loaded in the database. $attachment_ids = get_option( 'ewww_image_optimizer_bulk_ngg_attachments' ); array_walk( $attachment_ids, 'intval' ); while ( $attachment_ids && $attachment_query_count < $max_query ) { $attachment_query .= "'" . array_pop( $attachment_ids ) . "',"; ++$attachment_query_count; } $attachment_query = 'WHERE pid IN (' . substr( $attachment_query, 0, -1 ) . ')'; } // Get an array of sizes available for the $image. global $ewwwngg; $sizes = $ewwwngg->get_image_sizes(); $offset = 0; $attachments = $wpdb->get_col( "SELECT meta_data FROM $wpdb->nggpictures $attachment_query LIMIT $offset, $max_query" ); // phpcs:ignore WordPress.DB.PreparedSQL while ( $attachments ) { foreach ( $attachments as $attachment ) { if ( class_exists( 'Ngg_Serializable' ) ) { $serializer = new Ngg_Serializable(); $meta = $serializer->unserialize( $attachment ); } elseif ( class_exists( 'C_NextGen_Serializable' ) ) { $meta = C_NextGen_Serializable::unserialize( $attachment ); } else { $meta = unserialize( $attachment ); } if ( ! is_array( $meta ) ) { continue; } $ngg_sizes = $ewwwngg->maybe_get_more_sizes( $sizes, $meta ); if ( ewww_image_optimizer_iterable( $ngg_sizes ) ) { foreach ( $ngg_sizes as $size ) { if ( 'full' !== $size ) { ++$resize_count; } } } } $full_count += count( $attachments ); $offset += $max_query; if ( ! empty( $attachment_ids ) ) { $attachment_query = ''; $attachment_query_count = 0; $offset = 0; while ( $attachment_ids && $attachment_query_count < $max_query ) { $attachment_query .= "'" . array_pop( $attachment_ids ) . "',"; ++$attachment_query_count; } $attachment_query = 'WHERE pid IN (' . substr( $attachment_query, 0, -1 ) . ')'; } $attachments = $wpdb->get_col( "SELECT meta_data FROM $wpdb->nggpictures $attachment_query LIMIT $offset, $max_query" ); // phpcs:ignore WordPress.DB.PreparedSQL } // End while(). break; case 'flag': if ( ! empty( $_REQUEST['doaction'] ) || get_option( 'ewww_image_optimizer_bulk_flag_resume' ) ) { // phpcs:ignore WordPress.Security.NonceVerification // Retrieve the attachment IDs that were pre-loaded in the database. $attachment_ids = get_option( 'ewww_image_optimizer_bulk_flag_attachments' ); array_walk( $attachment_ids, 'intval' ); while ( $attachment_ids && $attachment_query_count < $max_query ) { $attachment_query .= "'" . array_pop( $attachment_ids ) . "',"; ++$attachment_query_count; } $attachment_query = 'WHERE pid IN (' . substr( $attachment_query, 0, -1 ) . ')'; } $offset = 0; $attachments = $wpdb->get_col( "SELECT meta_data FROM $wpdb->flagpictures $attachment_query LIMIT $offset, $max_query" ); // phpcs:ignore WordPress.DB.PreparedSQL while ( $attachments ) { foreach ( $attachments as $attachment ) { $meta = unserialize( $attachment ); if ( ! is_array( $meta ) ) { continue; } if ( ! empty( $meta['webview'] ) ) { ++$resize_count; } if ( ! empty( $meta['thumbnail'] ) ) { ++$resize_count; } } $full_count += count( $attachments ); $offset += $max_query; if ( ! empty( $attachment_ids ) ) { $attachment_query = ''; $attachment_query_count = 0; $offset = 0; while ( $attachment_ids && $attachment_query_count < $max_query ) { $attachment_query .= "'" . array_pop( $attachment_ids ) . "',"; ++$attachment_query_count; } $attachment_query = 'WHERE pid IN (' . substr( $attachment_query, 0, -1 ) . ')'; } $attachments = $wpdb->get_col( "SELECT meta_data FROM $wpdb->flagpictures $attachment_query LIMIT $offset, $max_query" ); // phpcs:ignore WordPress.DB.PreparedSQL } break; } // End switch(). if ( empty( $full_count ) && ! empty( $attachment_ids ) ) { ewwwio_debug_message( 'query appears to have failed, just counting total images instead' ); $full_count = count( $attachment_ids ); } $elapsed = microtime( true ) - $started; ewwwio_debug_message( "counting images took $elapsed seconds" ); ewwwio_debug_message( "found $full_count fullsize and $resize_count resizes" ); ewwwio_memory( __FUNCTION__ ); return array( $full_count, $resize_count ); } /** * Prepares the bulk operation and includes the javascript functions. * * Checks to see if a scan was in progress, or if attachment IDs were POSTed, and loads the * appropriate attachments into the list to be scanned. Also sets up the js includes, and * defines a few js variables needed for the bulk operation. * * @global object $wpdb * * @param string $hook An indicator if this was not called from AJAX, like WP-CLI. */ function ewww_image_optimizer_bulk_script( $hook ) { ewwwio_debug_message( '' . __FUNCTION__ . '()' ); // Make sure we are being called from the bulk optimization page. if ( 'media_page_ewww-image-optimizer-bulk' !== $hook ) { return; } add_filter( 'admin_footer_text', 'ewww_image_optimizer_footer_review_text' ); global $wpdb; global $ewww_force; global $ewww_webp_only; // Initialize the $attachments variable. $attachments = array(); // Check to see if we are supposed to reset the bulk operation and verify we are authorized to do so. if ( ! empty( $_REQUEST['ewww_reset'] ) && ! empty( $_REQUEST['ewww_wpnonce'] ) && wp_verify_nonce( sanitize_key( $_REQUEST['ewww_wpnonce'] ), 'ewww-image-optimizer-bulk-reset' ) ) { ewwwio_debug_message( 'resetting resume flags' ); // Set the 'bulk resume' option to an empty string to reset the bulk operation. update_option( 'ewww_image_optimizer_bulk_resume', '' ); update_option( 'ewww_image_optimizer_aux_resume', '' ); ewww_image_optimizer_delete_queue_images(); ewww_image_optimizer_delete_pending(); } // Check to see if we are supposed to convert the auxiliary images table and verify we are authorized to do so. if ( ! empty( $_REQUEST['ewww_convert'] ) && ! empty( $_REQUEST['ewww_wpnonce'] ) && wp_verify_nonce( sanitize_key( $_REQUEST['ewww_wpnonce'] ), 'ewww-image-optimizer-aux-images-convert' ) ) { ewww_image_optimizer_aux_images_convert(); } if ( ! empty( $_GET['ewww_webp_only'] ) ) { $ewww_webp_only = true; } if ( ! empty( $_GET['ewww_force'] ) ) { $ewww_force = true; } // Check the 'bulk resume' option. $resume = get_option( 'ewww_image_optimizer_bulk_resume' ); $scanning = get_option( 'ewww_image_optimizer_aux_resume' ); if ( 'scanning' !== $scanning && ! ewww_image_optimizer_get_option( 'ewww_image_optimizer_auto' ) ) { $scanning = false; } if ( ! $resume && ! $scanning ) { ewwwio_debug_message( 'not resuming/scanning, so clearing any pending images in both tables' ); ewww_image_optimizer_delete_queue_images(); ewww_image_optimizer_delete_pending(); } // See if we were given attachment IDs to work with via GET/POST. $ids = array(); if ( ! empty( $_REQUEST['ids'] ) && ( preg_match( '/^[\d,]+$/', sanitize_text_field( wp_unslash( $_REQUEST['ids'] ) ), $request_ids ) || is_numeric( sanitize_text_field( wp_unslash( $_REQUEST['ids'] ) ) ) ) ) { ewww_image_optimizer_delete_pending(); set_transient( 'ewww_image_optimizer_skip_aux', true, 3 * MINUTE_IN_SECONDS ); if ( is_numeric( sanitize_text_field( wp_unslash( $_REQUEST['ids'] ) ) ) ) { $ids[] = (int) $_REQUEST['ids']; } else { $ids = explode( ',', $request_ids[0] ); array_walk( $ids, 'intval' ); } $sample_post_type = get_post_type( $ids[0] ); ewwwio_debug_message( "post type (checking for ims_gallery): $sample_post_type" ); if ( 'ims_gallery' === $sample_post_type ) { $attachments = array(); foreach ( $ids as $gid ) { ewwwio_debug_message( "gallery id: $gid" ); $ims_images = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = 'ims_image' AND post_mime_type LIKE %s AND post_parent = %d ORDER BY ID DESC", '%image%', $gid ) ); $attachments = array_merge( $attachments, $ims_images ); } } else { ewwwio_debug_message( "validating requested ids: {$request_ids[0]}" ); // Retrieve post IDs correlating to the IDs submitted to make sure they are all valid. $attachments = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE (post_type = 'attachment' OR post_type = 'ims_image') AND (post_mime_type LIKE '%%image%%' OR post_mime_type LIKE '%%pdf%%') AND ID IN ({$request_ids[0]}) ORDER BY ID DESC" ); // phpcs:ignore WordPress.DB.PreparedSQL } // Unset the 'bulk resume' option since we were given specific IDs to optimize. update_option( 'ewww_image_optimizer_bulk_resume', '' ); // Check if there is a previous bulk operation to resume. } elseif ( $scanning || $resume ) { ewwwio_debug_message( 'scanning/resuming, nothing doing' ); } elseif ( empty( $attachments ) ) { ewwwio_debug_message( 'load em all up' ); // Since we aren't resuming, and weren't given a list of IDs, we will optimize everything. delete_transient( 'ewww_image_optimizer_scan_aux' ); // Load up all the image attachments we can find. $attachments = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE (post_type = 'attachment' OR post_type = 'ims_image') AND (post_mime_type LIKE '%%image%%' OR post_mime_type LIKE '%%pdf%%') ORDER BY ID DESC" ); } // End if(). if ( ! empty( $attachments ) ) { // Store the attachment IDs we retrieved in the 'scanning_attachments' option so we can keep track of our progress in the database. ewwwio_debug_message( 'loading attachments into queue table' ); ewww_image_optimizer_insert_unscanned( $attachments ); $attachment_count = count( $attachments ); } else { $attachment_count = ewww_image_optimizer_count_unscanned_attachments(); } if ( empty( $attachment_count ) && ! ewww_image_optimizer_count_attachments() && ! ewww_image_optimizer_aux_images_table_count_pending() ) { update_option( 'ewww_image_optimizer_bulk_resume', '' ); update_option( 'ewww_image_optimizer_aux_resume', '' ); } wp_enqueue_script( 'ewww-beacon-script', plugins_url( '/includes/eio-beacon.js', __FILE__ ), array( 'jquery' ), EWWW_IMAGE_OPTIMIZER_VERSION ); wp_enqueue_script( 'ewww-bulk-script', plugins_url( '/includes/eio-bulk.js', __FILE__ ), array( 'jquery', 'jquery-ui-slider', 'jquery-ui-progressbar', 'postbox', 'dashboard' ), EWWW_IMAGE_OPTIMIZER_VERSION ); // Number of images in the ewwwio_table (previously optimized images). $image_count = ewww_image_optimizer_aux_images_table_count(); // Submit a couple variables for our javascript to work with. $loading_image = plugins_url( '/images/wpspin.gif', __FILE__ ); wp_localize_script( 'ewww-bulk-script', 'ewww_vars', array( '_wpnonce' => wp_create_nonce( 'ewww-image-optimizer-bulk' ), 'attachments' => ewww_image_optimizer_aux_images_table_count_pending(), 'image_count' => $image_count, /* translators: %d: number of images */ 'count_string' => sprintf( esc_html__( '%d images', 'ewww-image-optimizer' ), $image_count ), 'scan_fail' => esc_html__( 'Operation timed out, you may need to increase the max_execution_time or memory_limit for PHP', 'ewww-image-optimizer' ), 'scan_incomplete' => esc_html__( 'Scan did not complete, will try again', 'ewww-image-optimizer' ) . "' . esc_html__( 'Restoring', 'ewww-image-optimizer' ) . "
' . esc_html__( 'Optimizing', 'ewww-image-optimizer' ) . " $file
' . esc_html__( 'Optimizing', 'ewww-image-optimizer' ) . "
' . esc_html__( 'Could not find image', 'ewww-image-optimizer' ) . ' %s
', esc_html( $image->file ) ); } } } $countermeasures = ewww_image_optimizer_bulk_counter_measures( $image ); if ( $countermeasures ) { $batch_image_limit = 1; } set_transient( 'ewww_image_optimizer_bulk_current_image', $image->file, 600 ); global $ewww_image; $ewww_image = $image; if ( 'full' === $image->resize && ewww_image_optimizer_get_option( 'ewww_image_optimizer_resize_existing' ) && ! function_exists( 'imsanity_get_max_width_height' ) ) { if ( empty( $meta ) || ! is_array( $meta ) ) { $meta = wp_get_attachment_metadata( $image->attachment_id ); } $new_dimensions = ewww_image_optimizer_resize_upload( $image->file ); if ( ! empty( $new_dimensions ) && is_array( $new_dimensions ) ) { $meta['width'] = $new_dimensions[0]; $meta['height'] = $new_dimensions[1]; } } elseif ( empty( $image->resize ) && ewww_image_optimizer_should_resize_other_image( $image->file ) ) { $new_dimensions = ewww_image_optimizer_resize_upload( $image->file ); } list( $file, $msg, $converted, $original ) = ewww_image_optimizer( $image->file, 1, false, false, 'full' === $image->resize ); // Gotta make sure we don't delete a pending record if the license is exceeded, so the license check goes first. if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ) ) { if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { $output['error'] = '' . esc_html__( 'License Exceeded', 'ewww-image-optimizer' ) . ''; delete_transient( 'ewww_image_optimizer_bulk_counter_measures' ); delete_transient( 'ewww_image_optimizer_bulk_current_image' ); ewwwio_ob_clean(); die( wp_json_encode( $output ) ); } if ( 'exceeded quota' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { $output['error'] = '' . esc_html__( 'Soft quota reached, contact us for more', 'ewww-image-optimizer' ) . ''; delete_transient( 'ewww_image_optimizer_bulk_counter_measures' ); delete_transient( 'ewww_image_optimizer_bulk_current_image' ); ewwwio_ob_clean(); die( wp_json_encode( $output ) ); } } // Delete a pending record if the optimization failed for whatever reason. if ( ! $file && $image->id ) { global $wpdb; $wpdb->delete( $wpdb->ewwwio_images, array( 'id' => $image->id, ), array( '%d' ) ); } // Toggle a pending record if the optimization was webp-only. if ( true === $file && $image->id ) { global $wpdb; $wpdb->update( $wpdb->ewwwio_images, array( 'pending' => 0, ), array( 'id' => $image->id, ) ); } // If this is a full size image and it was converted. if ( 'full' === $image->resize && false !== $converted ) { if ( empty( $meta ) || ! is_array( $meta ) ) { $meta = wp_get_attachment_metadata( $image->attachment_id ); } $image->file = $file; $image->converted = $original; $meta['file'] = _wp_relative_upload_path( $file ); $image->update_converted_attachment( $meta ); $meta = $image->convert_sizes( $meta ); } if ( defined( 'WP_CLI' ) && WP_CLI ) { WP_CLI::line( __( 'Optimized', 'ewww-image-optimizer' ) . ' ' . $image->file ); WP_CLI::line( str_replace( array( ' ', '' . esc_html__( 'Optimized', 'ewww-image-optimizer' ) . ' %s
', esc_html( $image->file ) );
if ( ! empty( $ewwwio_resize_status ) ) {
$output['results'] .= esc_html( $ewwwio_resize_status ) . '
';
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::line( $ewwwio_resize_status );
}
}
$output['results'] .= "$msg
' . esc_html( _n( 'Elapsed: %s second', 'Elapsed: %s seconds', $elapsed, 'ewww-image-optimizer' ) ) . '
', number_format_i18n( $elapsed, 1 ) ); // Store the updated list of attachment IDs back in the 'bulk_attachments' option. if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_debug' ) ) { $debug_button = esc_html__( 'Show Debug Output', 'ewww-image-optimizer' ); $debug_id = uniqid(); $output['results'] .= " '; } if ( ! empty( $next_image->file ) ) { $next_file = esc_html( $next_image->file ); // Generate the WP spinner image for display. $loading_image = plugins_url( '/images/wpspin.gif', __FILE__ ); if ( $next_file ) { $output['next_file'] = '' . esc_html__( 'Optimizing', 'ewww-image-optimizer' ) . " $next_file
' . esc_html__( 'Optimizing', 'ewww-image-optimizer' ) . "
' . esc_html__( 'Access token has expired, please reload the page.', 'ewww-image-optimizer' ) . '
' ); } // All done, so we can update the bulk options with empty values. update_option( 'ewww_image_optimizer_aux_resume', '' ); update_option( 'ewww_image_optimizer_bulk_resume', '' ); // update_option( 'ewww_image_optimizer_bulk_attachments', '', false );. delete_transient( 'ewww_image_optimizer_skip_aux' ); delete_transient( 'ewww_image_optimizer_force_reopt' ); // Let the user know we are done. ewwwio_memory( __FUNCTION__ ); ewwwio_ob_clean(); die( '' . esc_html__( 'Finished', 'ewww-image-optimizer' ) . ' - ' . ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ) ? '' . esc_html__( 'Write a Review', 'ewww-image-optimizer' ) : esc_html__( 'Want more compression?', 'ewww-image-optimizer' ) . ' ' . '' . esc_html__( 'Get 5x more with a free trial', 'ewww-image-optimizer' ) ) . '
' ); } add_action( 'admin_enqueue_scripts', 'ewww_image_optimizer_bulk_script' ); add_action( 'admin_enqueue_scripts', 'ewww_image_optimizer_tool_script' ); add_action( 'wp_ajax_bulk_scan', 'ewww_image_optimizer_media_scan' ); add_action( 'wp_ajax_bulk_init', 'ewww_image_optimizer_bulk_initialize' ); add_action( 'wp_ajax_bulk_filename', 'ewww_image_optimizer_bulk_filename' ); add_action( 'wp_ajax_bulk_loop', 'ewww_image_optimizer_bulk_loop' ); add_action( 'wp_ajax_ewww_bulk_update_meta', 'ewww_image_optimizer_bulk_update_meta' ); add_action( 'wp_ajax_bulk_cleanup', 'ewww_image_optimizer_bulk_cleanup' ); add_action( 'wp_ajax_bulk_quota_update', 'ewww_image_optimizer_bulk_quota_update' ); add_filter( 'ewww_image_optimizer_count_optimized_queries', 'ewww_image_optimizer_reduce_query_count' );