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-common-methods.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-common-methods.php
317 lines
1 <?php
2
3 namespace ASENHA\Classes;
4
5 use WP_Query ;
6 /**
7 * Class that provides common methods used throughout the plugin
8 *
9 * @since 2.5.0
10 */
11 class Common_Methods
12 {
13 /**
14 * Get IP of the current visitor/user. In use by at least the Limit Login Attempts feature.
15 * This takes a best guess of the visitor's actual IP address.
16 * Takes into account numerous HTTP proxy headers due to variations
17 * in how different ISPs handle IP addresses in headers between hops.
18 *
19 * @link https://stackoverflow.com/q/1634782
20 * @since 2.5.0
21 */
22 public function get_user_ip_address()
23 {
24 // Check for shared internet/ISP IP
25 if ( !empty($_SERVER['HTTP_CLIENT_IP']) && $this->is_ip_valid( $_SERVER['HTTP_CLIENT_IP'] ) ) {
26 return sanitize_text_field( $_SERVER['HTTP_CLIENT_IP'] );
27 }
28 // Check for IPs passing through proxies
29
30 if ( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
31 // Check if multiple IP addresses exist in var
32 $ip_list = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
33
34 if ( is_array( $ip_list ) ) {
35 foreach ( $ip_list as $ip ) {
36 if ( $this->is_ip_valid( trim( $ip ) ) ) {
37 return sanitize_text_field( trim( $ip ) );
38 }
39 }
40 } else {
41 return sanitize_text_field( $_SERVER['HTTP_X_FORWARDED_FOR'] );
42 }
43
44 }
45
46 if ( !empty($_SERVER['HTTP_X_FORWARDED']) && $this->is_ip_valid( $_SERVER['HTTP_X_FORWARDED'] ) ) {
47 return sanitize_text_field( $_SERVER['HTTP_X_FORWARDED'] );
48 }
49 if ( !empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->is_ip_valid( $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] ) ) {
50 return sanitize_text_field( $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] );
51 }
52 if ( !empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->is_ip_valid( $_SERVER['HTTP_FORWARDED_FOR'] ) ) {
53 return sanitize_text_field( $_SERVER['HTTP_FORWARDED_FOR'] );
54 }
55 if ( !empty($_SERVER['HTTP_FORWARDED']) && $this->is_ip_valid( $_SERVER['HTTP_FORWARDED'] ) ) {
56 return sanitize_text_field( $_SERVER['HTTP_FORWARDED'] );
57 }
58 // Return unreliable IP address since all else failed
59 return sanitize_text_field( $_SERVER['REMOTE_ADDR'] );
60 }
61
62 /**
63 * Check if the supplied IP address is valid or not
64 *
65 * @param string $ip an IP address
66 * @link https://stackoverflow.com/q/1634782
67 * @return boolean true if supplied address is valid IP, and false otherwise
68 */
69 public function is_ip_valid( $ip )
70 {
71 if ( empty($ipt) ) {
72 return false;
73 }
74
75 if ( false == filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) {
76 return false;
77 } else {
78 return true;
79 }
80
81 }
82
83 /**
84 * Convert number of seconds into hours, minutes, seconds. In use by at least the Limit Login Attempts feature.
85 *
86 * @since 2.5.0
87 */
88 public function seconds_to_period( $seconds, $conversion_type )
89 {
90 $period_start = new \DateTime( '@0' );
91 $period_end = new \DateTime( "@{$seconds}" );
92
93 if ( $conversion_type == 'to-days-hours-minutes-seconds' ) {
94 return $period_start->diff( $period_end )->format( '%a days, %h hours, %i minutes and %s seconds' );
95 } elseif ( $conversion_type == 'to-hours-minutes-seconds' ) {
96 return $period_start->diff( $period_end )->format( '%h hours, %i minutes and %s seconds' );
97 } elseif ( $conversion_type == 'to-minutes-seconds' ) {
98 return $period_start->diff( $period_end )->format( '%i minutes and %s seconds' );
99 } else {
100 return $period_start->diff( $period_end )->format( '%a days, %h hours, %i minutes and %s seconds' );
101 }
102
103 }
104
105 /**
106 * Remove html tags and content inside the tags from a string
107 *
108 * @since 3.0.3
109 */
110 public function strip_html_tags_and_content( $string )
111 {
112 // Strip HTML tags and content inside them. Ref: https://stackoverflow.com/a/39320168
113
114 if ( !is_null( $string ) ) {
115 $string = preg_replace( '@<(\\w+)\\b.*?>.*?</\\1>@si', '', $string );
116 // Strip any remaining HTML or PHP tags
117 $string = strip_tags( $string );
118 }
119
120 return $string;
121 }
122
123 /**
124 * Get menu hidden by toggle
125 *
126 * @since 5.1.0
127 */
128 public function get_menu_hidden_by_toggle()
129 {
130 $menu_hidden_by_toggle = array();
131 $options = get_option( ASENHA_SLUG_U, array() );
132
133 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
134 $menu_hidden = $options['custom_menu_hidden'];
135 $menu_hidden = explode( ',', $menu_hidden );
136 $menu_hidden_by_toggle = array();
137 foreach ( $menu_hidden as $menu_id ) {
138 $menu_hidden_by_toggle[] = $this->restore_menu_item_id( $menu_id );
139 }
140 }
141
142 return $menu_hidden_by_toggle;
143 }
144
145 /**
146 * Get user capabilities for which the "Show All/Less" menu toggle should be shown for
147 *
148 * @since 5.1.0
149 */
150 public function get_user_capabilities_to_show_menu_toggle_for()
151 {
152 global $menu ;
153 $menu_always_hidden = array();
154 $user_capabilities_menus_are_hidden_for = array();
155 $menu_hidden_by_toggle = $this->get_menu_hidden_by_toggle();
156 // indexed array
157 foreach ( $menu as $menu_key => $menu_info ) {
158 foreach ( $menu_hidden_by_toggle as $hidden_menu_id ) {
159
160 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
161 $menu_item_id = $menu_info[2];
162 } else {
163 $menu_item_id = $menu_info[5];
164 }
165
166 if ( $menu_item_id == $hidden_menu_id ) {
167 $user_capabilities_menus_are_hidden_for[] = $menu_info[1];
168 }
169 }
170 }
171 $user_capabilities_menus_are_hidden_for = array_unique( $user_capabilities_menus_are_hidden_for );
172 return $user_capabilities_menus_are_hidden_for;
173 // indexed array
174 }
175
176 /**
177 * Transform menu item's ID
178 *
179 * @since 5.1.0
180 */
181 public function transform_menu_item_id( $menu_item_id )
182 {
183 // Transform e.g. edit.php?post_type=page ==> edit__php___post_type____page
184 $menu_item_id_transformed = str_replace( array(
185 ".",
186 "?",
187 "=/",
188 "=",
189 "&",
190 "/"
191 ), array(
192 "__",
193 "___",
194 "_______",
195 "____",
196 "_____",
197 "______"
198 ), $menu_item_id );
199 return $menu_item_id_transformed;
200 }
201
202 /**
203 * Transform menu item's ID
204 *
205 * @since 5.1.0
206 */
207 public function restore_menu_item_id( $menu_item_id_transformed )
208 {
209 // Transform e.g. edit__php___post_type____page ==> edit.php?post_type=page
210 $menu_item_id = str_replace( array(
211 "_______",
212 "______",
213 "_____",
214 "____",
215 "___",
216 "__"
217 ), array(
218 "=/",
219 "/",
220 "&",
221 "=",
222 "?",
223 "."
224 ), $menu_item_id_transformed );
225 return $menu_item_id;
226 }
227
228 /**
229 * Sanitize hexedecimal numbers used for colors
230 *
231 * @link https://plugins.trac.wordpress.org/browser/bm-custom-login/trunk/bm-custom-login.php
232 * @param string $color Hex number to sanitize.
233 * @return string
234 */
235 public function sanitize_hex_color( $color )
236 {
237 if ( '' === $color ) {
238 return '';
239 }
240 // Make sure the color starts with a hash.
241 $color = '#' . ltrim( $color, '#' );
242 // 3 or 6 hex digits, or the empty string.
243 if ( preg_match( '|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {
244 return $color;
245 }
246 return null;
247 }
248
249 /**
250 * Get the post ID of the most recent post in a custom post type
251 *
252 * @since 6.4.1
253 */
254 public function get_most_recent_post_id( $post_type )
255 {
256 $args = array(
257 'post_type' => $post_type,
258 'posts_per_page' => 1,
259 'orderby' => 'date',
260 'order' => 'DESC',
261 );
262 $query = new WP_Query( $args );
263
264 if ( $query->have_posts() ) {
265 $query->the_post();
266 $post_id = get_the_ID();
267 wp_reset_postdata();
268 return $post_id;
269 }
270
271 return 0;
272 // Return 0 if no posts found
273 }
274
275 /**
276 * Extended ruleset for wp_kses() that includes SVG tag and it's children
277 *
278 * @since 6.8.3
279 */
280 public function get_kses_extended_ruleset()
281 {
282 $kses_defaults = wp_kses_allowed_html( 'post' );
283 // For SVG icons
284 $svg_args = array(
285 'svg' => array(
286 'class' => true,
287 'aria-hidden' => true,
288 'aria-labelledby' => true,
289 'role' => true,
290 'xmlns' => true,
291 'width' => true,
292 'height' => true,
293 'viewbox' => true,
294 ),
295 'g' => array(
296 'fill' => true,
297 ),
298 'title' => array(
299 'title' => true,
300 ),
301 'path' => array(
302 'd' => true,
303 'fill' => true,
304 ),
305 );
306 $kses_with_extras = array_merge( $kses_defaults, $svg_args );
307 // For embedded PDF viewer
308 $style_script_args = array(
309 'style' => true,
310 'script' => array(
311 'src' => true,
312 ),
313 );
314 return array_merge( $kses_with_extras, $style_script_args );
315 }
316
317 }