PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 6.9.2
Admin and Site Enhancements (ASE) v6.9.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 2 years ago class-admin-interface.php 2 years ago class-common-methods.php 2 years ago class-content-management.php 2 years ago class-custom-code.php 2 years ago class-deactivation.php 2 years ago class-disable-components.php 2 years ago class-login-logout.php 2 years ago class-optimizations.php 2 years ago class-security.php 2 years ago class-settings-fields-render.php 2 years ago class-settings-sanitization.php 2 years ago class-settings-sections-fields.php 2 years ago class-utilities.php 2 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 * Handler for image uploads. Convert and resize images.
15 *
16 * @since 4.3.0
17 */
18 public function image_upload_handler( $upload )
19 {
20 $applicable_mime_types = array(
21 'image/bmp',
22 'image/x-ms-bmp',
23 'image/png',
24 'image/jpeg',
25 'image/jpg',
26 'image/webp'
27 );
28
29 if ( in_array( $upload['type'], $applicable_mime_types ) ) {
30 global $png_has_transparency ;
31 // Exlude from conversion and resizing images with filenames ending with '-nr', e.g. birds-nr.png
32 if ( false !== strpos( $upload['file'], '-nr.' ) ) {
33 return $upload;
34 }
35 // Convert BMP
36 if ( 'image/bmp' === $upload['type'] || 'image/x-ms-bmp' === $upload['type'] ) {
37 $upload = $this->maybe_convert_image( 'bmp', $upload );
38 }
39 // Convert PNG without transparency
40 if ( 'image/png' === $upload['type'] ) {
41 $upload = $this->maybe_convert_image( 'png', $upload );
42 }
43 // At this point, BMPs and non-transparent PNGs are already converted to JPGs, unless excluded with '-nr' suffix.
44 // Let's perform resize operation as needed, i.e. if image dimension is larger than specified
45 $mime_types_to_resize = array( 'image/jpeg', 'image/jpg', 'image/png' );
46
47 if ( !is_wp_error( $upload ) && in_array( $upload['type'], $mime_types_to_resize ) && filesize( $upload['file'] ) > 0 ) {
48 // https://developer.wordpress.org/reference/classes/wp_image_editor/
49 $wp_image_editor = wp_get_image_editor( $upload['file'] );
50
51 if ( !is_wp_error( $wp_image_editor ) ) {
52 $image_size = $wp_image_editor->get_size();
53 $options = get_option( ASENHA_SLUG_U, array() );
54 $max_width = $options['image_max_width'];
55 $max_height = $options['image_max_height'];
56 // Check upload image's dimension and only resize if larger than the defined max dimension
57
58 if ( isset( $image_size['width'] ) && $image_size['width'] > $max_width || isset( $image_size['height'] ) && $image_size['height'] > $max_height ) {
59 $wp_image_editor->resize( $max_width, $max_height, false );
60 // false is for no cropping
61 $wp_image_editor->set_quality( 90 );
62 // default is 82
63 $wp_image_editor->save( $upload['file'] );
64 }
65
66 }
67
68 }
69
70 }
71
72 return $upload;
73 }
74
75 /**
76 * Convert BMP or PNG without transparency into JPG
77 *
78 * @since 4.3.0
79 */
80 public function maybe_convert_image( $file_extension, $upload )
81 {
82 global $png_has_transparency ;
83 $image_object = null;
84 // Get image object from uploaded BMP/PNG
85 if ( 'bmp' === $file_extension ) {
86 // Generate image object from BMP for conversion to JPG later
87
88 if ( function_exists( 'imagecreatefrombmp' ) ) {
89 // PHP >= v7.2
90 $image_object = imagecreatefrombmp( $upload['file'] );
91 } else {
92 // PHP < v7.2
93 require_once ASENHA_PATH . 'includes/bmp-to-image-object.php';
94 $image_object = bmp_to_image_object( $upload['file'] );
95 }
96
97 }
98
99 if ( 'png' === $file_extension ) {
100 // Detect alpha/transparency in PNG
101 $png_has_transparency = false;
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 // Get image dimension
106 list( $width, $height ) = getimagesize( $upload['file'] );
107 // Run through pixels until transparent pixel is found
108 for ( $x = 0 ; $x < $width ; $x++ ) {
109 for ( $y = 0 ; $y < $height ; $y++ ) {
110 $pixel_color_index = imagecolorat( $image_object, $x, $y );
111 $pixel_rgba = imagecolorsforindex( $image_object, $pixel_color_index );
112 // array of red, green, blue and alpha values
113
114 if ( $pixel_rgba['alpha'] > 0 ) {
115 // 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;
120 // Break both 'for' loops
121 }
122
123 }
124 }
125 // Do not convert PNG with alpha/transparency
126 if ( $png_has_transparency ) {
127 return $upload;
128 }
129 }
130
131 $wp_uploads = wp_upload_dir();
132 $old_filename = wp_basename( $upload['file'] );
133 // Assign new, unique file name for the converted image
134 // $new_filename = wp_basename( str_ireplace( '.' . $file_extension, '.jpg', $old_filename ) );
135 $new_filename = str_ireplace( '.' . $file_extension, '.jpg', $old_filename );
136 $new_filename = wp_unique_filename( dirname( $upload['file'] ), $new_filename );
137 // When conversion from BMP/PNG to JPG is successful. Last parameter is JPG quality (0-100).
138
139 if ( imagejpeg( $image_object, $wp_uploads['path'] . '/' . $new_filename, 90 ) ) {
140 unlink( $upload['file'] );
141 // delete original BMP/PNG
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 return $upload;
149 }
150
151 /**
152 * Limit the number of revisions for post types
153 *
154 * @since 3.7.0
155 */
156 public function limit_revisions_to_max_number( $num, $post )
157 {
158 $options = get_option( ASENHA_SLUG_U, array() );
159 $revisions_max_number = $options['revisions_max_number'];
160 $for_post_types = $options['enable_revisions_control_for'];
161 // Assemble single-dimensional array of post type slugs for which revisinos is being limited
162 $limited_post_types = array();
163 foreach ( $for_post_types as $post_type_slug => $post_type_is_limited ) {
164 if ( $post_type_is_limited ) {
165 $limited_post_types[] = $post_type_slug;
166 }
167 }
168 // Change revisions number to keep if set for the post type as such
169 $post_type = $post->post_type;
170 if ( in_array( $post_type, $limited_post_types ) ) {
171 $num = $revisions_max_number;
172 }
173 return $num;
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 if ( wp_doing_cron() ) {
184 return $settings;
185 }
186 $this->get_url_path();
187 // defines $current_url_path
188 $options = get_option( ASENHA_SLUG_U, array() );
189 // Disable heartbeat autostart
190 $settings['autostart'] = false;
191
192 if ( is_admin() ) {
193
194 if ( '/wp-admin/post.php' == $this->current_url_path || '/wp-admin/post-new.php' == $this->current_url_path ) {
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 } else {
200 // Maybe modify interval on admin pages
201 if ( 'modify' == $options['heartbeat_control_for_admin_pages'] ) {
202 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_admin_pages'] );
203 }
204 }
205
206 } else {
207 // Maybe modify interval on the frontend
208 if ( 'modify' == $options['heartbeat_control_for_frontend'] ) {
209 $settings['minimalInterval'] = absint( $options['heartbeat_interval_for_frontend'] );
210 }
211 }
212
213 return $settings;
214 }
215
216 /**
217 * Maybe disable heartbeat ticks based on settings for each location
218 *
219 * @since 3.8.0
220 */
221 public function maybe_disable_heartbeat()
222 {
223 global $pagenow ;
224 $options = get_option( ASENHA_SLUG_U, array() );
225
226 if ( is_admin() ) {
227
228 if ( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
229 // Maybe disable on post creation / edit screens
230
231 if ( 'disable' == $options['heartbeat_control_for_post_edit'] ) {
232 wp_deregister_script( 'heartbeat' );
233 return;
234 }
235
236 } else {
237 // Maybe disable on the rest of admin pages
238
239 if ( 'disable' == $options['heartbeat_control_for_admin_pages'] ) {
240 wp_deregister_script( 'heartbeat' );
241 return;
242 }
243
244 }
245
246 } else {
247 // Maybe disable on the frontend
248
249 if ( 'disable' == $options['heartbeat_control_for_frontend'] ) {
250 wp_deregister_script( 'heartbeat' );
251 return;
252 }
253
254 }
255
256 }
257
258 /**
259 * Set current location
260 * Supported locations [editor,dashboard,frontend]
261 */
262 public function get_url_path()
263 {
264 global $pagenow ;
265
266 if ( isset( $_SERVER['HTTP_HOST'] ) ) {
267 $url = (( isset( $_SERVER['HTTPS'] ) ? 'https' : 'http' )) . '://' . $_SERVER["HTTP_HOST"] . '' . $_SERVER["REQUEST_URI"];
268 } else {
269 $url = get_admin_url() . $pagenow;
270 }
271
272 $request_path = parse_url( $url, PHP_URL_PATH );
273 // e.g. '/wp-admin/post.php'
274 $this->current_url_path = $request_path;
275 }
276
277 }