PluginProbe
Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF / trunk
Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF vtrunk
2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.9 2.2.8 trunk 1.10 1.3.3 1.3.4 1.3.5 1.3.5.1 1.3.5.2 1.3.6 1.3.6.1 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.5 All 103 releases
imagify / classes / Optimization / Data / WP.php

WP.php in Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF trunk, at classes/Optimization/Data/WP.php

220 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Imagify\Optimization\Data;
3
4 /**
5 * Optimization data class for the medias in the WP library.
6 * This class constructor accepts:
7 * - A post ID (int).
8 * - A \WP_Post object.
9 * - A \Imagify\Media\MediaInterface object.
10 *
11 * @since 1.9
12 * @author Grégory Viguier
13 */
14 class WP extends AbstractData {
15
16 /**
17 * Get the whole media optimization data.
18 *
19 * @since 1.9
20 * @access public
21 * @author Grégory Viguier
22 *
23 * @return array The data. See parent method for details.
24 */
25 public function get_optimization_data() {
26 if ( ! $this->is_valid() ) {
27 return $this->default_optimization_data;
28 }
29
30 $id = $this->get_media()->get_id();
31
32 $data = get_post_meta( $id, '_imagify_data', true );
33 $data = is_array( $data ) ? $data : [];
34
35 if ( isset( $data['sizes'] ) && ! is_array( $data['sizes'] ) ) {
36 $data['sizes'] = [];
37 }
38
39 if ( isset( $data['stats'] ) && ! is_array( $data['stats'] ) ) {
40 $data['stats'] = [];
41 }
42
43 $data = array_merge( $this->default_optimization_data, $data );
44
45 $data['status'] = get_post_meta( $id, '_imagify_status', true );
46 $data['status'] = is_string( $data['status'] ) ? $data['status'] : '';
47
48 $data['level'] = get_post_meta( $id, '_imagify_optimization_level', true );
49 $data['level'] = is_numeric( $data['level'] ) ? (int) $data['level'] : false;
50
51 return $data;
52 }
53
54 /**
55 * Update the optimization data, level, and status for a size.
56 *
57 * @since 1.9
58 * @access public
59 * @author Grégory Viguier
60 *
61 * @param string $size The size name.
62 * @param array $data The optimization data. See parent method for details.
63 */
64 public function update_size_optimization_data( $size, array $data ) {
65 if ( ! $this->is_valid() ) {
66 return;
67 }
68
69 $id = $this->get_media()->get_id();
70
71 if ( 'full' === $size ) {
72 // Optimization level.
73 update_post_meta( $id, '_imagify_optimization_level', $data['level'] );
74 // Optimization status.
75 update_post_meta( $id, '_imagify_status', $data['status'] );
76 }
77
78 // Size data and stats.
79 $old_data = get_post_meta( $id, '_imagify_data', true );
80 $old_data = is_array( $old_data ) ? $old_data : [];
81
82 if ( ! isset( $old_data['sizes'] ) || ! is_array( $old_data['sizes'] ) ) {
83 $old_data['sizes'] = [];
84 }
85
86 if ( ! isset( $old_data['stats'] ) || ! is_array( $old_data['stats'] ) ) {
87 $old_data['stats'] = [];
88 }
89
90 $old_data['stats'] = array_merge(
91 [
92 'original_size' => 0,
93 'optimized_size' => 0,
94 'percent' => 0,
95 'message' => '',
96 ],
97 $old_data['stats']
98 );
99
100 if ( key_exists( 'message', $data ) ) {
101 $old_data['message'] = $data['message'];
102 }
103
104 if ( ! $data['success'] ) {
105 /**
106 * Error.
107 */
108 $size_data = [
109 'success' => false,
110 'error' => $data['error'],
111 ];
112
113 if ( ! empty( $data['permanent_error'] ) ) {
114 /**
115 * `permanent_error` is written as the FIRST key on purpose: the bulk queries match the
116 * serialized meta value with a LIKE on the `<size>";a:3:{s:15:"permanent_error";b:1;`
117 * prefix, which only stays deterministic if the key order does.
118 */
119 $size_data = array_merge( [ 'permanent_error' => true ], $size_data );
120 }
121
122 $old_data['sizes'][ $size ] = $size_data;
123 } else {
124 /**
125 * Success.
126 */
127 $old_data['sizes'][ $size ] = [
128 'success' => true,
129 'original_size' => $data['original_size'],
130 'optimized_size' => $data['optimized_size'],
131 'percent' => round( ( ( $data['original_size'] - $data['optimized_size'] ) / $data['original_size'] ) * 100, 2 ),
132 ];
133
134 $old_data['stats']['original_size'] += $data['original_size'];
135 $old_data['stats']['optimized_size'] += $data['optimized_size'];
136 $old_data['stats']['percent'] = round( ( ( $old_data['stats']['original_size'] - $old_data['stats']['optimized_size'] ) / $old_data['stats']['original_size'] ) * 100, 2 );
137 }
138
139 update_post_meta( $id, '_imagify_data', $old_data );
140 }
141
142 /**
143 * Delete the media optimization data, level, and status.
144 *
145 * @since 1.9
146 * @access public
147 * @author Grégory Viguier
148 */
149 public function delete_optimization_data() {
150 if ( ! $this->is_valid() ) {
151 return;
152 }
153
154 $id = $this->get_media()->get_id();
155
156 delete_post_meta( $id, '_imagify_data' );
157 delete_post_meta( $id, '_imagify_status' );
158 delete_post_meta( $id, '_imagify_optimization_level' );
159 }
160
161 /**
162 * Delete the optimization data for the given sizes.
163 * If all sizes are removed, all optimization data is deleted.
164 * Status and level are not modified nor removed if the "full" size is removed. This leaves the media in a Schrödinger state.
165 *
166 * @since 1.9.8
167 * @access public
168 * @author Grégory Viguier
169 *
170 * @param array $sizes A list of sizes to remove.
171 */
172 public function delete_sizes_optimization_data( array $sizes ) {
173 if ( ! $sizes || ! $this->is_valid() ) {
174 return;
175 }
176
177 $media_id = $this->get_media()->get_id();
178 $data = get_post_meta( $media_id, '_imagify_data', true );
179
180 if ( empty( $data['sizes'] ) || ! is_array( $data['sizes'] ) ) {
181 return;
182 }
183
184 $remaining_sizes_data = array_diff_key( $data['sizes'], array_flip( $sizes ) );
185
186 if ( ! $remaining_sizes_data ) {
187 // All sizes have been removed: delete everything.
188 $this->delete_optimization_data();
189 return;
190 }
191
192 if ( count( $remaining_sizes_data ) === count( $data['sizes'] ) ) {
193 // Nothing has been removed.
194 return;
195 }
196
197 $data['sizes'] = $remaining_sizes_data;
198
199 // Update stats.
200 $data['stats'] = [
201 'original_size' => 0,
202 'optimized_size' => 0,
203 'percent' => 0,
204 ];
205
206 foreach ( $data['sizes'] as $size_data ) {
207 if ( empty( $size_data['success'] ) ) {
208 continue;
209 }
210
211 $data['stats']['original_size'] += $size_data['original_size'];
212 $data['stats']['optimized_size'] += $size_data['optimized_size'];
213 }
214
215 $data['stats']['percent'] = round( ( ( $data['stats']['original_size'] - $data['stats']['optimized_size'] ) / $data['stats']['original_size'] ) * 100, 2 );
216
217 update_post_meta( $media_id, '_imagify_data', $data );
218 }
219 }
220