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