PluginProbe
Image Optimizer – Compress Images and Convert to WebP or AVIF / 1.5.0
Image Optimizer – Compress Images and Convert to WebP or AVIF v1.5.0
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.0, at modules/optimization/components/bulk-optimization.php

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