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 +144 -46 3.2.34.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,38 +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 - $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
64 - $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids();
67 + $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
68 + $settings = $quickwebp_image_optimizer->get_settings();
65 69
70 + $mode_enabled = $settings['quickwebp_settings_conversion'];
71 + if ( '0' === $mode_enabled ) {
72 + $this->end_cron_job();
73 + $this->release_bulk_optimization_lock( $lock_token );
74 + return;
75 + }
76 +
77 + $media_ids = $quickwebp_image_optimizer->get_unoptimized_media_ids( 5 );
66 78 if ( empty( $media_ids ) ) {
67 79 $this->end_cron_job();
80 + $this->release_bulk_optimization_lock( $lock_token );
81 + return;
68 82 }
69 83
70 84 $status = get_option( 'quickwebp_bulk_optimize_status', 'finish' );
71 -
72 85 if ( $status != 'running' ) {
73 86 $this->end_cron_job();
87 + $this->release_bulk_optimization_lock( $lock_token );
88 + return;
74 89 }
75 -
76 - $total = (int)get_option( 'quickwebp_bulk_optimize_total', 0 );
77 - $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 + );
78 97
79 98 foreach ( $media_ids as $id ) {
80 -
81 - if ( $time_start + 55 < microtime(true) ) {
82 - exit;
99 + if ( $time_start + 55 < microtime( true ) ) {
100 + break;
83 101 }
84 102
85 - $sizes = $quickwebp_image_optimizer->get_media_files( $id );
86 - $new_sizes = array();
103 + $sizes = $quickwebp_image_optimizer->get_media_files( $id );
104 + $new_sizes = array();
87 105
88 106 foreach ( $sizes as $key => $size ) {
89 -
90 107 $result = $quickwebp_image_optimizer->optimize_local_file( $size );
91 108
92 109 if ( $result ) {
93 110 $new_sizes[$key] = $result;
@@ -94,62 +111,141 @@
94 111 }
95 112 }
96 113
97 114 if ( ! empty( $new_sizes ) ) {
98 - 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 +
99 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' );
100 137 }
101 138
102 139 $current++;
103 - update_option( 'quickwebp_bulk_optimize_current', $current );
104 140 }
105 141
106 - $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 + }
107 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 );
108 157 }
109 158
110 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 + /**
111 199 * Start bulk optimization
112 200 */
113 201 public function start_bulk_optimization() {
114 202
203 + if ( ! current_user_can( 'manage_options' ) ) {
204 + wp_send_json_error( __( 'You are not allowed to manage plugin settings.', 'quickwebp' ), 403 );
205 + }
206 +
115 207 // verify the nonce.
116 - $nonce = isset($_POST['nonce']) ? $_POST['nonce'] : '';
208 + $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';
117 209 if( !wp_verify_nonce( $nonce, 'image_optimize_nonce' ) ) {
118 - 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' ) );
119 211 }
120 212
121 - $quickwebp_image_optimizer = new Quickwebp_Image_Optimizer( QUICKWEBP_TEXT_DOMAIN, QUICKWEBP_VERSION );
122 - $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();
123 215
124 - if ( empty( $media_ids ) ) {
125 - wp_send_json_error( __( 'No images to optimize.', 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' ) );
126 219 }
127 220
221 + $total = $quickwebp_image_optimizer->get_unoptimized_media_count();
222 + if ( ! $total ) {
223 + wp_send_json_error( __( 'No images to optimize.', 'quickwebp' ) );
224 + }
225 +
128 226 $status = get_option( 'quickwebp_bulk_optimize_status', 'finish' );
129 227 if ( $status != 'finish' ) {
130 - wp_send_json_error( __( 'Bulk optimization is already running.', QUICKWEBP_TEXT_DOMAIN ) );
228 + wp_send_json_error( __( 'Bulk optimization is already running.', 'quickwebp' ) );
131 229 }
132 230
133 - if ( !wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
231 + if ( ! wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
134 232 wp_schedule_event( time(), 'bulk_optimization', 'quickwebp_bulk_optimization_hook' );
135 233
136 - $total = count( $media_ids );
137 - $current = 0;
234 + $current = 0;
138 235
139 - update_option( 'quickwebp_bulk_optimize_total', count( $media_ids ) );
236 + update_option( 'quickwebp_bulk_optimize_total', $total );
140 237 update_option( 'quickwebp_bulk_optimize_current', $current );
141 238 update_option( 'quickwebp_bulk_optimize_status', 'running' );
142 239
143 240 $data = array(
144 - 'progress' => $current . '/' . $total,
145 - 'percent' => $total ? round( abs( ( $current / $total ) ) * 100 ) . '%' : '0%'
241 + 'progress' => $current . '/' . $total,
242 + 'percent' => $total ? round( abs( ( $current / $total ) ) * 100 ) . '%' : '0%'
146 243 );
147 244 wp_send_json_success( $data );
148 245 }
149 246
150 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
151 -
247 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
152 248 }
153 249
154 250 /**
155 251 * Stop bulk optimization
@@ -154,21 +250,24 @@
154 250 /**
155 251 * Stop bulk optimization
156 252 */
157 253 public function stop_bulk_optimization() {
254 +
255 + if ( ! current_user_can( 'manage_options' ) ) {
256 + wp_send_json_error( __( 'You are not allowed to manage plugin settings.', 'quickwebp' ), 403 );
257 + }
158 258
159 259 // verify the nonce.
160 - $nonce = isset($_POST['nonce']) ? $_POST['nonce'] : '';
260 + $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';
161 261 if( !wp_verify_nonce( $nonce, 'image_optimize_nonce' ) ) {
162 - 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' ) );
163 263 }
164 264
165 265 if ( $this->clear_bulk_optimization() ) {
166 - wp_send_json_success( __( 'Bulk optimization stopped.', QUICKWEBP_TEXT_DOMAIN ) );
266 + wp_send_json_success( __( 'Bulk optimization stopped.', 'quickwebp' ) );
167 267 }
168 268
169 - wp_send_json_error( __( 'Refresh the page and try again.', QUICKWEBP_TEXT_DOMAIN ) );
170 -
269 + wp_send_json_error( __( 'Refresh the page and try again.', 'quickwebp' ) );
171 270 }
172 271
173 272 /**
174 273 * Check bulk optimization progress
@@ -174,12 +273,16 @@
174 273 * Check bulk optimization progress
175 274 */
176 275 public function check_bulk_optimization_progress() {
177 276
277 + if ( ! current_user_can( 'manage_options' ) ) {
278 + wp_send_json_error( __( 'You are not allowed to manage plugin settings.', 'quickwebp' ), 403 );
279 + }
280 +
178 281 // verify the nonce.
179 - $nonce = isset($_POST['nonce']) ? $_POST['nonce'] : '';
282 + $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : '';
180 283 if( !wp_verify_nonce( $nonce, 'image_optimize_nonce' ) ) {
181 - 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' ) );
182 285 }
183 286
184 287 $status = get_option( 'quickwebp_bulk_optimize_status', '' );
185 288 $total = (int)get_option( 'quickwebp_bulk_optimize_total', 0 );
@@ -191,16 +294,14 @@
191 294 'progress' => $current . '/' . $total,
192 295 'percent' => $total ? round( abs( ( $current / $total ) ) * 100 ) . '%' : '0%'
193 296 );
194 297 wp_send_json_success( $data );
195 -
196 298 }
197 299
198 300 /**
199 301 * Clear bulk optimization
200 302 */
201 - public function clear_bulk_optimization() {
202 -
303 + private function clear_bulk_optimization() {
203 304 update_option( 'quickwebp_bulk_optimize_status', 'finish' );
204 305
205 306 if ( wp_next_scheduled( 'quickwebp_bulk_optimization_hook' ) ) {
206 307 wp_clear_scheduled_hook( 'quickwebp_bulk_optimization_hook' );
@@ -212,11 +313,8 @@
212 313
213 314 /**
214 315 * End cron job
215 316 */
216 - public function end_cron_job() {
217 -
317 + private function end_cron_job() {
218 318 $this->clear_bulk_optimization();
219 - exit;
220 319 }
221 -
222 320 }