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