PluginProbe
Image Optimization – Compress Images and Convert to WebP or AVIF / 1.6.6
Image Optimization – Compress Images and Convert to WebP or AVIF v1.6.6
1.7.6 1.7.5 1.7.4 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.2.0 1.2.1 1.3.0 1.4.0 1.4.1 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 All 32 releases
image-optimization / modules / optimization / components / bulk-optimization.php

bulk-optimization.php in Image Optimization – Compress Images and Convert to WebP or AVIF 1.6.6, at modules/optimization/components/bulk-optimization.php

185 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace ImageOptimization\Modules\Optimization\Components;
4
5 use ImageOptimization\Classes\Async_Operation\Async_Operation_Hook;
6 use ImageOptimization\Classes\Image\{
7 Image,
8 Image_Meta,
9 Image_Optimization_Error_Type,
10 Image_Restore,
11 Image_Status
12 };
13 use ImageOptimization\Classes\Async_Operation\Exceptions\Async_Operation_Exception;
14 use ImageOptimization\Classes\Logger;
15 use ImageOptimization\Classes\Utils;
16 use ImageOptimization\Classes\Exceptions\Quota_Exceeded_Error;
17 use ImageOptimization\Modules\Optimization\{
18 Classes\Exceptions\Bulk_Token_Expired_Error,
19 Classes\Exceptions\Image_File_Already_Exists_Error,
20 Classes\Optimize_Image,
21 Classes\Bulk_Optimization_Controller,
22 Components\Exceptions\Bulk_Optimization_Token_Not_Found_Error,
23 };
24
25 use ImageOptimization\Modules\Stats\Classes\Optimization_Stats;
26 use Throwable;
27
28 if ( ! defined( 'ABSPATH' ) ) {
29 exit; // Exit if accessed directly.
30 }
31
32 class Bulk_Optimization {
33 const BULK_OPTIMIZATION_BASE_SLUG = 'image-optimization-bulk-optimization';
34 const BULK_OPTIMIZATION_CAPABILITY = 'manage_options';
35
36 public function render_app() {
37 ?>
38 <!-- The hack required to wrap WP notifications -->
39 <div class="wrap">
40 <h1 style="display: none;" role="presentation"></h1>
41 </div>
42
43 <div id="image-optimization-app"></div>
44 <?php
45 }
46
47 public function register_page() {
48 add_media_page(
49 __( 'Bulk Optimization', 'image-optimization' ),
50 __( 'Bulk Optimization', 'image-optimization' ),
51 self::BULK_OPTIMIZATION_CAPABILITY,
52 self::BULK_OPTIMIZATION_BASE_SLUG,
53 [ $this, 'render_app' ],
54 7
55 );
56 }
57
58 /** @async */
59 public function optimize_bulk( int $image_id, string $operation_id ) {
60 try {
61 $bulk_token = Bulk_Optimization_Controller::get_bulk_operation_token( $operation_id );
62
63 $oi = new Optimize_Image(
64 $image_id,
65 'bulk',
66 $bulk_token
67 );
68
69 $oi->optimize();
70 } catch ( Quota_Exceeded_Error $qe ) {
71 ( new Image_Meta( $image_id ) )
72 ->set_status( Image_Status::OPTIMIZATION_FAILED )
73 ->set_error_type( Image_Optimization_Error_Type::QUOTA_EXCEEDED )
74 ->save();
75 } catch ( Image_File_Already_Exists_Error $fe ) {
76 ( new Image_Meta( $image_id ) )
77 ->set_status( Image_Status::OPTIMIZATION_FAILED )
78 ->set_error_type( Image_Optimization_Error_Type::FILE_ALREADY_EXISTS )
79 ->save();
80 } catch ( Bulk_Token_Expired_Error |Bulk_Optimization_Token_Not_Found_Error $bte ) {
81 ( new Image_Meta( $image_id ) )
82 ->set_status( Image_Status::NOT_OPTIMIZED )
83 ->save();
84
85 Bulk_Optimization_Controller::reschedule_bulk_optimization();
86 } catch ( Throwable $t ) {
87 Logger::log( Logger::LEVEL_ERROR, 'Optimization error. Reason: ' . $t->getMessage() );
88
89 Retry::maybe_retry_optimization( $image_id );
90 } finally {
91 Optimization_Stats::get_image_stats( null, true );
92 }
93 }
94
95 /** @async */
96 public function reoptimize_bulk( int $image_id, string $operation_id ) {
97 try {
98 $image = new Image( $image_id );
99
100 if ( $image->can_be_restored() ) {
101 Image_Restore::restore( $image_id, true );
102 }
103
104 $bulk_token = Bulk_Optimization_Controller::get_bulk_operation_token( $operation_id );
105
106 $oi = new Optimize_Image(
107 $image_id,
108 'bulk',
109 $bulk_token,
110 true
111 );
112
113 $oi->optimize();
114 } catch ( Quota_Exceeded_Error $qe ) {
115 ( new Image_Meta( $image_id ) )
116 ->set_status( Image_Status::REOPTIMIZING_FAILED )
117 ->set_error_type( Image_Optimization_Error_Type::QUOTA_EXCEEDED )
118 ->save();
119 } catch ( Image_File_Already_Exists_Error $fe ) {
120 ( new Image_Meta( $image_id ) )
121 ->set_status( Image_Status::REOPTIMIZING_FAILED )
122 ->set_error_type( Image_Optimization_Error_Type::FILE_ALREADY_EXISTS )
123 ->save();
124 } catch ( Bulk_Token_Expired_Error |Bulk_Optimization_Token_Not_Found_Error $bte ) {
125 ( new Image_Meta( $image_id ) )
126 ->set_status( Image_Status::NOT_OPTIMIZED )
127 ->save();
128
129 Bulk_Optimization_Controller::reschedule_bulk_reoptimization();
130 } catch ( Throwable $t ) {
131 Logger::log( Logger::LEVEL_ERROR, 'Reoptimization error. Reason: ' . $t->getMessage() );
132
133 Retry::maybe_retry_optimization( $image_id );
134 } finally {
135 Optimization_Stats::get_image_stats( null, true );
136 }
137 }
138
139 /**
140 * Renders the bulk optimization notice
141 *
142 * @return void
143 */
144 public function render_bulk_optimization_notice() {
145 try {
146 $is_in_progress = Bulk_Optimization_Controller::is_optimization_in_progress();
147 } catch ( Async_Operation_Exception $aoe ) {
148 $is_in_progress = false;
149 }
150 ?>
151 <div class="notice notice-info notice image-optimizer__notice image-optimizer__notice--info image-optimizer__notice--bulk-tip"
152 style="display: <?php echo $is_in_progress ? 'block' : 'none'; ?>">
153 <p>
154 <b>
155 <?php esc_html_e(
156 'Heads up!',
157 'image-optimization'
158 ); ?>
159 </b>
160
161 <span>
162 <?php esc_html_e(
163 'Bulk optimizing may take a lot of processing and server time, depending on the number of images. Your site will still work smoothly until the processing is all done, without any downtime.',
164 'image-optimization'
165 ); ?>
166 </span>
167 </p>
168 </div>
169 <?php
170 }
171
172 public function __construct() {
173 add_action( 'admin_menu', [ $this, 'register_page' ] );
174
175 add_action( Async_Operation_Hook::OPTIMIZE_BULK, [ $this, 'optimize_bulk' ], 10, 2 );
176 add_action( Async_Operation_Hook::REOPTIMIZE_BULK, [ $this, 'reoptimize_bulk' ], 10, 2 );
177
178 add_action('current_screen', function () {
179 if ( Utils::is_bulk_optimization_page() ) {
180 add_filter( 'admin_footer_text', [ $this, 'render_bulk_optimization_notice' ] );
181 }
182 });
183 }
184 }
185