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

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