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