| @@ -185,10 +185,20 @@ | ||
| 185 | 185 | WHERE |
| 186 | 186 | fi.mime_type IN ( $mime_types ) |
| 187 | 187 | AND ( fi.status = 'success' OR fi.status = 'already_optimized' ) |
| 188 | 188 | AND fi.data NOT LIKE %s |
| 189 | + AND fi.data NOT LIKE %s | |
| 189 | 190 | ORDER BY fi.file_id DESC", |
| 190 | - '%' . $wpdb->esc_like( $nextgen_suffix . '";a:4:{s:7:"success";b:1;' ) . '%' | |
| 191 | + '%' . $wpdb->esc_like( $nextgen_suffix . '";a:4:{s:7:"success";b:1;' ) . '%', | |
| 192 | + /** | |
| 193 | + * Second predicate: skip files the API permanently refused to convert (the next-gen file | |
| 194 | + * would be heavier than the original, or the file is already compressed). Those are stored | |
| 195 | + * as `<size><suffix>";a:3:{s:15:"permanent_error";b:1;s:7:"success";b:0;s:5:"error";…`. | |
| 196 | + * Transient failures serialize as a 2-element array without the `permanent_error` key, so | |
| 197 | + * they keep being retried. Matching serialized data with LIKE is fragile: the key order | |
| 198 | + * written in Optimization\Data\CustomFolders must not change. | |
| 199 | + */ | |
| 200 | + '%' . $wpdb->esc_like( $nextgen_suffix . '";a:3:{s:15:"permanent_error";b:1;' ) . '%' | |
| 191 | 201 | ) |
| 192 | 202 | ); |
| 193 | 203 | |
| 194 | 204 | $wpdb->flush(); |