PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 5.2.1
Admin and Site Enhancements (ASE) v5.2.1
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
277 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 // https://developer.wordpress.org/reference/classes/wp_image_editor/
47 $wp_image_editor = wp_get_image_editor( $upload['file'] );
48 $image_size = $wp_image_editor->get_size();
49
50 $options = get_option( ASENHA_SLUG_U, array() );
51 $max_width = $options['image_max_width'];
52 $max_height = $options['image_max_height'];
53
54 // Check upload image's dimension and only resize if larger than the defined max dimension
55 if (
56 ( isset( $image_size['width'] ) && $image_size['width'] > $max_width ) ||
57 ( isset( $image_size['height'] ) && $image_size['height'] > $max_height )
58 ) {
59 $wp_image_editor->resize( $max_width, $max_height, false ); // false is for no cropping
60 $wp_image_editor->set_quality( 90 ); // default is 82
61 $wp_image_editor->save( $upload['file'] );
62 }
63
64 }
65
66 return $upload;
67
68 }
69
70 /**
71 * Convert BMP or PNG without transparency into JPG
72 *
73 * @since 4.3.0
74 */
75 public function convert_image_to_jpg( $file_extension, $upload ) {
76
77 $image_object = null;
78
79 // Get image object from uploaded BMP/PNG
80
81 if ( 'bmp' === $file_extension ) {
82 // Generate image object from BMP for conversion to JPG later
83 if ( function_exists( 'imagecreatefrombmp' ) ) { // PHP >= v7.2
84 $image_object = imagecreatefrombmp( $upload['file'] );
85 } else { // PHP < v7.2
86 require_once ASENHA_PATH . 'includes/bmp-to-image-object.php';
87 $image_object = bmp_to_image_object( $upload['file'] );
88 }
89 }
90
91 if ( 'png' === $file_extension ) {
92
93 // Detect alpha/transparency in PNG
94 $png_has_transparency = false;
95
96 // We assume GD library is present, so 'imagecreatefrompng' function is available
97 // Generate image object from PNG for potential conversion to JPG later.
98 $image_object = imagecreatefrompng( $upload['file'] );
99
100 // Get image dimension
101 list( $width, $height ) = getimagesize( $upload['file'] );
102
103 // Run through pixels until transparent pixel is found
104 for ( $x = 0; $x < $width; $x++ ) {
105 for ( $y = 0; $y < $height; $y++ ) {
106 $pixel_color_index = imagecolorat( $image_object, $x, $y );
107 $pixel_rgba = imagecolorsforindex( $image_object, $pixel_color_index ); // array of red, green, blue and alpha values
108
109 if ( $pixel_rgba['alpha'] > 0 ) { // a pixel with alpha/transparency has been found
110 // alpha value range from 0 (completely opaque) to 127 (fully transparent).
111 // Ref: https://www.php.net/manual/en/function.imagecolorallocatealpha.php
112 $png_has_transparency = true;
113 break 2; // Break both 'for' loops
114 }
115 }
116 }
117
118 // Do not convert to JPG if PNG has alpha/transparency
119 if ( $png_has_transparency ) {
120 return $upload;
121 }
122
123 }
124
125 // Assign new, unique file name for the converted image
126 $wp_uploads = wp_upload_dir();
127 $old_filename = wp_basename( $upload['file'] );
128 $new_filename = wp_basename( str_ireplace( '.' . $file_extension, '.jpg', $old_filename ) );
129 $new_filename = wp_unique_filename( $uploads['path'], $new_filename );
130
131 // When conversion from BMP/PNG to JPG is successful. Last parameter is JPG quality (0-100).
132 if ( imagejpeg( $image_object, $wp_uploads['path'] . '/' . $new_filename, 90 ) ) {
133
134 unlink( $upload['file'] ); // delete original BMP/PNG
135
136 // Add converted JPG info into $upload
137 $upload['file'] = $wp_uploads['path'] . '/' . $new_filename;
138 $upload['url'] = $wp_uploads['url'] . '/' . $new_filename;
139 $upload['type'] = 'image/jpeg';
140
141 }
142
143 return $upload;
144
145 }
146
147 /**
148 * Limit the number of revisions for post types
149 *
150 * @since 3.7.0
151 */
152 public function limit_revisions_to_max_number( $num, $post ) {
153
154 $options = get_option( ASENHA_SLUG_U, array() );
155 $revisions_max_number = $options['revisions_max_number'];
156 $for_post_types = $options['enable_revisions_control_for'];
157
158 // Assemble single-dimensional array of post type slugs for which revisinos is being limited
159 $limited_post_types = array();
160 foreach( $for_post_types as $post_type_slug => $post_type_is_limited ) {
161 if ( $post_type_is_limited ) {
162 $limited_post_types[] = $post_type_slug;
163 }
164 }
165
166 // Change revisions number to keep if set for the post type as such
167 $post_type = $post->post_type;
168 if ( in_array( $post_type, $limited_post_types ) ) {
169 $num = $revisions_max_number;
170 }
171
172 return $num;
173
174 }
175
176 /**
177 * Maybe modify heartbeat tick frequency based on settings for each location
178 *
179 * @since 3.8.0
180 */
181 public function maybe_modify_heartbeat_frequency( $settings ) {
182
183 $this->get_url_path(); // defines $current_url_path
184
185 $options = get_option( ASENHA_SLUG_U, array() );
186
187 // Disable heartbeat autostart
188 $settings['autostart'] = false;
189
190 if ( is_admin() ) {
191
192 if ( '/wp-admin/post.php' == $this->current_url_path || '/wp-admin/post-new.php' == $this->current_url_path ) {
193
194 // Maybe modify interval on post edit screens
195 if ( 'modify' == $options['heartbeat_control_for_post_edit'] ) {
196 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_post_edit'] );
197 }
198
199 } else {
200
201 // Maybe modify interval on admin pages
202 if ( 'modify' == $options['heartbeat_control_for_admin_pages'] ) {
203 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_admin_pages'] );
204 }
205
206 }
207
208 } else {
209
210 // Maybe modify interval on the frontend
211 if ( 'modify' == $options['heartbeat_control_for_frontend'] ) {
212 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_frontend'] );
213 }
214
215 }
216
217 return $settings;
218
219 }
220
221 /**
222 * Maybe disable heartbeat ticks based on settings for each location
223 *
224 * @since 3.8.0
225 */
226 public function maybe_disable_heartbeat() {
227
228 global $pagenow;
229
230 $options = get_option( ASENHA_SLUG_U, array() );
231
232 if ( is_admin() ) {
233
234 if ( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
235
236 // Maybe disable on post creation / edit screens
237 if ( 'disable' == $options['heartbeat_control_for_post_edit'] ) {
238 wp_deregister_script( 'heartbeat' );
239 return;
240 }
241
242 } else {
243
244 // Maybe disable on the rest of admin pages
245 if ( 'disable' == $options['heartbeat_control_for_admin_pages'] ) {
246 wp_deregister_script( 'heartbeat' );
247 return;
248 }
249
250 }
251
252 } else {
253
254 // Maybe disable on the frontend
255 if ( 'disable' == $options['heartbeat_control_for_frontend'] ) {
256 wp_deregister_script( 'heartbeat' );
257 return;
258 }
259
260 }
261
262 }
263
264 /**
265 * Set current location
266 * Supported locations [editor,dashboard,frontend]
267 */
268 public function get_url_path() {
269
270 $url = ( isset( $_SERVER['HTTPS'] ) ? "https" : "http" ) . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
271 $request_path = parse_url( $url, PHP_URL_PATH ); // e.g. '/wp-admin/post.php'
272 $this->current_url_path = $request_path;
273
274 }
275
276
277 }