PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.7.2
Admin and Site Enhancements (ASE) v4.7.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / classes / class-optimizations.php
admin-site-enhancements / classes Last commit date
class-activation.php 3 years ago class-admin-interface.php 3 years ago class-common-methods.php 3 years ago class-content-management.php 3 years ago class-custom-code.php 3 years ago class-deactivation.php 3 years ago class-disable-components.php 3 years ago class-login-logout.php 3 years ago class-optimizations.php 3 years ago class-security.php 3 years ago class-settings-fields-render.php 3 years ago class-settings-sanitization.php 3 years ago class-settings-sections-fields.php 3 years ago class-utilities.php 3 years ago
class-optimizations.php
283 lines
1 <?php
2
3 namespace ASENHA\Classes;
4
5 /**
6 * Class related to Optimizations features
7 *
8 * @since 3.8.0
9 */
10 class Optimizations {
11
12 private $current_url_path;
13
14 /**
15 * Handler for image uploads. Convert and resize images.
16 *
17 * @since 4.3.0
18 */
19 public function image_upload_handler( $upload ) {
20
21 // Exlude from conversion and resizing images with filenames ending with '-nr', e.g. birds-nr.png
22 if ( false !== strpos( $upload['file'], '-nr.' ) ) {
23 return $upload;
24 }
25
26 // Convert BMP into JPG
27 if ( ( 'image/bmp' === $upload['type'] || 'image/x-ms-bmp' === $upload['type'] ) ) {
28 $upload = $this->convert_image_to_jpg( 'bmp', $upload );
29 }
30
31 // Convert PNG without transparency into JPG
32 if ( 'image/png' === $upload['type'] ) {
33 $upload = $this->convert_image_to_jpg( 'png', $upload );
34 }
35
36 // At this point, BMPs and PNGs are already converted to JPGs, unless excluded with '-nr' suffix.
37 // So, we will only resize JPGs
38 $mime_types_to_resize = array( 'image/jpeg', 'image/jpg' );
39
40 if (
41 ( ! is_wp_error( $upload ) &&
42 in_array( $upload['type'], $mime_types_to_resize ) &&
43 filesize( $upload['file'] > 0 ) )
44 ) {
45
46 }
47
48 do_action( 'inspect', [ 'file', $upload['file'] ] );
49 do_action( 'inspect', [ 'type', $upload['type'] ] );
50
51 // https://developer.wordpress.org/reference/classes/wp_image_editor/
52 $wp_image_editor = wp_get_image_editor( $upload['file'] );
53 $image_size = $wp_image_editor->get_size();
54
55 // do_action( 'inspect', [ 'wp_image_editor', $wp_image_editor ] );
56 do_action( 'inspect', [ 'image_size', $image_size ] );
57
58 $options = get_option( ASENHA_SLUG_U, array() );
59 $max_width = $options['image_max_width'];
60 $max_height = $options['image_max_height'];
61
62 // Check upload image's dimension and only resize if larger than the defined max dimension
63 if (
64 ( isset( $image_size['width'] ) && $image_size['width'] > $max_width ) ||
65 ( isset( $image_size['height'] ) && $image_size['height'] > $max_height )
66 ) {
67 $wp_image_editor->resize( $max_width, $max_height, false ); // false is for no cropping
68 $wp_image_editor->set_quality( 90 ); // default is 82
69 $wp_image_editor->save( $upload['file'] );
70 }
71
72 return $upload;
73
74 }
75
76 /**
77 * Convert BMP or PNG without transparency into JPG
78 *
79 * @since 4.3.0
80 */
81 public function convert_image_to_jpg( $file_extension, $upload ) {
82
83 $image_object = null;
84
85 // Get image object from uploaded BMP/PNG
86
87 if ( 'bmp' === $file_extension ) {
88 // Generate image object from BMP for conversion to JPG later
89 if ( function_exists( 'imagecreatefrombmp' ) ) { // PHP >= v7.2
90 $image_object = imagecreatefrombmp( $upload['file'] );
91 } else { // PHP < v7.2
92 require_once ASENHA_PATH . 'includes/bmp-to-image-object.php';
93 $image_object = bmp_to_image_object( $upload['file'] );
94 }
95 }
96
97 if ( 'png' === $file_extension ) {
98
99 // Detect alpha/transparency in PNG
100 $png_has_transparency = false;
101
102 // We assume GD library is present, so 'imagecreatefrompng' function is available
103 // Generate image object from PNG for potential conversion to JPG later.
104 $image_object = imagecreatefrompng( $upload['file'] );
105
106 // Get image dimension
107 list( $width, $height ) = getimagesize( $upload['file'] );
108
109 // Run through pixels until transparent pixel is found
110 for ( $x = 0; $x < $width; $x++ ) {
111 for ( $y = 0; $y < $height; $y++ ) {
112 $pixel_color_index = imagecolorat( $image_object, $x, $y );
113 $pixel_rgba = imagecolorsforindex( $image_object, $pixel_color_index ); // array of red, green, blue and alpha values
114
115 if ( $pixel_rgba['alpha'] > 0 ) { // a pixel with alpha/transparency has been found
116 // alpha value range from 0 (completely opaque) to 127 (fully transparent).
117 // Ref: https://www.php.net/manual/en/function.imagecolorallocatealpha.php
118 $png_has_transparency = true;
119 break 2; // Break both 'for' loops
120 }
121 }
122 }
123
124 // Do not convert to JPG if PNG has alpha/transparency
125 if ( $png_has_transparency ) {
126 return $upload;
127 }
128
129 }
130
131 // Assign new, unique file name for the converted image
132 $wp_uploads = wp_upload_dir();
133 $old_filename = wp_basename( $upload['file'] );
134 $new_filename = wp_basename( str_ireplace( '.' . $file_extension, '.jpg', $old_filename ) );
135 $new_filename = wp_unique_filename( $uploads['path'], $new_filename );
136
137 // When conversion from BMP/PNG to JPG is successful. Last parameter is JPG quality (0-100).
138 if ( imagejpeg( $image_object, $wp_uploads['path'] . '/' . $new_filename, 90 ) ) {
139
140 unlink( $upload['file'] ); // delete original BMP/PNG
141
142 // Add converted JPG info into $upload
143 $upload['file'] = $wp_uploads['path'] . '/' . $new_filename;
144 $upload['url'] = $wp_uploads['url'] . '/' . $new_filename;
145 $upload['type'] = 'image/jpeg';
146
147 }
148
149 return $upload;
150
151 }
152
153 /**
154 * Limit the number of revisions for post types
155 *
156 * @since 3.7.0
157 */
158 public function limit_revisions_to_max_number( $num, $post ) {
159
160 $options = get_option( ASENHA_SLUG_U, array() );
161 $revisions_max_number = $options['revisions_max_number'];
162 $for_post_types = $options['enable_revisions_control_for'];
163
164 // Assemble single-dimensional array of post type slugs for which revisinos is being limited
165 $limited_post_types = array();
166 foreach( $for_post_types as $post_type_slug => $post_type_is_limited ) {
167 if ( $post_type_is_limited ) {
168 $limited_post_types[] = $post_type_slug;
169 }
170 }
171
172 // Change revisions number to keep if set for the post type as such
173 $post_type = $post->post_type;
174 if ( in_array( $post_type, $limited_post_types ) ) {
175 $num = $revisions_max_number;
176 }
177
178 return $num;
179
180 }
181
182 /**
183 * Maybe modify heartbeat tick frequency based on settings for each location
184 *
185 * @since 3.8.0
186 */
187 public function maybe_modify_heartbeat_frequency( $settings ) {
188
189 $this->get_url_path(); // defines $current_url_path
190
191 $options = get_option( ASENHA_SLUG_U, array() );
192
193 // Disable heartbeat autostart
194 $settings['autostart'] = false;
195
196 if ( is_admin() ) {
197
198 if ( '/wp-admin/post.php' == $this->current_url_path || '/wp-admin/post-new.php' == $this->current_url_path ) {
199
200 // Maybe modify interval on post edit screens
201 if ( 'modify' == $options['heartbeat_control_for_post_edit'] ) {
202 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_post_edit'] );
203 }
204
205 } else {
206
207 // Maybe modify interval on admin pages
208 if ( 'modify' == $options['heartbeat_control_for_admin_pages'] ) {
209 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_admin_pages'] );
210 }
211
212 }
213
214 } else {
215
216 // Maybe modify interval on the frontend
217 if ( 'modify' == $options['heartbeat_control_for_frontend'] ) {
218 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_frontend'] );
219 }
220
221 }
222
223 return $settings;
224
225 }
226
227 /**
228 * Maybe disable heartbeat ticks based on settings for each location
229 *
230 * @since 3.8.0
231 */
232 public function maybe_disable_heartbeat() {
233
234 global $pagenow;
235
236 $options = get_option( ASENHA_SLUG_U, array() );
237
238 if ( is_admin() ) {
239
240 if ( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
241
242 // Maybe disable on post creation / edit screens
243 if ( 'disable' == $options['heartbeat_control_for_post_edit'] ) {
244 wp_deregister_script( 'heartbeat' );
245 return;
246 }
247
248 } else {
249
250 // Maybe disable on the rest of admin pages
251 if ( 'disable' == $options['heartbeat_control_for_admin_pages'] ) {
252 wp_deregister_script( 'heartbeat' );
253 return;
254 }
255
256 }
257
258 } else {
259
260 // Maybe disable on the frontend
261 if ( 'disable' == $options['heartbeat_control_for_frontend'] ) {
262 wp_deregister_script( 'heartbeat' );
263 return;
264 }
265
266 }
267
268 }
269
270 /**
271 * Set current location
272 * Supported locations [editor,dashboard,frontend]
273 */
274 public function get_url_path() {
275
276 $url = ( isset( $_SERVER['HTTPS'] ) ? "https" : "http" ) . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
277 $request_path = parse_url( $url, PHP_URL_PATH ); // e.g. '/wp-admin/post.php'
278 $this->current_url_path = $request_path;
279
280 }
281
282
283 }