';
@@ -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( '
' );
+ \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( '
' );
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( '
' );
$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( '
' );
$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( '
' );
+ $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 );
}