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