| @@ -169,10 +169,20 @@ | ||
| 169 | 169 | ON ( ngg.pid = data.pid ) |
| 170 | 170 | WHERE |
| 171 | 171 | ( data.status = 'success' OR data.status = 'already_optimized' ) |
| 172 | 172 | AND data.data NOT LIKE %s |
| 173 | + AND data.data NOT LIKE %s | |
| 173 | 174 | ORDER BY ngg.pid DESC", |
| 174 | - '%' . $wpdb->esc_like( $suffix . '";a:4:{s:7:"success";b:1;' ) . '%' | |
| 175 | + '%' . $wpdb->esc_like( $suffix . '";a:4:{s:7:"success";b:1;' ) . '%', | |
| 176 | + /** | |
| 177 | + * Second predicate: skip images the API permanently refused to convert (the next-gen file | |
| 178 | + * would be heavier than the original, or the file is already compressed). Those are stored | |
| 179 | + * as `<size><suffix>";a:3:{s:15:"permanent_error";b:1;s:7:"success";b:0;s:5:"error";…`. | |
| 180 | + * Transient failures serialize as a 2-element array without the `permanent_error` key, so | |
| 181 | + * they keep being retried. Matching serialized data with LIKE is fragile: the key order | |
| 182 | + * written in Imagify\NGG\Optimization\Data\NGG must not change. | |
| 183 | + */ | |
| 184 | + '%' . $wpdb->esc_like( $suffix . '";a:3:{s:15:"permanent_error";b:1;' ) . '%' | |
| 175 | 185 | ) |
| 176 | 186 | ); |
| 177 | 187 | |
| 178 | 188 | $wpdb->flush(); |