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