PluginProbe
Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF / 2.3.0
Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF v2.3.0
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 2.3.0, at classes/Optimization/Data/WP.php

209 lines 5.5 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 $old_data['sizes'][ $size ] = [
109 'success' => false,
110 'error' => $data['error'],
111 ];
112 } else {
113 /**
114 * Success.
115 */
116 $old_data['sizes'][ $size ] = [
117 'success' => true,
118 'original_size' => $data['original_size'],
119 'optimized_size' => $data['optimized_size'],
120 'percent' => round( ( ( $data['original_size'] - $data['optimized_size'] ) / $data['original_size'] ) * 100, 2 ),
121 ];
122
123 $old_data['stats']['original_size'] += $data['original_size'];
124 $old_data['stats']['optimized_size'] += $data['optimized_size'];
125 $old_data['stats']['percent'] = round( ( ( $old_data['stats']['original_size'] - $old_data['stats']['optimized_size'] ) / $old_data['stats']['original_size'] ) * 100, 2 );
126 }
127
128 update_post_meta( $id, '_imagify_data', $old_data );
129 }
130
131 /**
132 * Delete the media optimization data, level, and status.
133 *
134 * @since 1.9
135 * @access public
136 * @author Grégory Viguier
137 */
138 public function delete_optimization_data() {
139 if ( ! $this->is_valid() ) {
140 return;
141 }
142
143 $id = $this->get_media()->get_id();
144
145 delete_post_meta( $id, '_imagify_data' );
146 delete_post_meta( $id, '_imagify_status' );
147 delete_post_meta( $id, '_imagify_optimization_level' );
148 }
149
150 /**
151 * Delete the optimization data for the given sizes.
152 * If all sizes are removed, all optimization data is deleted.
153 * Status and level are not modified nor removed if the "full" size is removed. This leaves the media in a Schrödinger state.
154 *
155 * @since 1.9.8
156 * @access public
157 * @author Grégory Viguier
158 *
159 * @param array $sizes A list of sizes to remove.
160 */
161 public function delete_sizes_optimization_data( array $sizes ) {
162 if ( ! $sizes || ! $this->is_valid() ) {
163 return;
164 }
165
166 $media_id = $this->get_media()->get_id();
167 $data = get_post_meta( $media_id, '_imagify_data', true );
168
169 if ( empty( $data['sizes'] ) || ! is_array( $data['sizes'] ) ) {
170 return;
171 }
172
173 $remaining_sizes_data = array_diff_key( $data['sizes'], array_flip( $sizes ) );
174
175 if ( ! $remaining_sizes_data ) {
176 // All sizes have been removed: delete everything.
177 $this->delete_optimization_data();
178 return;
179 }
180
181 if ( count( $remaining_sizes_data ) === count( $data['sizes'] ) ) {
182 // Nothing has been removed.
183 return;
184 }
185
186 $data['sizes'] = $remaining_sizes_data;
187
188 // Update stats.
189 $data['stats'] = [
190 'original_size' => 0,
191 'optimized_size' => 0,
192 'percent' => 0,
193 ];
194
195 foreach ( $data['sizes'] as $size_data ) {
196 if ( empty( $size_data['success'] ) ) {
197 continue;
198 }
199
200 $data['stats']['original_size'] += $size_data['original_size'];
201 $data['stats']['optimized_size'] += $size_data['optimized_size'];
202 }
203
204 $data['stats']['percent'] = round( ( ( $data['stats']['original_size'] - $data['stats']['optimized_size'] ) / $data['stats']['original_size'] ) * 100, 2 );
205
206 update_post_meta( $media_id, '_imagify_data', $data );
207 }
208 }
209