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

185 lines 5.5 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\Modules\Oauth\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 Throwable;
26
27 if ( ! defined( 'ABSPATH' ) ) {
28 exit; // Exit if accessed directly.
29 }
30
31 class Bulk_Optimization {
32 const BULK_OPTIMIZATION_BASE_SLUG = 'image-optimization-bulk-optimization';
33 const BULK_OPTIMIZATION_CAPABILITY = 'manage_options';
34
35 public function render_app() {
36 ?>
37 <!-- The hack required to wrap WP notifications -->
38 <div class="wrap">
39 <h1 style="display: none;" role="presentation"></h1>
40 </div>
41
42 <div id="image-optimization-app"></div>
43 <?php
44 }
45
46 public function register_page() {
47 add_media_page(
48 __( 'Bulk Optimization', 'image-optimization' ),
49 __( 'Bulk Optimization', 'image-optimization' ),
50 self::BULK_OPTIMIZATION_CAPABILITY,
51 self::BULK_OPTIMIZATION_BASE_SLUG,
52 [ $this, 'render_app' ],
53 7
54 );
55 }
56
57 /** @async */
58 public function optimize_bulk( int $image_id, string $operation_id ) {
59 try {
60 $bulk_token = Bulk_Optimization_Controller::get_bulk_operation_token( $operation_id );
61
62 $oi = new Optimize_Image(
63 $image_id,
64 'bulk',
65 $bulk_token
66 );
67
68 $oi->optimize();
69 } catch ( Quota_Exceeded_Error $qe ) {
70 ( new Image_Meta( $image_id ) )
71 ->set_status( Image_Status::OPTIMIZATION_FAILED )
72 ->set_error_type( Image_Optimization_Error_Type::QUOTA_EXCEEDED )
73 ->save();
74 } catch ( Image_File_Already_Exists_Error $fe ) {
75 ( new Image_Meta( $image_id ) )
76 ->set_status( Image_Status::OPTIMIZATION_FAILED )
77 ->set_error_type( Image_Optimization_Error_Type::FILE_ALREADY_EXISTS )
78 ->save();
79 } catch ( Bulk_Token_Expired_Error |Bulk_Optimization_Token_Not_Found_Error $bte ) {
80 ( new Image_Meta( $image_id ) )
81 ->set_status( Image_Status::NOT_OPTIMIZED )
82 ->save();
83
84 Bulk_Optimization_Controller::reschedule_bulk_optimization();
85 } catch ( Throwable $t ) {
86 Logger::log( Logger::LEVEL_ERROR, 'Optimization error. Reason: ' . $t->getMessage() );
87
88 ( new Image_Meta( $image_id ) )
89 ->set_status( Image_Status::OPTIMIZATION_FAILED )
90 ->set_error_type( Image_Optimization_Error_Type::GENERIC )
91 ->save();
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 );
111
112 $oi->optimize();
113 } catch ( Quota_Exceeded_Error $qe ) {
114 ( new Image_Meta( $image_id ) )
115 ->set_status( Image_Status::REOPTIMIZING_FAILED )
116 ->set_error_type( Image_Optimization_Error_Type::QUOTA_EXCEEDED )
117 ->save();
118 } catch ( Image_File_Already_Exists_Error $fe ) {
119 ( new Image_Meta( $image_id ) )
120 ->set_status( Image_Status::REOPTIMIZING_FAILED )
121 ->set_error_type( Image_Optimization_Error_Type::FILE_ALREADY_EXISTS )
122 ->save();
123 } catch ( Bulk_Token_Expired_Error |Bulk_Optimization_Token_Not_Found_Error $bte ) {
124 ( new Image_Meta( $image_id ) )
125 ->set_status( Image_Status::NOT_OPTIMIZED )
126 ->save();
127
128 Bulk_Optimization_Controller::reschedule_bulk_reoptimization();
129 } catch ( Throwable $t ) {
130 Logger::log( Logger::LEVEL_ERROR, 'Reoptimization error. Reason: ' . $t->getMessage() );
131
132 ( new Image_Meta( $image_id ) )
133 ->set_status( Image_Status::REOPTIMIZING_FAILED )
134 ->set_error_type( Image_Optimization_Error_Type::GENERIC )
135 ->save();
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