PluginProbe
QuickWebP – WebP & AVIF Image Optimizer, Compression & SEO for WordPress / 4.1.2
QuickWebP – WebP & AVIF Image Optimizer, Compression & SEO for WordPress v4.1.2
4.1.2 4.1.1 4.1.0 4.0.1 4.0.0 3.3.1 3.3.0 trunk 1.0.0 2.0.0 2.1.0 3.0.0 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8
← All changes | admin/class-cron-job.php +128 -65 3.3.14.1.2 View file →
@@ -46,9 +46,9 @@
46 46 public function crons_registrations( $schedules ) {
47 47
48 48 $schedules['bulk_optimization'] = array(
49 49 'interval' => MINUTE_IN_SECONDS,
50 - 'display' => __( 'Every minute', QUICKWEBP_TEXT_DOMAIN )
50 + 'display' => __( 'Every minute', 'quickwebp' )
51 51 );
52 52
53 53 return $schedules;
54 54 }
@@ -56,42 +56,55 @@
56 56 /**
57 57 * excute bulk optimization
58 58 */
59 59 public function excute_bulk_optimization() {
60 + $lock_token = $this->acquire_bulk_optimization_lock();
61 + if ( ! $lock_token ) {
62 + return;
63 + }
60 64
61 - $time_start = microtime(true);
65 + $time_start = microtime( true );
62 66
63 - if ( ! $this->is_save_original_enabled() ) {
67 + $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
68 + $settings = $quickwebp_image_optimizer->get_settings();
69 +
70 + $mode_enabled = $settings['quickwebp_settings_conversion'];
71 + if ( '0' === $mode_enabled ) {
64 72 $this->end_cron_job();
73 + $this->release_bulk_optimization_lock( $lock_token );
74 + return;
65 75 }
66 76
67 - $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
68 - $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids();
69 -
77 + $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids( 5 );
70 78 if ( empty( $media_ids ) ) {
71 79 $this->end_cron_job();
80 + $this->release_bulk_optimization_lock( $lock_token );
81 + return;
72 82 }
73 83
74 84 $status = get_option( 'quickwebp_bulk_optimize_status', 'finish' );
75 -
76 85 if ( $status != 'running' ) {
77 86 $this->end_cron_job();
87 + $this->release_bulk_optimization_lock( $lock_token );
88 + return;
78 89 }
79 -
80 - $total = (int)get_option( 'quickwebp_bulk_optimize_total', 0 );
81 - $current = (int)get_option( 'quickwebp_bulk_optimize_current', 0 );
90 +
91 + $current = (int) get_option( 'quickwebp_bulk_optimize_current', 0 );
92 + $batch_stats = array(
93 + 'images_optimized' => 0,
94 + 'bytes_before' => 0,
95 + 'bytes_after' => 0,
96 + );
82 97
83 98 foreach ( $media_ids as $id ) {
84 -
85 - if ( $time_start + 55 < microtime(true) ) {
86 - exit;
99 + if ( $time_start + 55 < microtime( true ) ) {
100 + break;
87 101 }
88 102
89 - $sizes = $quickwebp_image_optimizer->get_media_files( $id );
90 - $new_sizes = array();
103 + $sizes = $quickwebp_image_optimizer->get_media_files( $id );
104 + $new_sizes = array();
91 105
92 106 foreach ( $sizes as $key => $size ) {
93 -
94 107 $result = $quickwebp_image_optimizer->optimize_local_file( $size );
95 108
96 109 if ( $result ) {
97 110 $new_sizes[$key] = $result;
@@ -98,70 +111,141 @@
98 111 }
99 112 }
100 113
101 114 if ( ! empty( $new_sizes ) ) {
102 - update_post_meta( $id, 'quickwebp_already_optimized', '1' );
115 + $attachment_stats = $quickwebp_image_optimizer->get_attachment_optimization_stats( $new_sizes );
116 + $batch_stats['images_optimized'] += $attachment_stats['images_optimized'];
117 + $batch_stats['bytes_before'] += $attachment_stats['bytes_before'];
118 + $batch_stats['bytes_after'] += $attachment_stats['bytes_after'];
119 +
120 + $data = get_post_meta( $id, 'quickwebp_data', true );
121 + if ( ! empty( $data ) ) {
122 + $quickwebp_image_optimizer->remove_related_files( $data );
123 + }
124 +
125 + if ( '1' == $mode_enabled ) {
126 + update_post_meta( $id, 'quickwebp_already_optimized', '1' );
127 + } elseif ( '2' == $mode_enabled ) {
128 + update_post_meta( $id, 'quickwebp_already_optimized', '2' );
129 + }
130 +
103 131 update_post_meta( $id, 'quickwebp_data', $new_sizes );
132 + delete_post_meta( $id, 'quickwebp_has_error' );
133 + } else {
134 + update_post_meta( $id, 'quickwebp_has_error', '1' );
135 + delete_post_meta( $id, 'quickwebp_already_optimized' );
136 + delete_post_meta( $id, 'quickwebp_data' );
104 137 }
105 138
106 139 $current++;
107 - update_option( 'quickwebp_bulk_optimize_current', $current );
108 140 }
109 141
110 - $this->end_cron_job();
142 + if ( $batch_stats['images_optimized'] ) {
143 + $quickwebp_image_optimizer->record_optimization_stats(
144 + $batch_stats['bytes_before'],
145 + $batch_stats['bytes_after'],
146 + $batch_stats['images_optimized']
147 + );
148 + }
111 149
150 + update_option( 'quickwebp_bulk_optimize_current', $current );
151 +
152 + if ( empty( $quickwebp_image_optimizer->get_unoptimized_media_ids( 1 ) ) ) {
153 + $this->end_cron_job();
154 + }
155 +
156 + $this->release_bulk_optimization_lock( $lock_token );
112 157 }
113 158
114 159 /**
160 + * Acquire an expiring lock for the bulk optimization worker.
161 + *
162 + * @return string|false
163 + */
164 + private function acquire_bulk_optimization_lock() {
165 + $lock_token = wp_generate_uuid4();
166 + $lock = array(
167 + 'token' => $lock_token,
168 + 'expires' => time() + ( 2 * MINUTE_IN_SECONDS ),
169 + );
170 +
171 + if ( add_option( 'quickwebp_bulk_optimization_lock', $lock, '', false ) ) {
172 + return $lock_token;
173 + }
174 +
175 + $existing_lock = get_option( 'quickwebp_bulk_optimization_lock', array() );
176 + if ( is_array( $existing_lock ) && absint( $existing_lock['expires'] ?? 0 ) < time() ) {
177 + delete_option( 'quickwebp_bulk_optimization_lock' );
178 + if ( add_option( 'quickwebp_bulk_optimization_lock', $lock, '', false ) ) {
179 + return $lock_token;
180 + }
181 + }
182 +
183 + return false;
184 + }
185 +
186 + /**
187 + * Release the bulk optimization lock owned by this process.
188 + *
189 + * @param string $lock_token Lock ownership token.
190 + */
191 + private function release_bulk_optimization_lock( $lock_token ) {
192 + $lock = get_option( 'quickwebp_bulk_optimization_lock', array() );
193 + if ( is_array( $lock ) && hash_equals( (string) ( $lock['token'] ?? '' ), $lock_token ) ) {
194 + delete_option( 'quickwebp_bulk_optimization_lock' );
195 + }
196 + }
197 +
198 + /**
115 199 * Start bulk optimization
116 200 */
117 201 public function start_bulk_optimization() {
118 202
119 203 if ( ! current_user_can( 'manage_options' ) ) {
120 - wp_send_json_error( __( 'You are not allowed to manage plugin settings.', QUICKWEBP_TEXT_DOMAIN ), 403 );
204 + wp_send_json_error( __( 'You are not allowed to manage plugin settings.', 'quickwebp' ), 403 );
121 205 }
122 206
123 207 // verify the nonce.
124 208 $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';
125 209 if( !wp_verify_nonce( $nonce, 'image_optimize_nonce' ) ) {
126 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
210 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
127 211 }
128 212
129 - $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
130 - $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids();
213 + $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
214 + $settings = $quickwebp_image_optimizer->get_settings();
131 215
132 - if ( ! $this->is_save_original_enabled() ) {
133 - wp_send_json_error( __( 'Bulk optimization is available only when "Save original images" is enabled.', QUICKWEBP_TEXT_DOMAIN ) );
216 + $mode_enabled = $settings['quickwebp_settings_conversion'];
217 + if ( '0' === $mode_enabled ) {
218 + wp_send_json_error( __( 'Choose an image format and save the settings.', 'quickwebp' ) );
134 219 }
135 220
136 - if ( empty( $media_ids ) ) {
137 - wp_send_json_error( __( 'No images to optimize.', QUICKWEBP_TEXT_DOMAIN ) );
221 + $total = $quickwebp_image_optimizer->get_unoptimized_media_count();
222 + if ( ! $total ) {
223 + wp_send_json_error( __( 'No images to optimize.', 'quickwebp' ) );
138 224 }
139 225
140 226 $status = get_option( 'quickwebp_bulk_optimize_status', 'finish' );
141 227 if ( $status != 'finish' ) {
142 - wp_send_json_error( __( 'Bulk optimization is already running.', QUICKWEBP_TEXT_DOMAIN ) );
228 + wp_send_json_error( __( 'Bulk optimization is already running.', 'quickwebp' ) );
143 229 }
144 230
145 - if ( !wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
231 + if ( ! wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
146 232 wp_schedule_event( time(), 'bulk_optimization', 'quickwebp_bulk_optimization_hook' );
147 233
148 - $total = count( $media_ids );
149 - $current = 0;
234 + $current = 0;
150 235
151 - update_option( 'quickwebp_bulk_optimize_total', count( $media_ids ) );
236 + update_option( 'quickwebp_bulk_optimize_total', $total );
152 237 update_option( 'quickwebp_bulk_optimize_current', $current );
153 238 update_option( 'quickwebp_bulk_optimize_status', 'running' );
154 239
155 240 $data = array(
156 - 'progress' => $current . '/' . $total,
157 - 'percent' => $total ? round( abs( ( $current / $total ) ) * 100 ) . '%' : '0%'
241 + 'progress' => $current . '/' . $total,
242 + 'percent' => $total ? round( abs( ( $current / $total ) ) * 100 ) . '%' : '0%'
158 243 );
159 244 wp_send_json_success( $data );
160 245 }
161 246
162 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
163 -
247 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
164 248 }
165 249
166 250 /**
167 251 * Stop bulk optimization
@@ -168,23 +252,22 @@
168 252 */
169 253 public function stop_bulk_optimization() {
170 254
171 255 if ( ! current_user_can( 'manage_options' ) ) {
172 - wp_send_json_error( __( 'You are not allowed to manage plugin settings.', QUICKWEBP_TEXT_DOMAIN ), 403 );
256 + wp_send_json_error( __( 'You are not allowed to manage plugin settings.', 'quickwebp' ), 403 );
173 257 }
174 258
175 259 // verify the nonce.
176 260 $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';
177 261 if( !wp_verify_nonce( $nonce, 'image_optimize_nonce' ) ) {
178 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
262 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
179 263 }
180 264
181 265 if ( $this->clear_bulk_optimization() ) {
182 - wp_send_json_success( __( 'Bulk optimization stopped.', QUICKWEBP_TEXT_DOMAIN ) );
266 + wp_send_json_success( __( 'Bulk optimization stopped.', 'quickwebp' ) );
183 267 }
184 268
185 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
186 -
269 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
187 270 }
188 271
189 272 /**
190 273 * Check bulk optimization progress
@@ -191,15 +274,15 @@
191 274 */
192 275 public function check_bulk_optimization_progress() {
193 276
194 277 if ( ! current_user_can( 'manage_options' ) ) {
195 - wp_send_json_error( __( 'You are not allowed to manage plugin settings.', QUICKWEBP_TEXT_DOMAIN ), 403 );
278 + wp_send_json_error( __( 'You are not allowed to manage plugin settings.', 'quickwebp' ), 403 );
196 279 }
197 280
198 281 // verify the nonce.
199 282 $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';
200 283 if( !wp_verify_nonce( $nonce, 'image_optimize_nonce' ) ) {
201 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
284 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
202 285 }
203 286
204 287 $status = get_option( 'quickwebp_bulk_optimize_status', '' );
205 288 $total = (int)get_option( 'quickwebp_bulk_optimize_total', 0 );
@@ -211,16 +294,14 @@
211 294 'progress' => $current . '/' . $total,
212 295 'percent' => $total ? round( abs( ( $current / $total ) ) * 100 ) . '%' : '0%'
213 296 );
214 297 wp_send_json_success( $data );
215 -
216 298 }
217 299
218 300 /**
219 301 * Clear bulk optimization
220 302 */
221 - public function clear_bulk_optimization() {
222 -
303 + private function clear_bulk_optimization() {
223 304 update_option( 'quickwebp_bulk_optimize_status', 'finish' );
224 305
225 306 if ( wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
226 307 wp_clear_scheduled_hook( 'quickwebp_bulk_optimization_hook' );
@@ -232,26 +313,8 @@
232 313
233 314 /**
234 315 * End cron job
235 316 */
236 - public function end_cron_job() {
237 -
317 + private function end_cron_job() {
238 318 $this->clear_bulk_optimization();
239 - exit;
240 319 }
241 -
242 - /**
243 - * Check whether the plugin preserves original images.
244 - */
245 - private function is_save_original_enabled() {
246 -
247 - $save_original = get_option(
248 - 'quickwebp_settings_conversion_save_original',
249 - quickwebp_settings_default( 'quickwebp_settings_conversion_save_original' )
250 - );
251 -
252 - $save_original = is_array( $save_original ) ? $save_original : array();
253 -
254 - return in_array( 'checked', $save_original, true );
255 - }
256 -
257 320 }