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

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