PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.8.3
Admin and Site Enhancements (ASE) v7.8.3
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 1 year ago class-admin-menu-organizer.php 1 year ago class-auto-publish-posts-with-missed-schedule.php 1 year ago class-avif-upload.php 1 year ago class-captcha-protection.php 1 year ago class-change-login-url.php 1 year ago class-cleanup-admin-bar.php 1 year ago class-common-methods.php 1 year ago class-content-duplication.php 1 year ago class-content-order.php 1 year ago class-custom-admin-footer-text.php 1 year ago class-custom-body-class.php 1 year ago class-custom-css.php 1 year ago class-custom-nav-menu-items-in-new-tab.php 1 year ago class-deactivation.php 1 year ago class-disable-comments.php 1 year ago class-disable-dashboard-widgets.php 1 year ago class-disable-feeds.php 1 year ago class-disable-gutenberg.php 1 year ago class-disable-rest-api.php 1 year ago class-disable-smaller-components.php 1 year ago class-disable-updates.php 1 year ago class-disable-xml-rpc.php 1 year ago class-display-system-summary.php 1 year ago class-email-address-obfuscator.php 1 year ago class-email-delivery.php 1 year ago class-enhance-list-tables.php 1 year ago class-external-permalinks.php 1 year ago class-heartbeat-control.php 1 year ago class-hide-admin-bar.php 1 year ago class-hide-admin-notices.php 1 year ago class-image-sizes-panel.php 1 year ago class-image-upload-control.php 1 year ago class-insert-head-body-footer-code.php 1 year ago class-last-login-column.php 1 year ago class-limit-login-attempts.php 1 year ago class-login-id-type.php 1 year ago class-login-logout-menu.php 1 year ago class-maintenance-mode.php 1 year ago class-manage-ads-appads-txt.php 1 year ago class-manage-robots-txt.php 1 year ago class-media-replacement.php 1 year ago class-multiple-user-roles.php 1 year ago class-obfuscate-author-slugs.php 1 year ago class-open-external-links-in-new-tab.php 1 year ago class-password-protection.php 1 year ago class-redirect-after-login.php 1 year ago class-redirect-after-logout.php 1 year ago class-redirect-fourofour.php 1 year ago class-registration-date-column.php 1 year ago class-revisions-control.php 1 year ago class-search-engines-visibility.php 1 year ago class-settings-fields-render.php 1 year ago class-settings-sanitization.php 1 year ago class-settings-sections-fields.php 1 year ago class-show-custom-taxonomy-filters.php 1 year ago class-site-identity-on-login-page.php 1 year ago class-svg-upload.php 1 year ago class-various-admin-ui-enhancements.php 1 year ago class-view-admin-as-role.php 1 year ago class-wider-admin-menu.php 1 year ago class-wp-config-transformer.php 1 year ago
class-common-methods.php
541 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 * Get IP of the current visitor/user. In use by at least the Limit Login Attempts feature.
14 * This takes a best guess of the visitor's actual IP address.
15 * Takes into account numerous HTTP proxy headers due to variations
16 * in how different ISPs handle IP addresses in headers between hops.
17 *
18 * @link https://stackoverflow.com/q/1634782
19 * @since 2.5.0
20 */
21 public function get_user_ip_address( $return_type = 'ip', $for_which_module = 'limit-login-attempts' ) {
22 $options = get_option( ASENHA_SLUG_U, array() );
23 $ip_address_header = '';
24 switch ( $for_which_module ) {
25 case 'limit-login-attempts':
26 $ip_address_header = ( isset( $options['limit_login_attempts_header_override'] ) ? trim( $options['limit_login_attempts_header_override'] ) : '' );
27 break;
28 case 'password-protection':
29 $ip_address_header = ( isset( $options['password_protection_header_override'] ) ? trim( $options['password_protection_header_override'] ) : '' );
30 break;
31 }
32 // Attempt to get IP address with the preferred header
33 if ( !empty( $ip_address_header ) && isset( $_SERVER[$ip_address_header] ) ) {
34 // Check if multiple IP addresses exist in var
35 $ip_list = explode( ',', $_SERVER[$ip_address_header] );
36 if ( is_array( $ip_list ) && count( $ip_list ) > 1 ) {
37 foreach ( $ip_list as $ip ) {
38 switch ( $return_type ) {
39 case 'ip':
40 if ( $this->is_ip_valid( trim( $ip ) ) ) {
41 return sanitize_text_field( trim( $ip ) );
42 } else {
43 return '0.0.0.0';
44 // placeholder IP address
45 }
46 break;
47 case 'header':
48 return $ip_address_header . ' (multiple IP addresses)';
49 break;
50 }
51 }
52 } else {
53 switch ( $return_type ) {
54 case 'ip':
55 if ( $this->is_ip_valid( trim( $_SERVER[$ip_address_header] ) ) ) {
56 return sanitize_text_field( $_SERVER[$ip_address_header] );
57 } else {
58 return '0.0.0.0';
59 // placeholder IP address
60 }
61 break;
62 case 'header':
63 return $ip_address_header;
64 break;
65 }
66 }
67 }
68 // The following request headers can be modified by user or attacker when sending a request, so, will bypass an already blocked IP
69 // 'HTTP_CLIENT_IP', 'CF_CONNECTING_IP', 'HTTP_CF_CONNECTING_IP', 'HTTP_CF_CONNECTING_IP', 'TRUE_CLIENT_IP', 'HTTP_TRUE_CLIENT_IP', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED'
70 // Reported as security vulnerability in ASE <= v7.6.7.1 -- Limit Login Attempt Bypass via IP Spoofing
71 // Return unreliable but unspoofable IP address coming from the $_SERVER global as the default / fallback
72 switch ( $return_type ) {
73 case 'ip':
74 if ( $this->is_ip_valid( trim( $_SERVER['REMOTE_ADDR'] ) ) ) {
75 return sanitize_text_field( $_SERVER['REMOTE_ADDR'] );
76 } else {
77 return '0.0.0.0';
78 // placeholder IP address
79 }
80 break;
81 case 'header':
82 return 'REMOTE_ADDR';
83 break;
84 }
85 }
86
87 /**
88 * Check if the supplied IP address is valid or not
89 *
90 * @param string $ip an IP address
91 * @link https://stackoverflow.com/q/1634782
92 * @return boolean true if supplied address is valid IP, and false otherwise
93 */
94 public function is_ip_valid( $ip ) {
95 if ( empty( $ip ) ) {
96 return false;
97 }
98 // Ref: https://www.php.net/manual/en/filter.filters.validate.php
99 // Ref: https://www.php.net/manual/en/filter.constants.php#constant.filter-validate-ip
100 // No need to specify which IP type to filter/check, e.g. filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 )
101 // This should check for both IPv4 and IPv6 addresses
102 if ( false === filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) && false === filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
103 return false;
104 }
105 if ( false !== filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) || false !== filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
106 return true;
107 }
108 }
109
110 /**
111 * Convert number of seconds into hours, minutes, seconds. In use by at least the Limit Login Attempts feature.
112 *
113 * @since 2.5.0
114 */
115 public function seconds_to_period( $seconds, $conversion_type ) {
116 $period_start = new \DateTime('@0');
117 $period_end = new \DateTime("@{$seconds}");
118 if ( $conversion_type == 'to-days-hours-minutes-seconds' ) {
119 return $period_start->diff( $period_end )->format( '%a days, %h hours, %i minutes and %s seconds' );
120 } elseif ( $conversion_type == 'to-hours-minutes-seconds' ) {
121 return $period_start->diff( $period_end )->format( '%h hours, %i minutes and %s seconds' );
122 } elseif ( $conversion_type == 'to-minutes-seconds' ) {
123 return $period_start->diff( $period_end )->format( '%i minutes and %s seconds' );
124 } else {
125 return $period_start->diff( $period_end )->format( '%a days, %h hours, %i minutes and %s seconds' );
126 }
127 }
128
129 /**
130 * Remove html tags and content inside the tags from a string
131 *
132 * @since 3.0.3
133 */
134 public function strip_html_tags_and_content( $string ) {
135 // Strip HTML tags and content inside them. Ref: https://stackoverflow.com/a/39320168
136 if ( !is_null( $string ) ) {
137 if ( false === strpos( $string, 'fs-submenu-item' ) ) {
138 $string = preg_replace( '@<(\\w+)\\b.*?>.*?</\\1>@si', '', $string );
139 }
140 // Strip any remaining HTML or PHP tags
141 $string = strip_tags( $string );
142 }
143 return $string;
144 }
145
146 /**
147 * Get menu hidden by toggle
148 *
149 * @since 5.1.0
150 */
151 public function get_menu_hidden_by_toggle() {
152 $menu_hidden_by_toggle = array();
153 $options = get_option( ASENHA_SLUG_U, array() );
154 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
155 $menu_hidden = $options['custom_menu_hidden'];
156 $menu_hidden = explode( ',', $menu_hidden );
157 $menu_hidden_by_toggle = array();
158 foreach ( $menu_hidden as $menu_id ) {
159 $menu_hidden_by_toggle[] = $this->restore_menu_item_id( $menu_id );
160 }
161 }
162 return $menu_hidden_by_toggle;
163 }
164
165 /**
166 * Get user capabilities for which the "Show All/Less" menu toggle should be shown for
167 *
168 * @since 5.1.0
169 */
170 public function get_user_capabilities_to_show_menu_toggle_for() {
171 global $menu, $submenu;
172 $menu_always_hidden = array();
173 $user_capabilities_menus_are_hidden_for = array();
174 $menu_hidden_by_toggle = $this->get_menu_hidden_by_toggle();
175 // indexed array
176 foreach ( $menu as $menu_key => $menu_info ) {
177 foreach ( $menu_hidden_by_toggle as $hidden_menu_id ) {
178 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
179 $menu_item_id = $menu_info[2];
180 } else {
181 $menu_item_id = $menu_info[5];
182 }
183 if ( $menu_item_id == $hidden_menu_id ) {
184 $user_capabilities_menus_are_hidden_for[] = $menu_info[1];
185 }
186 }
187 }
188 $user_capabilities_menus_are_hidden_for = array_unique( $user_capabilities_menus_are_hidden_for );
189 return $user_capabilities_menus_are_hidden_for;
190 // indexed array
191 }
192
193 /**
194 * Transform menu item's ID
195 *
196 * @since 5.1.0
197 */
198 public function transform_menu_item_id( $menu_item_id ) {
199 // Transform e.g. edit.php?post_type=page ==> edit__php___post_type____page
200 $menu_item_id_transformed = str_replace( array(
201 ".",
202 "?",
203 "=/",
204 "=",
205 "&",
206 "/"
207 ), array(
208 "__",
209 "___",
210 "_______",
211 "____",
212 "_____",
213 "______"
214 ), $menu_item_id );
215 return $menu_item_id_transformed;
216 }
217
218 /**
219 * Transform menu item's ID
220 *
221 * @since 5.1.0
222 */
223 public function restore_menu_item_id( $menu_item_id_transformed ) {
224 // Transform e.g. edit__php___post_type____page ==> edit.php?post_type=page
225 $menu_item_id = str_replace( array(
226 "_______",
227 "______",
228 "_____",
229 "____",
230 "___",
231 "__"
232 ), array(
233 "=/",
234 "/",
235 "&",
236 "=",
237 "?",
238 "."
239 ), $menu_item_id_transformed );
240 return $menu_item_id;
241 }
242
243 /**
244 * Sanitize hexedecimal numbers used for colors
245 *
246 * @link https://plugins.trac.wordpress.org/browser/bm-custom-login/trunk/bm-custom-login.php
247 * @param string $color Hex number to sanitize.
248 * @return string
249 */
250 public function sanitize_hex_color( $color ) {
251 if ( '' === $color ) {
252 return '';
253 }
254 // Make sure the color starts with a hash.
255 $color = '#' . ltrim( $color, '#' );
256 // 3 or 6 hex digits, or the empty string.
257 if ( preg_match( '|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {
258 return $color;
259 }
260 return null;
261 }
262
263 /**
264 * Get the post ID of the most recent post in a custom post type
265 *
266 * @since 6.4.1
267 */
268 public function get_most_recent_post_id( $post_type ) {
269 $args = array(
270 'post_type' => $post_type,
271 'posts_per_page' => 1,
272 'orderby' => 'date',
273 'order' => 'DESC',
274 );
275 $query = new WP_Query($args);
276 if ( $query->have_posts() ) {
277 $query->the_post();
278 $post_id = get_the_ID();
279 wp_reset_postdata();
280 return $post_id;
281 }
282 return 0;
283 // Return 0 if no posts found
284 }
285
286 /**
287 * Extended ruleset for wp_kses() that includes SVG tag and it's children
288 *
289 * @since 6.8.3
290 */
291 public function get_kses_extended_ruleset() {
292 $kses_defaults = wp_kses_allowed_html( 'post' );
293 // For SVG icons
294 $svg_args = array(
295 'svg' => array(
296 'class' => true,
297 'aria-hidden' => true,
298 'aria-labelledby' => true,
299 'role' => true,
300 'xmlns' => true,
301 'width' => true,
302 'height' => true,
303 'viewbox' => true,
304 'viewBox' => true,
305 ),
306 'g' => array(
307 'fill' => true,
308 'fill-rule' => true,
309 'stroke' => true,
310 'stroke-width' => true,
311 'stroke-linejoin' => true,
312 'stroke-linecap' => true,
313 ),
314 'title' => array(
315 'title' => true,
316 ),
317 'path' => array(
318 'd' => true,
319 'fill' => true,
320 'stroke' => true,
321 'stroke-width' => true,
322 'stroke-linejoin' => true,
323 'stroke-linecap' => true,
324 ),
325 'rect' => array(
326 'width' => true,
327 'height' => true,
328 'x' => true,
329 'y' => true,
330 'rx' => true,
331 'ry' => true,
332 'fill' => true,
333 'stroke' => true,
334 'stroke-width' => true,
335 'stroke-linejoin' => true,
336 'stroke-linecap' => true,
337 ),
338 'circle' => array(
339 'cx' => true,
340 'cy' => true,
341 'r' => true,
342 'stroke' => true,
343 'stroke-width' => true,
344 'stroke-linejoin' => true,
345 'stroke-linecap' => true,
346 ),
347 );
348 $kses_with_extras = array_merge( $kses_defaults, $svg_args );
349 // For embedded PDF viewer
350 $style_script_args = array(
351 'style' => true,
352 'script' => array(
353 'src' => true,
354 ),
355 );
356 return array_merge( $kses_with_extras, $style_script_args );
357 }
358
359 /**
360 * Get the singular label from a $post object
361 *
362 * @since 6.9.3
363 */
364 function get_post_type_singular_label( $post ) {
365 $post_type_singular_label = '';
366 if ( property_exists( $post, 'post_type' ) ) {
367 $post_type_object = get_post_type_object( $post->post_type );
368 if ( is_object( $post_type_object ) && property_exists( $post_type_object, 'label' ) ) {
369 $post_type_singular_label = $post_type_object->labels->singular_name;
370 }
371 }
372 return $post_type_singular_label;
373 }
374
375 function is_in_block_editor() {
376 $current_screen = get_current_screen();
377 if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) {
378 return true;
379 } else {
380 return false;
381 }
382 }
383
384 /**
385 * Check if WooCommerce is active
386 *
387 * @since 6.9.9
388 */
389 public function is_woocommerce_active() {
390 if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
391 return true;
392 } else {
393 return false;
394 }
395 }
396
397 /**
398 * Convert HEX color to RGBA
399 *
400 * @link https://stackoverflow.com/a/31934345
401 * @since 7.0.0
402 */
403 public function hex_to_rgba( $hex, $alpha = false ) {
404 $hex = str_replace( '#', '', trim( $hex ) );
405 $length = strlen( $hex );
406 $rgb['r'] = hexdec( ( $length == 6 ? substr( $hex, 0, 2 ) : (( $length == 3 ? str_repeat( substr( $hex, 0, 1 ), 2 ) : 0 )) ) );
407 $rgb['g'] = hexdec( ( $length == 6 ? substr( $hex, 2, 2 ) : (( $length == 3 ? str_repeat( substr( $hex, 1, 1 ), 2 ) : 0 )) ) );
408 $rgb['b'] = hexdec( ( $length == 6 ? substr( $hex, 4, 2 ) : (( $length == 3 ? str_repeat( substr( $hex, 2, 1 ), 2 ) : 0 )) ) );
409 if ( false !== $alpha ) {
410 $rgb['a'] = $alpha;
411 }
412 // Return array of r, g, b and a
413 // return $rgb;
414 // Return rgb(255,255,255) or rgba(255,255,255,.5)
415 return implode( array_keys( $rgb ) ) . '(' . implode( ', ', $rgb ) . ')';
416 }
417
418 /**
419 * Increases or decreases the brightness of a color by a percentage of the current brightness.
420 *
421 * @param string $hex Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
422 * @param float $adjustment_percentage A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
423 *
424 * @return string
425 *
426 * @link https://stackoverflow.com/a/54393956
427 * @author maliayas
428 */
429 function adjust_bnrightness( $hex, $adjustment_percentage ) {
430 $hex = ltrim( $hex, '#' );
431 if ( strlen( $hex ) == 3 ) {
432 $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
433 }
434 $hex = array_map( 'hexdec', str_split( $hex, 2 ) );
435 foreach ( $hex as &$color ) {
436 $adjustableLimit = ( $adjustment_percentage < 0 ? $color : 255 - $color );
437 $adjustAmount = ceil( $adjustableLimit * $adjustment_percentage );
438 $color = str_pad(
439 dechex( $color + $adjustAmount ),
440 2,
441 '0',
442 STR_PAD_LEFT
443 );
444 }
445 return '#' . implode( $hex );
446 }
447
448 /**
449 * Detect if a color is light or dark
450 *
451 * @link https://stackoverflow.com/a/12228730
452 * @since 7.0.0
453 */
454 public function is_color_dark( $hex ) {
455 $hex = str_replace( '#', '', trim( $hex ) );
456 $r = hexdec( $hex[0] . $hex[1] );
457 $g = hexdec( $hex[2] . $hex[3] );
458 $b = hexdec( $hex[4] . $hex[5] );
459 $lightness = (max( $r, $g, $b ) + min( $r, $g, $b )) / 510.0;
460 // HSL algorithm
461 if ( $lightness > 0.8 ) {
462 return false;
463 } else {
464 return true;
465 }
466 }
467
468 /**
469 * Return SVG for small triangle in place of using &#9654; HTMl character
470 * which may be converted to emoticon by the browser or app
471 *
472 * @since 7.2.0
473 */
474 public function get_svg_triangle() {
475 return '<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 16 16"><path fill="currentColor" d="M14.222 6.687a1.5 1.5 0 0 1 0 2.629l-10 5.499A1.5 1.5 0 0 1 2 13.5V2.502a1.5 1.5 0 0 1 2.223-1.314z"/></svg>';
476 }
477
478 /**
479 * Get an image URL from an ASE setting field, which could be an internal relative URL or an external URL
480 *
481 * @since 7.2.1
482 */
483 public function get_image_url( $ase_settings_field_name ) {
484 $options = get_option( ASENHA_SLUG_U, array() );
485 if ( isset( $options[$ase_settings_field_name] ) ) {
486 if ( false === strpos( $options[$ase_settings_field_name], 'http' ) && false !== strpos( $options[$ase_settings_field_name], '/uploads/' ) ) {
487 $logo_image = content_url() . $options[$ase_settings_field_name];
488 } else {
489 // $maybe_valid_url = filter_var( $options['admin_logo_image'], FILTER_SANITIZE_URL );
490 $maybe_valid_url = sanitize_url( $options[$ase_settings_field_name], array('http', 'https') );
491 if ( false !== filter_var( $maybe_valid_url, FILTER_VALIDATE_URL ) ) {
492 $logo_image = $maybe_valid_url;
493 } else {
494 $logo_image = '';
495 }
496 }
497 } else {
498 $logo_image = '';
499 }
500 return $logo_image;
501 }
502
503 /**
504 * Get current URL, without query parameters and without trailing slash
505 * e.g. https://www.site.com/some-page
506 *
507 * @return string
508 */
509 public function get_current_url() {
510 $output = '';
511 $url = (( is_ssl() ? 'https://' : 'http://' )) . sanitize_text_field( $_SERVER['HTTP_HOST'] ) . sanitize_text_field( $_SERVER['REQUEST_URI'] );
512 $url_parts = explode( '?', $url, 2 );
513 // limit to max of 2 elements with last element containing the rest of the string
514 if ( isset( $url_parts[0] ) ) {
515 $output = trim( $url_parts[0], '/' );
516 }
517 return ( $output ? urldecode( $output ) : '/' );
518 }
519
520 /**
521 * Get array of elements with value of true
522 *
523 * @since 7.6.10
524 */
525 public function get_array_of_keys_with_true_value( $array_with_true_false_values ) {
526 $array_of_keys_with_true_value = array();
527 if ( is_array( $array_with_true_false_values ) && count( $array_with_true_false_values ) > 0 ) {
528 foreach ( $array_with_true_false_values as $key => $value ) {
529 if ( $value ) {
530 $array_of_keys_with_true_value[] = $key;
531 }
532 }
533 return $array_of_keys_with_true_value;
534 } else {
535 return array();
536 // default, empty array
537 }
538 }
539
540 }
541