diff --git a/bulk.php b/bulk.php index e10f549..97f2fd1 100644 --- a/bulk.php +++ b/bulk.php @@ -355,6 +355,8 @@ function ewww_image_optimizer_bulk_preview() { $fullsize_count = ewww_image_optimizer_aux_images_table_count_pending(); $button_text = esc_attr__( 'Resume previous optimization', 'ewww-image-optimizer' ); } + // Check that quota is reset after purchasing more credits. + ewww_image_optimizer_cloud_verify( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ), false ); // Create the html for the bulk optimize form and status divs. ewww_image_optimizer_bulk_head_output(); echo '
'; @@ -987,6 +989,25 @@ function ewww_image_optimizer_bulk_async_init() { session_write_close(); $output = array(); + if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ) ) { + $verify_cloud = ewww_image_optimizer_cloud_verify( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ), false ); + if ( 'exceeded' === $verify_cloud ) { + $output['error'] = ewww_image_optimizer_credits_exceeded(); + ewwwio_ob_clean(); + die( wp_json_encode( $output ) ); + } + if ( 'exceeded quota' === $verify_cloud ) { + $output['error'] = ewww_image_optimizer_soft_quota_exceeded(); + ewwwio_ob_clean(); + die( wp_json_encode( $output ) ); + } + if ( 'exceeded subkey' === $verify_cloud ) { + $output['error'] = esc_html__( 'Out of credits', 'ewww-image=optimizer' ); + ewwwio_ob_clean(); + die( wp_json_encode( $output ) ); + } + } + // Update the 'bulk resume' option to show that an operation is in progress. update_option( 'ewww_image_optimizer_bulk_resume', 'scanning' ); delete_option( 'ewwwio_stop_scheduled_scan' ); @@ -1031,6 +1052,24 @@ function ewww_image_optimizer_bulk_async_get_status() { session_write_close(); $output = array(); + if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ) ) { + if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + $output['complete'] = ewww_image_optimizer_credits_exceeded(); + ewwwio_ob_clean(); + die( wp_json_encode( $output ) ); + } + if ( 'exceeded quota' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + $output['complete'] = ewww_image_optimizer_soft_quota_exceeded(); + ewwwio_ob_clean(); + die( wp_json_encode( $output ) ); + } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + $output['complete'] = esc_html__( 'Out of credits', 'ewww-image=optimizer' ); + ewwwio_ob_clean(); + die( wp_json_encode( $output ) ); + } + } + $media_queue_running = false; if ( ewwwio()->background_media->is_process_running() ) { $media_queue_running = true; @@ -2265,6 +2304,13 @@ function ewww_image_optimizer_bulk_loop( $hook = '', $delay = 0 ) { ewwwio_ob_clean(); die( wp_json_encode( $output ) ); } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + $output['error'] = esc_html__( 'Out of credits', '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. diff --git a/classes/class-background-process-image.php b/classes/class-background-process-image.php index 8a637e2..d0449ee 100644 --- a/classes/class-background-process-image.php +++ b/classes/class-background-process-image.php @@ -58,9 +58,11 @@ class Background_Process_Image extends Background_Process { */ protected function handle() { if ( \get_option( 'ewww_image_optimizer_pause_queues' ) ) { + \ewwwio_debug_message( 'all queues paused' ); return; } if ( \get_option( 'ewww_image_optimizer_pause_image_queue' ) ) { + \ewwwio_debug_message( 'this queue paused' ); return; } parent::handle(); @@ -262,10 +264,7 @@ protected function process_image( $image, $attempts = 0 ) { // 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' ) || - 'exceeded quota' === \get_transient( 'ewww_image_optimizer_cloud_status' ) - ) { + if ( false !== \strpos( \get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) ) { \delete_transient( 'ewww_image_optimizer_bulk_counter_measures' ); \delete_transient( 'ewww_image_optimizer_bulk_current_image' ); \update_option( 'ewww_image_optimizer_pause_image_queue', true, false ); diff --git a/classes/class-background-process-media.php b/classes/class-background-process-media.php index 7f36559..290700a 100644 --- a/classes/class-background-process-media.php +++ b/classes/class-background-process-media.php @@ -55,6 +55,7 @@ class Background_Process_Media extends Background_Process { */ protected function handle() { if ( \get_option( 'ewww_image_optimizer_pause_queues' ) ) { + \ewwwio_debug_message( 'all queues paused' ); return; } diff --git a/classes/class-background-process.php b/classes/class-background-process.php index accb37a..bad92be 100644 --- a/classes/class-background-process.php +++ b/classes/class-background-process.php @@ -224,22 +224,31 @@ public function delete( $key ) { public function maybe_handle() { session_write_close(); + \ewwwio_debug_message( '' . __METHOD__ . '()' ); + \ewwwio_debug_message( "$this->identifier checking for valid nonce" ); \check_ajax_referer( $this->identifier, 'nonce' ); if ( ! empty( $_REQUEST['lock_key'] ) ) { $this->lock_key = \sanitize_text_field( \wp_unslash( $_REQUEST['lock_key'] ) ); } + \ewwwio_debug_message( "nonce was valid, lock key is $this->lock_key" ); if ( $this->is_process_running() && ! $this->is_key_valid() ) { // Background process already running. + \ewwwio_debug_message( 'background process already running and the submitted lock key is not the active/valid key' ); die; } + \ewwwio_debug_message( 'not already running, checking queue' ); + if ( $this->is_queue_empty() ) { // No data to process. + \ewwwio_debug_message( 'nothing in the queue, bye!' ); die; } + \ewwwio_debug_message( 'queue has items, lets handle them...' ); + $this->handle(); die; @@ -273,6 +282,7 @@ protected function is_queue_empty() { * @return bool */ public function is_process_running() { + \ewwwio_debug_message( '' . __METHOD__ . '()' ); if ( $this->get_process_lock() ) { // Process already running. return true; @@ -300,12 +310,12 @@ protected function get_lock_dir() { /** * Is disk-based lock valid? * + * @param string $lock_file Location of the process lock file. * @return bool True if it is valid, false if it is expired. */ - protected function is_disk_lock_valid() { + protected function is_disk_lock_valid( $lock_file ) { \ewwwio_debug_message( '' . __METHOD__ . '()' ); $lock_duration = \apply_filters( $this->identifier . '_queue_lock_time', $this->queue_lock_time ); - $lock_file = $this->process_lock_file(); \clearstatcache(); if ( \ewwwio_is_file( $lock_file ) && \time() - \filemtime( $lock_file ) < $lock_duration ) { \ewwwio_debug_message( 'process lock file in place' ); @@ -324,8 +334,9 @@ protected function get_process_lock() { \ewwwio_debug_message( '' . __METHOD__ . '()' ); $db_key = false; if ( $this->lock_dir ) { - \ewwwio_debug_message( "$this->lock_dir is valid" ); + \ewwwio_debug_message( "lock dir is $this->lock_dir" ); $lock_file = $this->process_lock_file(); + \ewwwio_debug_message( "checking $lock_file" ); if ( $this->is_disk_lock_valid( $lock_file ) ) { $db_key = \trim( \file_get_contents( $lock_file ) ); \ewwwio_debug_message( "retrieved lock key: $db_key" ); @@ -439,7 +450,8 @@ protected function get_batch() { * within server memory and time limit constraints. */ protected function handle() { - $this->start_time = time(); // Set start time of current process. + \ewwwio_debug_message( '' . __METHOD__ . '()' ); + $this->start_time = \time(); // Set start time of current process. do { $batch = $this->get_batch(); diff --git a/classes/class-ewww-flag.php b/classes/class-ewww-flag.php index c6b7695..0523fdc 100644 --- a/classes/class-ewww-flag.php +++ b/classes/class-ewww-flag.php @@ -109,7 +109,7 @@ public function ewww_flag_bulk() {

GRAND FlAGallery

' . esc_html__( 'Image credits available:', 'ewww-image-optimizer' ) . ' ' . esc_html( ewww_image_optimizer_cloud_quota() ) . ''; } if ( ! ewww_image_optimizer_get_option( 'ewww_image_optimizer_backup_files' ) ) { @@ -613,6 +613,11 @@ public function ewww_flag_bulk_loop() { ewwwio_ob_clean(); wp_die( wp_json_encode( $output ) ); } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + $output['error'] = esc_html__( 'Out of credits', 'ewww-image-optimizer' ); + ewwwio_ob_clean(); + wp_die( wp_json_encode( $output ) ); + } // Let the user know what happened. $output['results'] = sprintf( '

' . esc_html__( 'Optimized image:', 'ewww-image-optimizer' ) . ' %s
', esc_html( $meta->image->filename ) ); /* Translators: %s: The compression results/savings */ diff --git a/classes/class-ewww-nextcellent.php b/classes/class-ewww-nextcellent.php index af954e0..f6dbd33 100644 --- a/classes/class-ewww-nextcellent.php +++ b/classes/class-ewww-nextcellent.php @@ -394,7 +394,7 @@ public function ewww_ngg_bulk_preview() {

' . esc_html__( 'Image credits available:', 'ewww-image-optimizer' ) . ' ' . esc_html( ewww_image_optimizer_cloud_quota() ) . ''; } // Retrieve the value of the 'bulk resume' option and set the button text for the form to use. @@ -609,6 +609,11 @@ public function ewww_ngg_bulk_loop() { ewwwio_ob_clean(); wp_die( wp_json_encode( $output ) ); } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + $output['error'] = esc_html__( 'Out of credits', 'ewww-image-optimizer' ); + ewwwio_ob_clean(); + wp_die( wp_json_encode( $output ) ); + } // Output the results of the optimization. if ( $fres[0] ) { $output['results'] = sprintf( '

' . esc_html__( 'Optimized image:', 'ewww-image-optimizer' ) . ' %s
', esc_html( $fres[0] ) ); diff --git a/classes/class-ewww-nextgen.php b/classes/class-ewww-nextgen.php index 1b98a9c..d8261dd 100644 --- a/classes/class-ewww-nextgen.php +++ b/classes/class-ewww-nextgen.php @@ -352,6 +352,16 @@ public function ewww_ngg_manual() { ) ); } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + ewwwio_ob_clean(); + wp_die( + wp_json_encode( + array( + 'error' => esc_html__( 'Out of credits', 'ewww-image-optimizer' ), + ) + ) + ); + } if ( ! wp_doing_ajax() ) { // Get the referring page, and send the user back there. wp_safe_redirect( wp_get_referer() ); @@ -704,7 +714,7 @@ public function ewww_ngg_bulk_preview() {

' . esc_html__( 'Image credits available:', 'ewww-image-optimizer' ) . ' ' . wp_kses_post( ewww_image_optimizer_cloud_quota() ) . ''; } if ( ! ewww_image_optimizer_get_option( 'ewww_image_optimizer_backup_files' ) ) { diff --git a/common.php b/common.php index 30b2636..f37fe4d 100644 --- a/common.php +++ b/common.php @@ -3802,7 +3802,7 @@ function ewww_image_optimizer_manual() { if ( ! $meta_saved ) { ewwwio_debug_message( 'failed to save meta, or no changes' ); } - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { + if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { if ( ! wp_doing_ajax() ) { wp_die( wp_kses( ewww_image_optimizer_credits_exceeded() ) ); } @@ -3814,6 +3814,18 @@ function ewww_image_optimizer_manual() { ) ) ); + } elseif ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + if ( ! wp_doing_ajax() ) { + wp_die( wp_kses( __( 'Out of credits', 'ewww-image-optimizer' ) ) ); + } + ewwwio_ob_clean(); + wp_die( + wp_json_encode( + array( + 'error' => esc_html__( 'Out of credits', 'ewww-image-optimizer' ), + ) + ) + ); } elseif ( 'exceeded quota' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { if ( ! wp_doing_ajax() ) { wp_die( wp_kses( ewww_image_optimizer_soft_quota_exceeded() ) ); @@ -5081,12 +5093,17 @@ function ewww_image_optimizer_cloud_verify( $api_key, $cache = true ) { } return false; } + $ewww_cloud_status = get_transient( 'ewww_image_optimizer_cloud_status' ); if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() && $cache ) { - set_transient( 'ewww_image_optimizer_cloud_status', 'exceeded', HOUR_IN_SECONDS ); + if ( empty( $ewww_cloud_status ) ) { + set_transient( 'ewww_image_optimizer_cloud_status', 'exceeded', HOUR_IN_SECONDS ); + $ewww_cloud_status = 'exceeded'; + } else { + set_transient( 'ewww_image_optimizer_cloud_status', $ewww_cloud_status, HOUR_IN_SECONDS ); + } ewwwio_debug_message( 'license exceeded notice has not expired' ); - return 'exceeded'; + return $ewww_cloud_status; } - $ewww_cloud_status = get_transient( 'ewww_image_optimizer_cloud_status' ); if ( ! ewww_image_optimizer_detect_wpsf_location_lock() && $cache && preg_match( '/great/', $ewww_cloud_status ) ) { ewwwio_debug_message( 'using cached verification' ); ewwwio()->async_key_verify->dispatch(); @@ -5104,38 +5121,39 @@ function ewww_image_optimizer_cloud_verify( $api_key, $cache = true ) { ewwwio_debug_message( "verification failed: $error_message" ); $result = ewww_image_optimizer_cloud_post_key( $url, $api_key ); } + $verified = ''; if ( is_wp_error( $result ) ) { $error_message = $result->get_error_message(); ewwwio_debug_message( "verification failed via $url: $error_message" ); - } elseif ( ! empty( $result['body'] ) && preg_match( '/(great|exceeded)/', $result['body'] ) ) { - $verified = $result['body']; - if ( preg_match( '/exceeded/', $verified ) ) { - ewww_image_optimizer_set_option( 'ewww_image_optimizer_cloud_exceeded', time() + 300 ); - } - if ( false !== strpos( $result['body'], 'expired' ) ) { + } elseif ( ! empty( $result['body'] ) && 0 === strpos( $result['body'], '{' ) ) { // A non-empty response that appears to be JSON-encoded. + $decoded = json_decode( $result['body'], true ); + $key_status = ! empty( $decoded['status'] ) ? $decoded['status'] : ''; + // While the API may return an 'error' property/key, it has been standardized to always return a 'status'. + // The status may be any of the following: great, exceeded, exceeded quota, exceeded subkey, invalid, expired. + $valid_statuses = array( 'great', 'exceeded', 'exceeded quota', 'exceeded subkey' ); + ewwwio_debug_message( "key status is $verified ($url)" ); + if ( in_array( $key_status, $valid_statuses, true ) ) { + $verified = $key_status; + if ( false !== strpos( $verified, 'exceeded' ) ) { + ewww_image_optimizer_set_option( 'ewww_image_optimizer_cloud_exceeded', time() + 300 ); + } + delete_option( 'ewww_image_optimizer_cloud_key_invalid' ); + } else { + update_option( 'ewww_image_optimizer_cloud_key_invalid', true, false ); ewww_image_optimizer_set_option( 'ewww_image_optimizer_cloud_key', '' ); } - ewwwio_debug_message( "verification success via: $url" ); - delete_option( 'ewww_image_optimizer_cloud_key_invalid' ); } else { update_option( 'ewww_image_optimizer_cloud_key_invalid', true, false ); - if ( ! empty( $result['body'] ) && false !== strpos( $result['body'], 'invalid' ) ) { - ewww_image_optimizer_set_option( 'ewww_image_optimizer_cloud_key', '' ); - } ewwwio_debug_message( "verification failed via: $url" ); if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_debug' ) && ewww_image_optimizer_function_exists( 'print_r' ) ) { ewwwio_debug_message( print_r( $result, true ) ); } } - if ( empty( $verified ) ) { - ewwwio_memory( __FUNCTION__ ); - return false; - } else { + if ( $verified ) { set_transient( 'ewww_image_optimizer_cloud_status', $verified, HOUR_IN_SECONDS ); - ewwwio_debug_message( "verification body contents: {$result['body']}" ); - ewwwio_memory( __FUNCTION__ ); - return $verified; + ewwwio_debug_message( "verification body contents: $verified" ); } + return $verified; } /** @@ -5315,7 +5333,7 @@ function ewww_image_optimizer_cloud_optimizer( $file, $type, $convert = false, $ } } $api_key = ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_key' ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) ) { $started = microtime( true ); if ( ! ewww_image_optimizer_cloud_verify( $api_key ) ) { return array( $file, false, 'key verification failed', 0, '' ); @@ -5328,10 +5346,15 @@ function ewww_image_optimizer_cloud_optimizer( $file, $type, $convert = false, $ ewwwio_debug_message( 'soft quota reached, image not processed' ); return array( $file, false, 'exceeded quota', 0, '' ); } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + ewwwio_debug_message( 'license exceeded, image not processed' ); + return array( $file, false, 'exceeded subkey', 0, '' ); + } if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { ewwwio_debug_message( 'license exceeded, image not processed' ); return array( $file, false, 'exceeded', 0, '' ); } + global $ewww_image; global $eio_filesystem; ewwwio_get_filesystem(); @@ -5548,6 +5571,11 @@ function ewww_image_optimizer_cloud_optimizer( $file, $type, $convert = false, $ set_transient( 'ewww_image_optimizer_cloud_status', 'exceeded quota', HOUR_IN_SECONDS ); $msg = 'exceeded quota'; ewwwio_delete_file( $tempfile ); + } elseif ( 100 > strlen( $response['body'] ) && strpos( $response['body'], 'exceeded subkey' ) ) { + ewwwio_debug_message( 'License Exceeded' ); + set_transient( 'ewww_image_optimizer_cloud_status', 'exceeded subkey', HOUR_IN_SECONDS ); + $msg = 'exceeded subkey'; + ewwwio_delete_file( $tempfile ); } elseif ( 100 > strlen( $response['body'] ) && strpos( $response['body'], 'exceeded' ) ) { ewwwio_debug_message( 'License Exceeded' ); set_transient( 'ewww_image_optimizer_cloud_status', 'exceeded', HOUR_IN_SECONDS ); @@ -5768,7 +5796,7 @@ function ewww_image_optimizer_cloud_autorotate( $file, $type ) { return false; } $started = microtime( true ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) ) { if ( ! ewww_image_optimizer_cloud_verify( $api_key ) ) { ewwwio_debug_message( 'cloud verify failed, image not rotated' ); return false; @@ -5777,7 +5805,7 @@ function ewww_image_optimizer_cloud_autorotate( $file, $type ) { // Calculate how much time has elapsed since we started. $elapsed = microtime( true ) - $started; ewwwio_debug_message( "cloud verify took $elapsed seconds" ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { ewwwio_debug_message( 'license exceeded, image not rotated' ); return false; } @@ -5886,7 +5914,7 @@ function ewww_image_optimizer_cloud_reduce_png( $file, $colors ) { return false; } $started = microtime( true ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) ) { if ( ! ewww_image_optimizer_cloud_verify( $api_key ) ) { ewwwio_debug_message( 'cloud verify failed, image not converted' ); return false; @@ -5895,7 +5923,7 @@ function ewww_image_optimizer_cloud_reduce_png( $file, $colors ) { // Calculate how much time has elapsed since we started. $elapsed = microtime( true ) - $started; ewwwio_debug_message( "cloud verify took $elapsed seconds" ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { ewwwio_debug_message( 'license exceeded, image not converted' ); return false; } @@ -6122,7 +6150,7 @@ function ewww_image_optimizer_cloud_resize( $file, $type, $dst_x, $dst_y, $src_x return new WP_Error( 'invalid_key', __( 'Could not verify API key', 'ewww-image-optimizer' ) ); } $started = microtime( true ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) ) { if ( ! ewww_image_optimizer_cloud_verify( $api_key ) ) { ewwwio_debug_message( 'cloud verify failed, image not resized' ); return new WP_Error( 'invalid_key', __( 'Could not verify API key', 'ewww-image-optimizer' ) ); @@ -6131,7 +6159,7 @@ function ewww_image_optimizer_cloud_resize( $file, $type, $dst_x, $dst_y, $src_x // Calculate how much time has elapsed since we started. $elapsed = microtime( true ) - $started; ewwwio_debug_message( "cloud verify took $elapsed seconds" ); - if ( 'exceeded' === get_transient( 'ewww_image_optimizer_cloud_status' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { + if ( false !== strpos( get_transient( 'ewww_image_optimizer_cloud_status' ), 'exceeded' ) || ewww_image_optimizer_get_option( 'ewww_image_optimizer_cloud_exceeded' ) > time() ) { ewwwio_debug_message( 'license exceeded, image not rotated' ); return new WP_Error( 'invalid_key', __( 'License Exceeded', 'ewww-image-optimizer' ) ); } @@ -6929,6 +6957,16 @@ function ewww_image_optimizer_aux_images_loop( $attachment = null, $auto = false } die(); } + if ( 'exceeded subkey' === get_transient( 'ewww_image_optimizer_cloud_status' ) ) { + if ( ! $auto ) { + $output['error'] = esc_html__( 'Out of credits', 'ewww-image-optimizer' ); + echo wp_json_encode( $output ); + } + if ( $cli ) { + WP_CLI::error( __( 'Out of credits', 'ewww-image-optimizer' ) ); + } + die(); + } if ( ! $results[0] && $id && is_numeric( $id ) ) { ewww_image_optimizer_delete_pending_image( $id ); @@ -12472,6 +12510,7 @@ function ewww_image_optimizer_bulk_async_show_status() { - '> - + '> + - '> - + '> + - + + + - + - diff --git a/ewww-image-optimizer.php b/ewww-image-optimizer.php index 0c02f23..080661d 100644 --- a/ewww-image-optimizer.php +++ b/ewww-image-optimizer.php @@ -34,7 +34,7 @@ add_action( 'admin_notices', 'ewww_image_optimizer_dual_plugin' ); } elseif ( false === strpos( add_query_arg( '', '' ), 'ewwwio_disable=1' ) ) { - define( 'EWWW_IMAGE_OPTIMIZER_VERSION', 780.1 ); + define( 'EWWW_IMAGE_OPTIMIZER_VERSION', 780.31 ); if ( WP_DEBUG && function_exists( 'memory_get_usage' ) ) { $ewww_memory = 'plugin load: ' . memory_get_usage( true ) . "\n"; diff --git a/includes/eio-bulk-table.js b/includes/eio-bulk-table.js index 0fd4a20..6cd17f1 100644 --- a/includes/eio-bulk-table.js +++ b/includes/eio-bulk-table.js @@ -104,6 +104,7 @@ jQuery(document).ready(function($) { } if ( ewww_response.error ) { $('#ewww-optimize-local-images').html('' + ewww_response.error + ''); + $('.ewww-bulk-spinner').hide(); } else if ( ewww_response.media_remaining ) { $('.ewww-bulk-spinner').show(); $('#ewww-optimize-local-images').html( ewww_response.media_remaining ); @@ -181,7 +182,9 @@ jQuery(document).ready(function($) { } else { $('.ewww-queue-controls').hide(); $('.ewww-bulk-spinner').hide(); - if (ewww_response.complete) { + if (ewww_response.error) { + $('#ewww-optimize-local-images').html('' + ewww_response.error + ''); + } else if (ewww_response.complete) { if (ewww_table_visible) { ewwwUpdateTable(); } diff --git a/readme.txt b/readme.txt index 627546c..a4866be 100644 --- a/readme.txt +++ b/readme.txt @@ -144,6 +144,9 @@ That's not a question, but since I made it up, I'll answer it. See this resource *Release Date - TBD* * changed: allow folders outside of WordPress install to be optimized via Folders to Optimize * changed: improve performance of ewwwio_is_file(), props @rmpel +* changed: improve exceeded credit messages for sub-keys +* fixed: bulk async shows start optimizing instead of resume when queues are paused +* fixed: bulk async status refresh does not handle errors properly = 7.8.0 = *Release Date - July 25, 2024* diff --git a/unique.php b/unique.php index cb5f873..889a7b2 100644 --- a/unique.php +++ b/unique.php @@ -1199,6 +1199,8 @@ function ewww_image_optimizer( $file, $gallery_type = 4, $converted = false, $ne // If their cloud api license limit has been exceeded. if ( 'exceeded' === $result ) { return array( false, __( 'License exceeded', 'ewww-image-optimizer' ), $converted, $original ); + } elseif ( 'exceeded subkey' === $result ) { + return array( false, __( 'Out of credits', 'ewww-image-optimizer' ), $converted, $original ); } elseif ( 'exceeded quota' === $result ) { return array( false, __( 'Soft Quota Reached', 'ewww-image-optimizer' ), $converted, $original ); }