PluginProbe
Image Optimizer – Compress Images and Convert to WebP or AVIF / 1.5.4
Image Optimizer – Compress Images and Convert to WebP or AVIF v1.5.4
1.7.7 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 All 33 releases
image-optimization / modules / optimization / components / bulk-optimization.php

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

191 lines 5.7 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 ( new Image_Meta( $image_id ) )
90 ->set_status( Image_Status::OPTIMIZATION_FAILED )
91 ->set_error_type( Image_Optimization_Error_Type::GENERIC )
92 ->save();
93 } finally {
94 Optimization_Stats::get_image_stats( null, true );
95 }
96 }
97
98 /** @async */
99 public function reoptimize_bulk( int $image_id, string $operation_id ) {
100 try {
101 $image = new Image( $image_id );
102
103 if ( $image->can_be_restored() ) {
104 Image_Restore::restore( $image_id, true );
105 }
106
107 $bulk_token = Bulk_Optimization_Controller::get_bulk_operation_token( $operation_id );
108
109 $oi = new Optimize_Image(
110 $image_id,
111 'bulk',
112 $bulk_token,
113 true
114 );
115
116 $oi->optimize();
117 } catch ( Quota_Exceeded_Error $qe ) {
118 ( new Image_Meta( $image_id ) )
119 ->set_status( Image_Status::REOPTIMIZING_FAILED )
120 ->set_error_type( Image_Optimization_Error_Type::QUOTA_EXCEEDED )
121 ->save();
122 } catch ( Image_File_Already_Exists_Error $fe ) {
123 ( new Image_Meta( $image_id ) )
124 ->set_status( Image_Status::REOPTIMIZING_FAILED )
125 ->set_error_type( Image_Optimization_Error_Type::FILE_ALREADY_EXISTS )
126 ->save();
127 } catch ( Bulk_Token_Expired_Error |Bulk_Optimization_Token_Not_Found_Error $bte ) {
128 ( new Image_Meta( $image_id ) )
129 ->set_status( Image_Status::NOT_OPTIMIZED )
130 ->save();
131
132 Bulk_Optimization_Controller::reschedule_bulk_reoptimization();
133 } catch ( Throwable $t ) {
134 Logger::log( Logger::LEVEL_ERROR, 'Reoptimization error. Reason: ' . $t->getMessage() );
135
136 ( new Image_Meta( $image_id ) )
137 ->set_status( Image_Status::REOPTIMIZING_FAILED )
138 ->set_error_type( Image_Optimization_Error_Type::GENERIC )
139 ->save();
140 } finally {
141 Optimization_Stats::get_image_stats( null, true );
142 }
143 }
144
145 /**
146 * Renders the bulk optimization notice
147 *
148 * @return void
149 */
150 public function render_bulk_optimization_notice() {
151 try {
152 $is_in_progress = Bulk_Optimization_Controller::is_optimization_in_progress();
153 } catch ( Async_Operation_Exception $aoe ) {
154 $is_in_progress = false;
155 }
156 ?>
157 <div class="notice notice-info notice image-optimizer__notice image-optimizer__notice--info image-optimizer__notice--bulk-tip"
158 style="display: <?php echo $is_in_progress ? 'block' : 'none'; ?>">
159 <p>
160 <b>
161 <?php esc_html_e(
162 'Heads up!',
163 'image-optimization'
164 ); ?>
165 </b>
166
167 <span>
168 <?php esc_html_e(
169 '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.',
170 'image-optimization'
171 ); ?>
172 </span>
173 </p>
174 </div>
175 <?php
176 }
177
178 public function __construct() {
179 add_action( 'admin_menu', [ $this, 'register_page' ] );
180
181 add_action( Async_Operation_Hook::OPTIMIZE_BULK, [ $this, 'optimize_bulk' ], 10, 2 );
182 add_action( Async_Operation_Hook::REOPTIMIZE_BULK, [ $this, 'reoptimize_bulk' ], 10, 2 );
183
184 add_action('current_screen', function () {
185 if ( Utils::is_bulk_optimization_page() ) {
186 add_filter( 'admin_footer_text', [ $this, 'render_bulk_optimization_notice' ] );
187 }
188 });
189 }
190 }
191