PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / trunk
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP vtrunk
1.2.72 1.2.71 1.2.70 1.2.69 1.2.68 1.2.67 1.2.66 1.2.65 1.2.64 1.2.63 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 All 172 releases
userswp / includes / helpers / misc.php

misc.php in UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP trunk, at includes/helpers/misc.php

2,125 lines 57.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Converts string value to options array.
5 * Used in select, multiselect and radio fields.
6 * Wraps inside optgroup if available.
7 *
8 * @since 1.0.0
9 * @package userswp
10 *
11 * @param string $option_values String option values.
12 * @param bool $translated Do you want to translate the output?
13 *
14 * @return array|null Options array.
15 */
16 function uwp_string_values_to_options($option_values = '', $translated = false)
17 {
18 $options = array();
19 if ($option_values == '') {
20 return NULL;
21 }
22
23 if (strpos($option_values, "{/optgroup}") !== false) {
24 $option_values_arr = explode("{/optgroup}", $option_values);
25
26 foreach ($option_values_arr as $optgroup) {
27 if (strpos($optgroup, "{optgroup}") !== false) {
28 $optgroup_arr = explode("{optgroup}", $optgroup);
29
30 $count = 0;
31 foreach ($optgroup_arr as $optgroup_str) {
32 $count++;
33 $optgroup_str = trim($optgroup_str);
34
35 $optgroup_label = '';
36 if (strpos($optgroup_str, "|") !== false) {
37 $optgroup_str_arr = explode("|", $optgroup_str, 2);
38 $optgroup_label = trim($optgroup_str_arr[0]);
39 if ($translated && $optgroup_label != '') {
40 $optgroup_label = __($optgroup_label, 'userswp');
41 }
42 $optgroup_label = ucfirst($optgroup_label);
43 $optgroup_str = $optgroup_str_arr[1];
44 }
45
46 $optgroup3 = uwp_string_to_options($optgroup_str, $translated);
47
48 if ($count > 1 && $optgroup_label != '' && !empty($optgroup3)) {
49 $optgroup_start = array(array('label' => $optgroup_label, 'value' => NULL, 'optgroup' => 'start'));
50 $optgroup_end = array(array('label' => $optgroup_label, 'value' => NULL, 'optgroup' => 'end'));
51 $optgroup3 = array_merge($optgroup_start, $optgroup3, $optgroup_end);
52 }
53 $options = array_merge($options, $optgroup3);
54 }
55 } else {
56 $optgroup1 = uwp_string_to_options($optgroup, $translated);
57 $options = array_merge($options, $optgroup1);
58 }
59 }
60 } else {
61 $options = uwp_string_to_options($option_values, $translated);
62 }
63
64 return $options;
65 }
66
67 /**
68 * Converts string value to options array.
69 * Used in select, multiselect and radio fields.
70 *
71 * @since 1.0.0
72 * @package userswp
73 *
74 * @param string $input Input String
75 * @param bool $translated Do you want to translate the output?
76 *
77 * @return array Options array.
78 */
79 function uwp_string_to_options($input = '', $translated = false)
80 {
81 $return = array();
82 if ($input != '') {
83 $input = trim($input);
84 $input = rtrim($input, ",");
85 $input = ltrim($input, ",");
86 $input = trim($input);
87 }
88
89 $input_arr = explode(',', $input);
90
91 if (!empty($input_arr)) {
92 foreach ($input_arr as $input_str) {
93 $input_str = trim(stripslashes($input_str));
94
95 if (strpos($input_str, "/") !== false) {
96 $input_str = explode("/", $input_str, 2);
97 $label = trim($input_str[0]);
98 if ($translated && $label != '') {
99 $label = __($label, 'userswp');
100 }
101 $label = ucfirst($label);
102 $value = trim($input_str[1]);
103 } else {
104 if ($translated && $input_str != '') {
105 $input_str = __($input_str, 'userswp');
106 }
107 $label = ucfirst($input_str);
108 $value = $input_str;
109 }
110
111 if ($label != '') {
112 $return[] = array('label' => $label, 'value' => $value, 'optgroup' => NULL);
113 }
114 }
115 }
116
117 return $return;
118 }
119
120 /**
121 * Resizes thumbnail image.
122 *
123 * @since 1.0.0
124 * @package userswp
125 *
126 * @param string $thumb_image_name
127 * @param string $image
128 * @param int $x x-coordinate of source point.
129 * @param int $y y-coordinate of source point.
130 * @param int $src_w Source width.
131 * @param int $src_h Source height.
132 * @param float $scale Image scale ratio.
133 *
134 * @return mixed Resized image.
135 */
136 function uwp_resizeThumbnailImage($thumb_image_name, $image, $x, $y, $src_w, $src_h, $scale, $wp_error = false)
137 {
138 uwp_set_php_limits();
139
140 // Ignore image creation warnings
141 @ini_set('gd.jpeg_ignore_warning', 1);
142
143 $newImageWidth = ceil($src_w * $scale);
144 $newImageHeight = ceil($src_h * $scale);
145
146 /** @noinspection PhpUnusedLocalVariableInspection */
147 list($imagewidth, $imageheight, $imageType) = getimagesize($image);
148 $imageType = image_type_to_mime_type($imageType);
149
150 if (function_exists('wp_crop_image')) {
151 $wp_crop = ! in_array($imageType, array('image/gif', 'image/pjpeg', 'image/jpeg', 'image/jpg', 'image/png', 'image/x-png', 'image/webp')) ? true : false;
152 $wp_crop = apply_filters('uwp_resize_image_use_wp_crop_image', $wp_crop, $imageType, $image, $thumb_image_name, $x, $y, $src_w, $src_h, $scale);
153
154 if ($wp_crop) {
155 $cropped = wp_crop_image($image, $x, $y, $src_w, $src_h, $newImageWidth, $newImageHeight, false, $thumb_image_name);
156
157 if ($wp_error && is_wp_error($cropped)) {
158 return $cropped;
159 }
160
161 return $thumb_image_name;
162 }
163 }
164
165 $newImage = imagecreatetruecolor($newImageWidth, $newImageHeight);
166 $source = false;
167
168 switch ($imageType) {
169 case "image/gif":
170 $source = imagecreatefromgif($image);
171 break;
172 case "image/pjpeg":
173 case "image/jpeg":
174 case "image/jpg":
175 $source = imagecreatefromjpeg($image);
176 break;
177 case "image/png":
178 case "image/x-png":
179 $source = imagecreatefrompng($image);
180 if (apply_filters('uwp_keep_png_transperent', true, $thumb_image_name, $image, $x, $y, $src_w, $src_h)) {
181 $background = imagecolorallocate($newImage, 0, 0, 0);
182
183 imagecolortransparent($newImage, $background);
184 imagealphablending($newImage, false);
185 imagesavealpha($newImage, true);
186 }
187 break;
188 case "image/webp":
189 if (function_exists('imagecreatefromwebp')) {
190 $source = imagecreatefromwebp($image);
191 imagealphablending($newImage, false);
192 imagesavealpha($newImage, true);
193 }
194 break;
195 }
196
197 imagecopyresampled($newImage, $source, 0, 0, $x, $y, $newImageWidth, $newImageHeight, $src_w, $src_h);
198
199 $quality = apply_filters('uwp_resize_thumb_quality', 100);
200
201 switch ($imageType) {
202 case "image/gif":
203 imagegif($newImage, $thumb_image_name);
204 break;
205 case "image/pjpeg":
206 case "image/jpeg":
207 case "image/jpg":
208 imagejpeg($newImage, $thumb_image_name, $quality);
209 break;
210 case "image/png":
211 case "image/x-png":
212 imagepng($newImage, $thumb_image_name);
213 break;
214 case "image/webp":
215 if (function_exists('imagewebp')) {
216 imagewebp($newImage, $thumb_image_name, $quality);
217 } else {
218 imagepng($newImage, $thumb_image_name);
219 }
220 break;
221 }
222
223 chmod($thumb_image_name, 0777);
224 imagedestroy($newImage);
225 imagedestroy($source);
226
227 return $thumb_image_name;
228 }
229
230 /**
231 * Try to set higher limits on the fly
232 */
233 function uwp_set_php_limits()
234 {
235 error_reporting(0);
236
237 // try to set higher limits for import
238 $max_input_time = ini_get('max_input_time');
239 $max_execution_time = ini_get('max_execution_time');
240 $memory_limit = ini_get('memory_limit');
241
242 if ($max_input_time !== 0 && $max_input_time != -1 && (! $max_input_time || $max_input_time < 3000)) {
243 ini_set('max_input_time', 3000);
244 }
245
246 if ($max_execution_time !== 0 && (! $max_execution_time || $max_execution_time < 3000)) {
247 ini_set('max_execution_time', 3000);
248 }
249
250 if ($memory_limit && str_replace('M', '', $memory_limit)) {
251 if (str_replace('M', '', $memory_limit) < 256) {
252 ini_set('memory_limit', '256M');
253 }
254 }
255
256 ini_set('auto_detect_line_endings', true);
257 }
258
259 /**
260 * Logs the error message.
261 *
262 * @since 1.0.0
263 * @package userswp
264 *
265 * @param array|object|string $log Error message.
266 *
267 * @return void
268 */
269 function uwp_error_log($log)
270 {
271 /*
272 * A filter to override the debugging setting for function uwp_error_log().
273 */
274 $should_log = apply_filters('uwp_log_errors', uwp_get_option('enable_uwp_error_log', 0));
275 if (1 == $should_log) {
276 if (is_array($log) || is_object($log)) {
277 error_log(print_r($log, true));
278 } else {
279 error_log($log);
280 }
281 }
282 }
283
284 function uwp_get_excluded_users_list()
285 {
286
287 $args = array(
288 'fields' => 'ID',
289 'meta_query' => array(
290 'relation' => 'OR',
291 array(
292 'key' => 'uwp_mod',
293 'value' => 'email_unconfirmed',
294 'compare' => '=='
295 ),
296 array(
297 'key' => 'uwp_hide_from_listing',
298 'value' => 1,
299 'compare' => '=='
300 )
301 )
302 );
303
304 $inactive_users = new WP_User_Query($args);
305 $exclude_users = $inactive_users->get_results();
306
307 $excluded_globally = uwp_get_option('users_excluded_from_list');
308 if (!empty($excluded_globally)) {
309
310 if (is_array($excluded_globally)) {
311 $exclude_users = array_merge($exclude_users, $excluded_globally);
312 } else {
313 $excluded_users = str_replace(' ', '', $excluded_globally);
314 $users_array = explode(',', $excluded_users);
315 $exclude_users = array_merge($exclude_users, $users_array);
316 }
317 }
318
319 return $exclude_users;
320 }
321
322 /**
323 * Retrieves a list of users with optional filtering, searching, and sorting.
324 *
325 * @since 1.0.0
326 * @package userswp
327 *
328 * @param array $roles Optional. Array of user roles to filter by. Default empty array.
329 * @return array {
330 * Array of users and pagination data.
331 *
332 * @type array $users Array of WP_User objects.
333 * @type int $total_users Total number of users found.
334 * }
335 */
336 function get_uwp_users_list( $roles = array() )
337 {
338 global $wpdb;
339
340 // Sanitize and validate input parameters
341 $keyword = false;
342 if ( isset( $_GET['uwps'] ) && ! empty( $_GET['uwps'] ) ) {
343 $keyword = sanitize_text_field( wp_unslash( $_GET['uwps'] ) );
344 }
345
346 // Get pagination parameter with proper fallback
347 $paged = 1;
348 if ( isset( $_GET['paged'] ) && ! empty( $_GET['paged'] ) ) {
349 $paged = absint( $_GET['paged'] );
350 } elseif ( is_front_page() ) {
351 $page_var = get_query_var( 'page' );
352 $paged = absint( $page_var ) > 0 ? absint( $page_var ) : 1;
353 } else {
354 $paged_var = get_query_var( 'paged' );
355 $paged = absint( $paged_var ) > 0 ? absint( $paged_var ) : 1;
356 }
357
358 // Get number of items per page
359 $number = absint( uwp_get_option( 'users_no_of_items', 10 ) );
360 $number = $number > 0 ? $number : 10;
361
362 // Get search where clause from filters
363 $where = '';
364 $where = apply_filters( 'uwp_users_search_where', $where, $keyword );
365
366 // Get excluded users list
367 $exclude_users = uwp_get_excluded_users_list();
368 $exclude_users = apply_filters( 'uwp_excluded_users_from_list', $exclude_users, $where, $keyword );
369 $exclude_users = ! empty( $exclude_users ) ? array_unique( $exclude_users ) : array();
370
371 // Initialize sorting parameters
372 $exclude_query = ' ';
373 $order_by = 'uwp_meta_value';
374 $order = 'ASC';
375 $meta_key = '';
376
377 // Get and sanitize sort parameter
378 $sort_by = '';
379 if ( isset( $_GET['uwp_sort_by'] ) && ! empty( $_GET['uwp_sort_by'] ) ) {
380 $sort_by = sanitize_text_field( wp_unslash( $_GET['uwp_sort_by'] ) );
381 }
382
383 // Process sorting parameters
384 if ( ! empty( $sort_by ) ) {
385 // Handle special cases for newer/older
386 if ( 'newer' === $sort_by ) {
387 $order_by = 'user_registered';
388 $order = 'DESC';
389 } elseif ( 'older' === $sort_by ) {
390 $order_by = 'user_registered';
391 $order = 'ASC';
392 } else {
393 // Handle _asc and _desc suffixes
394 if ( substr( $sort_by, -4 ) === '_asc' ) {
395 $order_by = substr( $sort_by, 0, -4 );
396 $order = 'ASC';
397 } elseif ( substr( $sort_by, -5 ) === '_desc' ) {
398 $order_by = substr( $sort_by, 0, -5 );
399 $order = 'DESC';
400 } else {
401 // Default to ASC if no suffix
402 $order_by = $sort_by;
403 $order = 'ASC';
404 }
405 }
406 }
407
408 // Build exclude query for excluded users
409 if ( ! empty( $exclude_users ) ) {
410 $exclude_users_list = implode( ',', array_map( 'absint', $exclude_users ) );
411 $exclude_query = 'AND ' . $wpdb->users . '.ID NOT IN (' . $exclude_users_list . ')';
412 }
413
414 $users = array();
415
416 // Check if we have search criteria
417 if ( $keyword || $where ) {
418
419 // Build search query based on whether we have custom where clause
420 if ( empty( $where ) ) {
421 // Standard search query with keyword
422 $search_term = '%' . $wpdb->esc_like( $keyword ) . '%';
423 $user_query = $wpdb->prepare(
424 "SELECT DISTINCT SQL_CALC_FOUND_ROWS {$wpdb->users}.*
425 FROM {$wpdb->users}
426 LEFT JOIN {$wpdb->usermeta} AS first_name_meta ON ( {$wpdb->users}.ID = first_name_meta.user_id AND first_name_meta.meta_key = 'first_name' )
427 LEFT JOIN {$wpdb->usermeta} AS last_name_meta ON ( {$wpdb->users}.ID = last_name_meta.user_id AND last_name_meta.meta_key = 'last_name' )
428 LEFT JOIN {$wpdb->usermeta} AS nickname_meta ON ( {$wpdb->users}.ID = nickname_meta.user_id AND nickname_meta.meta_key = 'nickname' )
429 WHERE 1=1
430 {$exclude_query}
431 AND (
432 first_name_meta.meta_value LIKE %s
433 OR last_name_meta.meta_value LIKE %s
434 OR nickname_meta.meta_value LIKE %s
435 OR user_login LIKE %s
436 OR user_nicename LIKE %s
437 OR display_name LIKE %s
438 )
439 ORDER BY display_name ASC",
440 $search_term,
441 $search_term,
442 $search_term,
443 $search_term,
444 $search_term,
445 $search_term
446 );
447 } else {
448 // Custom where clause with uwp_usermeta table
449 $usermeta_table = get_usermeta_table_prefix() . 'uwp_usermeta';
450 $keyword_query = '';
451
452 if ( $keyword ) {
453 $search_term = '%' . $wpdb->esc_like( $keyword ) . '%';
454 $keyword_query = $wpdb->prepare(
455 " AND (( {$wpdb->usermeta}.meta_key = 'first_name' AND {$wpdb->usermeta}.meta_value LIKE %s )
456 OR ( {$wpdb->usermeta}.meta_key = 'last_name' AND {$wpdb->usermeta}.meta_value LIKE %s )
457 OR ( {$wpdb->usermeta}.meta_key = 'nickname' AND {$wpdb->usermeta}.meta_value LIKE %s )
458 OR user_login LIKE %s
459 OR user_nicename LIKE %s
460 OR display_name LIKE %s)",
461 $search_term,
462 $search_term,
463 $search_term,
464 $search_term,
465 $search_term,
466 $search_term
467 );
468 }
469
470 $user_query = "SELECT DISTINCT SQL_CALC_FOUND_ROWS {$wpdb->users}.*
471 FROM {$wpdb->users}
472 INNER JOIN {$wpdb->usermeta} ON ( {$wpdb->users}.ID = {$wpdb->usermeta}.user_id )
473 INNER JOIN {$usermeta_table} ON ( {$wpdb->users}.ID = {$usermeta_table}.user_id )
474 WHERE 1=1 {$keyword_query} {$exclude_query} {$where}
475 ORDER BY display_name ASC";
476 }
477
478 // Execute search query
479 $user_results = $wpdb->get_results( $user_query ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
480 $get_users = wp_list_pluck( $user_results, 'ID' );
481
482 // Filter by roles if specified
483 if ( ! empty( $roles ) && is_array( $roles ) ) {
484 $role_users = get_users( array(
485 'role__in' => $roles,
486 'fields' => array( 'ID' )
487 ) );
488 $role_user_ids = wp_list_pluck( $role_users, 'ID' );
489
490 if ( ! empty( $get_users ) && ! empty( $role_user_ids ) ) {
491 $get_users = array_intersect( $get_users, $role_user_ids );
492 }
493 }
494
495 // Process results if we have users
496 if ( ! empty( $get_users ) && is_array( $get_users ) ) {
497 // Prepare WP_User_Query arguments
498 $args = array(
499 'include' => $get_users,
500 'number' => $number,
501 'paged' => $paged,
502 );
503
504 // Add exclude users if any
505 if ( ! empty( $exclude_users ) ) {
506 $args['exclude'] = $exclude_users;
507 }
508
509 // Add meta_key if specified
510 if ( ! empty( $meta_key ) ) {
511 $args['meta_key'] = $meta_key;
512 }
513
514 // Handle sorting
515 if ( ! empty( $order_by ) && ! empty( $order ) ) {
516 if ( in_array( $order_by, array( 'first_name', 'last_name' ), true ) ) {
517 $args['meta_key'] = $order_by;
518 $args['orderby'] = 'meta_value';
519 $args['order'] = $order;
520 } else {
521 $args['orderby'] = $order_by;
522 $args['order'] = $order;
523 }
524 }
525
526 // Execute WP_User_Query
527 $uwp_users_query = new WP_User_Query( $args );
528 $users['users'] = $uwp_users_query->get_results();
529 $users['total_users'] = $uwp_users_query->get_total();
530
531 } else {
532 $users['users'] = array();
533 $users['total_users'] = 0;
534 }
535 } else {
536 // No search criteria - get all users with optional role filtering
537 $args = array(
538 'number' => $number,
539 'paged' => $paged,
540 );
541
542 // Add exclude users if any
543 if ( ! empty( $exclude_users ) ) {
544 $args['exclude'] = $exclude_users;
545 }
546
547 // Filter by roles if specified
548 if ( ! empty( $roles ) && is_array( $roles ) ) {
549 $args['role__in'] = $roles;
550 }
551
552 // Add meta_key if specified
553 if ( ! empty( $meta_key ) ) {
554 $args['meta_key'] = $meta_key;
555 }
556
557 // Handle sorting
558 if ( ! empty( $order_by ) && ! empty( $order ) ) {
559 if ( in_array( $order_by, array( 'first_name', 'last_name' ), true ) ) {
560 $args['meta_key'] = $order_by;
561 $args['orderby'] = 'meta_value';
562 $args['order'] = $order;
563 } else {
564 $args['orderby'] = $order_by;
565 $args['order'] = $order;
566 }
567 }
568
569 // Execute WP_User_Query
570 $uwp_users_query = new WP_User_Query( $args );
571 $users['users'] = $uwp_users_query->get_results();
572 $users['total_users'] = $uwp_users_query->get_total();
573 }
574
575 return $users;
576 }
577
578 /**
579 * Returns the Users page layout class based on the setting.
580 *
581 * @since 1.0.0
582 * @package userswp
583 *
584 * @return string Layout class.
585 */
586 function uwp_get_layout_class($layout, $count_only = false)
587 {
588 if (!$layout) {
589 if (uwp_get_option("design_style", 'bootstrap')) {
590 $value = '3col';
591 } else {
592 $value = 'list';
593 }
594 $layout = uwp_get_option('users_default_layout', $value);
595 }
596
597 switch ($layout) {
598 case "list":
599 $class = "uwp_listview";
600 $bs_class = "row-cols-md-1";
601 $col_count = 1;
602 break;
603 case "2col":
604 $class = "uwp_gridview uwp_gridview_2col";
605 $bs_class = "row-cols-md-2";
606 $col_count = 2;
607 break;
608 case "3col":
609 $class = "uwp_gridview uwp_gridview_3col";
610 $bs_class = "row-cols-md-3";
611 $col_count = 3;
612 break;
613 case "4col":
614 $class = "uwp_gridview uwp_gridview_4col";
615 $bs_class = "row-cols-md-4";
616 $col_count = 4;
617 break;
618 case "5col":
619 $class = "uwp_gridview uwp_gridview_5col";
620 $bs_class = "row-cols-md-5";
621 $col_count = 5;
622 break;
623 default:
624 $class = "uwp_listview";
625 $bs_class = "row-cols-md-3";
626 $col_count = 1;
627 }
628
629 if ($count_only) {
630 return $col_count;
631 }
632
633 if (uwp_get_option("design_style", 'bootstrap')) {
634 return $bs_class;
635 }
636
637 return $class;
638 }
639
640 add_filter('uwp_users_list_ul_extra_class', 'uwp_get_layout_class', 10, 1);
641
642 add_filter('get_user_option_metaboxhidden_nav-menus', 'uwp_always_nav_menu_visibility', 10, 3);
643
644 /**
645 * Filters nav menu visibility option value.
646 *
647 * @since 1.0.0
648 * @package userswp
649 *
650 * @param mixed $result Value for the user's option.
651 * @param string $option Name of the option being retrieved.
652 * @param WP_User $user WP_User object of the user whose option is being retrieved.
653 *
654 * @return array Filtered value.
655 */
656 function uwp_always_nav_menu_visibility($result, $option, $user)
657 {
658 if (is_array($result) && in_array('add-users-wp-nav-menu', $result)) {
659 $result = array_diff($result, array('add-users-wp-nav-menu'));
660 }
661
662 return $result;
663 }
664
665 // Privacy
666 add_filter('uwp_account_page_title', 'uwp_account_privacy_page_title', 10, 2);
667
668 /**
669 * Adds Privacy tab title in Account page.
670 *
671 * @since 1.0.0
672 * @package userswp
673 *
674 * @param string $title Privacy title.
675 * @param string $type Tab type.
676 *
677 * @return string Title.
678 */
679 function uwp_account_privacy_page_title($title, $type)
680 {
681
682 if ($type == 'privacy') {
683 $title = __('Privacy', 'userswp');
684 } elseif ($type == 'notifications') {
685 $title = __('E-Mail Notifications', 'userswp');
686 } elseif ($type == 'delete-account') {
687 $title = __('Delete Account', 'userswp');
688 } elseif ($type == 'change-password') {
689 $title = __('Change Password', 'userswp');
690 } elseif ($type == 'wp2fa') {
691 $title = __('Two-factor Authentication Settings', 'userswp');
692 }
693
694 return $title;
695 }
696
697 add_action('uwp_account_menu_display', 'uwp_add_account_menu_links');
698
699 /**
700 * Prints "Edit account" page subtab / submenu links. Ex: Privacy
701 *
702 * @since 1.0.0
703 * @package userswp
704 *
705 * @return void
706 */
707 function uwp_add_account_menu_links()
708 {
709 global $aui_bs5;
710
711 if (isset($_GET['type'])) {
712 $type = strip_tags(esc_sql($_GET['type']));
713 } else {
714 $type = 'account';
715 }
716
717 $account_page = uwp_get_page_id('account_page', false);
718 $account_page_link = get_permalink($account_page);
719
720 $account_available_tabs = uwp_account_get_available_tabs();
721
722 if (!is_array($account_available_tabs) && count($account_available_tabs) > 0) {
723 return;
724 }
725
726 $legacy = '<ul class="uwp_account_menu">';
727 ob_start();
728 ?>
729 <ul class="<?php echo $aui_bs5 ? 'nav' : 'navbar-nav'; ?> m-0 p-0 mt-3 list-unstyled flex-lg-column flex-row flex-wrap" aria-labelledby="account_settings">
730 <?php
731 foreach ($account_available_tabs as $tab_id => $tab) {
732
733 if ($tab_id == 'account') {
734 $tab_url = $account_page_link;
735 } else {
736 $tab_url = add_query_arg(array(
737 'type' => $tab_id,
738 ), $account_page_link);
739 }
740
741 if (isset($tab['link'])) {
742 $tab_url = $tab['link'];
743 }
744
745 $active = $type == $tab_id ? ' active' : '';
746
747 ?>
748 <li class="nav-item m-0 p-0 list-unstyled mx-md-2 mx-2">
749 <a class="nav-link text-decoration-none uwp-account-<?php echo esc_attr($tab_id . ' ' . $active); ?>" href="<?php echo esc_url($tab_url); ?>"><?php echo '<i class="' . esc_attr($tab["icon"]) . ' mr-1 fa-fw"></i>' . esc_html($tab['title']); ?></a>
750 </li>
751 <?php
752
753 $legacy .= '<li id="uwp-account-' . $tab_id . '">';
754 $legacy .= '<a class="' . $active . '" href="' . esc_url($tab_url) . '">';
755 $legacy .= '<i class="' . esc_attr($tab["icon"]) . '"></i>' . esc_html($tab["title"]);
756 $legacy .= '</a></li>';
757 }
758 ?>
759 </ul>
760 <?php
761 $legacy .= '</ul>';
762 $bs_output = ob_get_clean();
763 $style = uwp_get_option('design_style', 'bootstrap');
764 if (!empty($style)) {
765 echo $bs_output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
766 } else {
767 echo $legacy; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
768 }
769 }
770
771 /**
772 * Updates extras fields sort order.
773 *
774 * @since 1.0.0
775 * @package userswp
776 *
777 * @param array $field_ids Form extras field ids.
778 * @param string $form_type Form type.
779 * @param int $form_id Form ID.
780 *
781 * @return array|bool Sorted field ids.
782 */
783 function uwp_form_extras_field_order($field_ids = array(), $form_type = 'register', $form_id = 1)
784 {
785 global $wpdb;
786 $extras_table_name = uwp_get_table_prefix() . 'uwp_form_extras';
787
788 $count = 0;
789 if (!empty($field_ids)):
790 foreach ($field_ids as $id) {
791
792 $cf = trim($id, '_');
793
794 $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
795 $extras_table_name,
796 array(
797 'sort_order' => $count,
798 ),
799 array('id' => $cf, 'form_id' => $form_id)
800 );
801
802 $count++;
803 }
804
805 return $field_ids;
806 else:
807 return false;
808 endif;
809 }
810
811 /**
812 * Uppercase the first character of each word in a string.
813 *
814 * @since 1.0.0
815 * @package userswp
816 *
817 * @param string $string String to convert.
818 * @param string $charset Charset.
819 *
820 * @return string Converted string.
821 */
822 function uwp_ucwords($string, $charset = 'UTF-8')
823 {
824 if (function_exists('mb_convert_case')) {
825 return mb_convert_case($string, MB_CASE_TITLE, $charset);
826 } else {
827 return ucwords($string);
828 }
829 }
830
831 /**
832 * Checks whether the column exists in the table.
833 *
834 * @since 1.0.0
835 * @package userswp
836 *
837 * @param string $db Table name.
838 * @param string $column Column name.
839 *
840 * @return bool
841 */
842 function uwp_column_exist($db, $column)
843 {
844 $table = new UsersWP_Tables();
845 return $table->column_exists($db, $column);
846 }
847
848 /**
849 * Adds column if not exist in the table.
850 *
851 * @since 1.0.0
852 * @package userswp
853 *
854 * @param string $db Table name.
855 * @param string $column Column name.
856 * @param string $column_attr Column attributes.
857 *
858 * @return bool|int True when success.
859 */
860 function uwp_add_column_if_not_exist($db, $column, $column_attr = "VARCHAR( 255 ) NOT NULL")
861 {
862 $table = new UsersWP_Tables();
863 return $table->add_column_if_not_exist($db, $column, $column_attr);
864 }
865
866 /**
867 * Returns excluded custom fields.
868 *
869 * @since 1.0.0
870 * @package userswp
871 *
872 * @return array Excluded custom fields.
873 */
874 function uwp_get_excluded_fields()
875 {
876 $excluded = array(
877 'password',
878 'confirm_password',
879 'user_privacy',
880 );
881 return apply_filters('uwp_excluded_fields', $excluded);
882 }
883
884 /**
885 * Formats the currency using currency separator.
886 *
887 * @since 1.0.0
888 * @package userswp
889 *
890 * @param string $number Currency number.
891 * @param array|string $cf Custom field info.
892 *
893 * @return string Formatted currency.
894 */
895 function uwp_currency_format_number($number = '', $cf = '')
896 {
897
898 $cs = isset($cf['extra_fields']) ? maybe_unserialize($cf['extra_fields']) : '';
899
900 $symbol = isset($cs['currency_symbol']) ? $cs['currency_symbol'] : '$';
901 $decimals = isset($cf['decimal_point']) && $cf['decimal_point'] ? $cf['decimal_point'] : 2;
902 $decimal_display = isset($cf['decimal_display']) && $cf['decimal_display'] ? $cf['decimal_display'] : 'if';
903 $decimalpoint = '.';
904
905 if (isset($cs['decimal_separator']) && $cs['decimal_separator'] == 'comma') {
906 $decimalpoint = ',';
907 }
908
909 $separator = ',';
910
911 if (isset($cs['thousand_separator'])) {
912 if ($cs['thousand_separator'] == 'comma') {
913 $separator = ',';
914 }
915 if ($cs['thousand_separator'] == 'slash') {
916 $separator = '\\';
917 }
918 if ($cs['thousand_separator'] == 'period') {
919 $separator = '.';
920 }
921 if ($cs['thousand_separator'] == 'space') {
922 $separator = ' ';
923 }
924 if ($cs['thousand_separator'] == 'none') {
925 $separator = '';
926 }
927 }
928
929 $currency_symbol_placement = isset($cs['currency_symbol_placement']) ? $cs['currency_symbol_placement'] : 'left';
930
931 if ($decimals > 0 && $decimal_display == 'if') {
932 if (is_int($number) || floor($number) == $number)
933 $decimals = 0;
934 }
935
936 $number = number_format($number, $decimals, $decimalpoint, $separator);
937
938
939
940 if ($currency_symbol_placement == 'left') {
941 $number = $symbol . $number;
942 } else {
943 $number = $number . $symbol;
944 }
945
946
947 return $number;
948 }
949
950
951 /**
952 * Checks whether the user can make his/her own profile private or not.
953 *
954 * @since 1.0.0
955 * @package userswp
956 *
957 * @return bool
958 */
959 function uwp_can_make_profile_private()
960 {
961 $make_profile_private = apply_filters('uwp_user_can_make_profile_private', false);
962 return $make_profile_private;
963 }
964
965 /**
966 * Returns the installation type.
967 *
968 * @since 1.0.0
969 * @package userswp
970 *
971 * @return string Installation type.
972 */
973 function uwp_get_installation_type()
974 {
975 // *. Single Site
976 if (!is_multisite()) {
977 return "single";
978 } else {
979 // Multisite
980 if (! function_exists('is_plugin_active_for_network')) {
981 require_once(ABSPATH . '/wp-admin/includes/plugin.php');
982 }
983
984 // Network active.
985 if (is_plugin_active_for_network('userswp/userswp.php')) {
986 if (defined('UWP_ROOT_PAGES')) {
987 if (UWP_ROOT_PAGES == 'all') {
988 // *. Multisite - Network Active - Pages on all sites
989 return "multi_na_all";
990 } else {
991 // *. Multisite - Network Active - Pages on specific site
992 return "multi_na_site_id";
993 }
994 } else {
995 // Multi - network active - default
996 // *. Multisite - Network Active - Pages on main site
997 return "multi_na_default";
998 }
999 } else {
1000 // * Multisite - Not network active
1001 return "multi_not_na";
1002 }
1003 }
1004 }
1005
1006 /**
1007 * Returns the table prefix based on the installation type.
1008 *
1009 * @since 1.0.0
1010 * @package userswp
1011 *
1012 * @return string Table prefix
1013 */
1014 function uwp_get_table_prefix()
1015 {
1016 $tables = new UsersWP_Tables();
1017 return $tables->get_table_prefix();
1018 }
1019
1020 /**
1021 * Returns the table prefix based on the installation type.
1022 *
1023 * @since 1.0.16
1024 * @package userswp
1025 *
1026 * @return string Table prefix
1027 */
1028 function get_usermeta_table_prefix()
1029 {
1030 $tables = new UsersWP_Tables();
1031 return $tables->get_usermeta_table_prefix();
1032 }
1033
1034 /**
1035 * Converts array to comma separated string.
1036 *
1037 *
1038 * @since 1.0.0
1039 * @package userswp
1040 *
1041 * @param string $key Custom field key.
1042 * @param string $value Custom field value.
1043 *
1044 * @return string Converted custom field value string.
1045 */
1046 function uwp_maybe_serialize($key, $value)
1047 {
1048 $field = uwp_get_custom_field_info($key);
1049 if (isset($field->field_type) && $field->field_type == 'multiselect' && is_array($value)) {
1050 $value = implode(",", $value);
1051 }
1052 return $value;
1053 }
1054
1055 /**
1056 * Converts comma separated string to array.
1057 *
1058 * @since 1.0.0
1059 * @package userswp
1060 *
1061 * @param string $key Custom field key.
1062 * @param string $value Custom field value.
1063 *
1064 * @return array Converted custom field value array.
1065 */
1066 function uwp_maybe_unserialize($key, $value)
1067 {
1068 $field = uwp_get_custom_field_info($key);
1069 if (isset($field->field_type) && $field->field_type == 'multiselect' && $value) {
1070 $value = explode(",", $value);
1071 }
1072 return $value;
1073 }
1074
1075 /**
1076 * Creates UsersWP related tables.
1077 *
1078 * @since 1.0.0
1079 * @package userswp
1080 *
1081 * @return void
1082 */
1083 function uwp_create_tables()
1084 {
1085 $tables = new UsersWP_Tables();
1086 $tables->create_tables();
1087 }
1088
1089 /**
1090 * Returns tye client IP.
1091 *
1092 * @since 1.0.0
1093 * @package userswp
1094 *
1095 * @return string IP address.
1096 */
1097 function uwp_get_ip()
1098 {
1099 if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
1100 //check ip from share internet
1101 $ip = $_SERVER['HTTP_CLIENT_IP'];
1102 } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
1103 //to check ip is pass from proxy
1104 $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
1105 } else {
1106 $ip = $_SERVER['REMOTE_ADDR'];
1107 }
1108
1109 return apply_filters('uwp_get_ip', $ip);
1110 }
1111
1112 /**
1113 * Checks whether the string starts with the given string.
1114 *
1115 * @since 1.0.0
1116 * @package userswp
1117 *
1118 * @param string $haystack String to compare with.
1119 * @param string $needle String to search for.
1120 *
1121 * @return bool True when success. False when failure.
1122 */
1123 function uwp_str_starts_with($haystack, $needle)
1124 {
1125 $length = strlen($needle);
1126 return (substr($haystack, 0, $length) === $needle);
1127 }
1128
1129 /**
1130 * Checks whether the string ends with the given string.
1131 *
1132 * @since 1.0.0
1133 * @package userswp
1134 *
1135 * @param string $haystack String to compare with.
1136 * @param string $needle String to search for.
1137 *
1138 * @return bool True when success. False when failure.
1139 */
1140 function uwp_str_ends_with($haystack, $needle)
1141 {
1142 $length = strlen($needle);
1143 if ($length == 0) {
1144 return true;
1145 }
1146
1147 return (substr($haystack, -$length) === $needle);
1148 }
1149
1150 /**
1151 * Returns the font awesome icon value for field type.
1152 * Displayed in profile tabs.
1153 *
1154 * @since 1.0.0
1155 * @package userswp
1156 *
1157 * @param string $type Field type.
1158 *
1159 * @return string Font awesome icon value.
1160 */
1161 function uwp_field_type_to_fa_icon($type)
1162 {
1163 $field_types = array(
1164 'text' => 'fas fa-minus',
1165 'datepicker' => 'fas fa-calendar-alt',
1166 'textarea' => 'fas fa-bars',
1167 'time' => 'far fa-clock',
1168 'checkbox' => 'far fa-check-square',
1169 'phone' => 'far fa-phone',
1170 'radio' => 'far fa-dot-circle',
1171 'email' => 'far fa-envelope',
1172 'select' => 'far fa-caret-square-down',
1173 'multiselect' => 'far fa-caret-square-down',
1174 'url' => 'fas fa-link',
1175 'file' => 'fas fa-file'
1176 );
1177
1178 if (isset($field_types[$type])) {
1179 return $field_types[$type];
1180 } else {
1181 return "";
1182 }
1183 }
1184
1185 /**
1186 * Check wpml active or not.
1187 *
1188 * @since 1.0.7
1189 *
1190 * @return True if WPML is active else False.
1191 */
1192 function uwp_is_wpml()
1193 {
1194 if (defined('ICL_SITEPRESS_VERSION') && ! ICL_PLUGIN_INACTIVE && class_exists('SitePress') && function_exists('icl_object_id')) {
1195 return true;
1196 }
1197
1198 return false;
1199 }
1200
1201 /**
1202 * Get the element in the WPML current language.
1203 *
1204 * @since 1.0.7
1205 *
1206 * @param int $element_id Use term_id for taxonomies, post_id for posts
1207 * @param string $element_type Use post, page, {custom post type name}, nav_menu, nav_menu_item, category, tag, etc.
1208 * You can also pass 'any', to let WPML guess the type, but this will only work for posts.
1209 * @param bool $return_original_if_missing Optional, default is FALSE. If set to true it will always return a value (the original value, if translation is missing).
1210 * @param string|NULL $ulanguage_code Optional, default is NULL. If missing, it will use the current language.
1211 * If set to a language code, it will return a translation for that language code or
1212 * the original if the translation is missing and $return_original_if_missing is set to TRUE.
1213 *
1214 * @return int|NULL
1215 */
1216 function uwp_wpml_object_id($element_id, $element_type = 'post', $return_original_if_missing = false, $ulanguage_code = null)
1217 {
1218 if (uwp_is_wpml()) {
1219 if (function_exists('wpml_object_id_filter')) {
1220 return apply_filters('wpml_object_id', $element_id, $element_type, $return_original_if_missing, $ulanguage_code);
1221 } else {
1222 return icl_object_id($element_id, $element_type, $return_original_if_missing, $ulanguage_code);
1223 }
1224 }
1225
1226 return $element_id;
1227 }
1228
1229 /**
1230 * Check if we might be on localhost.
1231 *
1232 * @return bool
1233 */
1234 function uwp_is_localhost()
1235 {
1236 $localhost = false;
1237
1238 if (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] == 'localhost') {
1239 $localhost = true;
1240 } elseif (isset($_SERVER['SERVER_ADDR']) && ($_SERVER['SERVER_ADDR'] == '127.0.0.1' || $_SERVER['SERVER_ADDR'] == '::1')) {
1241 $localhost = true;
1242 }
1243
1244 return $localhost;
1245 }
1246
1247 function uwp_get_default_avatar_uri()
1248 {
1249 $default = uwp_get_option('profile_default_profile', '');
1250 if (empty($default)) {
1251 $default = USERSWP_PLUGIN_URL . "assets/images/no_profile.png";
1252 } else {
1253 $default = wp_get_attachment_url($default);
1254 }
1255
1256 return apply_filters('uwp_default_avatar_uri', $default);
1257 }
1258
1259 function uwp_get_default_thumb_uri()
1260 {
1261 $thumb_url = USERSWP_PLUGIN_URL . "assets/images/no_thumb.png";
1262 return apply_filters('uwp_default_thumb_uri', $thumb_url);
1263 }
1264
1265 function uwp_get_default_banner_uri()
1266 {
1267 $banner = uwp_get_option('profile_default_banner', '');
1268 if (empty($banner)) {
1269 $banner_url = USERSWP_PLUGIN_URL . "assets/images/banner.png";
1270 } else {
1271 $banner_url = wp_get_attachment_url($banner);
1272 }
1273 return apply_filters('uwp_default_banner_uri', $banner_url);
1274 }
1275
1276 /**
1277 * Handles multisite upload dir path
1278 *
1279 * @param $uploads array upload variable array
1280 *
1281 * @return array updated upload variable array.
1282 */
1283 function uwp_handle_multisite_profile_image($uploads)
1284 {
1285 if (! function_exists('is_plugin_active_for_network')) {
1286 require_once(ABSPATH . '/wp-admin/includes/plugin.php');
1287 }
1288
1289 // Network active.
1290 if (is_plugin_active_for_network('userswp/userswp.php')) {
1291 $main_site = get_network()->site_id;
1292 switch_to_blog($main_site);
1293 remove_filter('upload_dir', 'uwp_handle_multisite_profile_image');
1294 $uploads = wp_upload_dir();
1295 restore_current_blog();
1296 }
1297
1298 return $uploads;
1299 }
1300
1301 /**
1302 * let_to_num function.
1303 *
1304 * This function transforms the php.ini notation for numbers (like '2M') to an integer.
1305 *
1306 * @since 2.0.0
1307 * @param $size
1308 * @return int
1309 */
1310 function uwp_let_to_num($size)
1311 {
1312 $l = substr($size, -1);
1313 $ret = substr($size, 0, -1);
1314 switch (strtoupper($l)) {
1315 case 'P':
1316 $ret *= 1024;
1317 case 'T':
1318 $ret *= 1024;
1319 case 'G':
1320 $ret *= 1024;
1321 case 'M':
1322 $ret *= 1024;
1323 case 'K':
1324 $ret *= 1024;
1325 }
1326 return $ret;
1327 }
1328
1329 function uwp_format_decimal($number, $dp = false, $trim_zeros = false)
1330 {
1331 $locale = localeconv();
1332 $decimals = array(uwp_get_decimal_separator(), $locale['decimal_point'], $locale['mon_decimal_point']);
1333
1334 // Remove locale from string.
1335 if (! is_float($number)) {
1336 $number = str_replace($decimals, '.', $number);
1337 $number = preg_replace('/[^0-9\.,-]/', '', uwp_clean($number));
1338 }
1339
1340 if (false !== $dp) {
1341 $dp = intval('' == $dp ? uwp_get_decimal_separator() : $dp);
1342 $number = number_format(floatval($number), $dp, '.', '');
1343 // DP is false - don't use number format, just return a string in our format
1344 } elseif (is_float($number)) {
1345 // DP is false - don't use number format, just return a string using whatever is given. Remove scientific notation using sprintf.
1346 $number = str_replace($decimals, '.', sprintf('%.' . uwp_get_rounding_precision() . 'f', $number));
1347 // We already had a float, so trailing zeros are not needed.
1348 $trim_zeros = true;
1349 }
1350
1351 if ($trim_zeros && strstr($number, '.')) {
1352 $number = rtrim(rtrim($number, '0'), '.');
1353 }
1354
1355 return $number;
1356 }
1357
1358 /**
1359 * Return the decimal separator.
1360 * @since 1.0.20
1361 * @return string
1362 */
1363 function uwp_get_decimal_separator()
1364 {
1365 $separator = apply_filters('uwp_decimal_separator', '.');
1366 return $separator ? stripslashes($separator) : '.';
1367 }
1368
1369 /**
1370 * Get rounding precision for internal UWP calculations.
1371 * Will increase the precision of uwp_get_decimal_separator by 2 decimals, unless UWP_ROUNDING_PRECISION is set to a higher number.
1372 *
1373 * @since 1.0.20
1374 * @return int
1375 */
1376 function uwp_get_rounding_precision()
1377 {
1378 $precision = uwp_get_decimal_separator() + 2;
1379 if (defined(UWP_ROUNDING_PRECISION) && absint(UWP_ROUNDING_PRECISION) > $precision) {
1380 $precision = absint(UWP_ROUNDING_PRECISION);
1381 }
1382 return $precision;
1383 }
1384
1385 /**
1386 * Clean variables using sanitize_text_field. Arrays are cleaned recursively.
1387 * Non-scalar values are ignored.
1388 *
1389 * @param string|array $var
1390 *
1391 * @return string|array
1392 */
1393 function uwp_clean($var)
1394 {
1395
1396 if (is_array($var)) {
1397 return array_map('uwp_clean', $var);
1398 } else {
1399 return is_scalar($var) ? sanitize_text_field($var) : $var;
1400 }
1401 }
1402
1403 /**
1404 * Define a constant if it is not already defined.
1405 *
1406 * @since 1.0.21
1407 *
1408 * @param string $name Constant name.
1409 * @param string $value Value.
1410 */
1411 function uwp_maybe_define($name, $value)
1412 {
1413 if (! defined($name)) {
1414 define($name, $value);
1415 }
1416 }
1417
1418 function uwp_insert_usermeta()
1419 {
1420 global $wpdb;
1421 $sort = "user_registered";
1422
1423 $all_users_id = $wpdb->get_col($wpdb->prepare( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
1424 "SELECT $wpdb->users.ID FROM $wpdb->users ORDER BY %s ASC",
1425 $sort
1426 ));
1427
1428 //we got all the IDs, now loop through them to get individual IDs
1429 foreach ($all_users_id as $user_id) {
1430 $user_data = get_userdata($user_id);
1431
1432 $meta_table = get_usermeta_table_prefix() . 'uwp_usermeta';
1433 $user_meta = array(
1434 'username' => $user_data->user_login,
1435 'email' => sanitize_email($user_data->user_email),
1436 'first_name' => $user_data->first_name,
1437 'last_name' => $user_data->last_name,
1438 'display_name' => $user_data->display_name,
1439 );
1440
1441 $users = $wpdb->get_var($wpdb->prepare("SELECT COUNT(user_id) FROM {$meta_table} WHERE user_id = %d", $user_id)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
1442
1443 if (!empty($users)) {
1444 $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
1445 $meta_table,
1446 $user_meta,
1447 array('user_id' => $user_id)
1448 );
1449 } else {
1450 $user_meta['user_id'] = $user_id;
1451 $wpdb->insert( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
1452 $meta_table,
1453 $user_meta
1454 );
1455 }
1456 }
1457 }
1458
1459 function uwp_get_localize_data()
1460 {
1461 $pass_msg = uwp_get_option("register_uwp_strong_pass_msg");
1462 $uwp_localize_data = array(
1463 'uwp_more_char_limit' => 100,
1464 'uwp_more_text' => __('more', 'userswp'),
1465 'uwp_less_text' => __('less', 'userswp'),
1466 'error' => __('Something went wrong.', 'userswp'),
1467 'error_retry' => __('Something went wrong, please retry.', 'userswp'),
1468 'uwp_more_ellipses_text' => '...',
1469 'ajaxurl' => admin_url('admin-ajax.php'),
1470 'login_modal' => uwp_get_option("design_style", 'bootstrap') == 'bootstrap' && uwp_get_option("login_modal", 1) ? 1 : '',
1471 'register_modal' => uwp_get_option("design_style", 'bootstrap') == 'bootstrap' && uwp_get_option("register_modal", 1) ? 1 : '',
1472 'forgot_modal' => uwp_get_option("design_style", 'bootstrap') == 'bootstrap' && uwp_get_option("forgot_modal", 1) ? 1 : '',
1473 'uwp_pass_strength' => uwp_get_option("register_min_password_strength", 0),
1474 'uwp_strong_pass_msg' => !empty($pass_msg) ? $pass_msg : __("Please enter valid strong password.", "userswp"),
1475 'default_banner' => uwp_get_default_banner_uri(),
1476 'basicNonce' => esc_attr(wp_create_nonce('uwp_basic_nonce'))
1477 );
1478
1479 return apply_filters('uwp_localize_data', $uwp_localize_data);
1480 }
1481
1482 function uwp_is_page_builder() {
1483 if (
1484 ( isset( $_GET['elementor-preview'] ) && $_GET['elementor-preview'] > 0 ) // elementor
1485 || isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) // divi
1486 || isset( $_REQUEST['fl_builder'] ) // beaver
1487 || ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) // siteorigin
1488 || ! empty( $_REQUEST['cornerstone_preview'] ) // cornerstone
1489 || ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) // fusion builder
1490 || ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) // oxygen
1491 || ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || bricks_is_builder_call() ) ) // Bricks Builder
1492 || ( \function_exists( 'Breakdance\\isRequestFromBuilderIframe' ) && ( \Breakdance\isRequestFromBuilderIframe() || \Breakdance\isRequestFromBuilderSsr() ) ) // Breakdance Builder
1493 || ( function_exists( 'znhg_kallyas_theme_config' ) && ! empty( $_REQUEST['zn_pb_edit'] ) ) // Kallyas theme Zion builder
1494 ) {
1495 return true; // builder.
1496 }
1497
1498 return false;
1499 }
1500
1501 /**
1502 * Display a help tip for settings.
1503 *
1504 * @param string $tip Help tip text
1505 * @param bool $allow_html Allow sanitized HTML if true or escape
1506 *
1507 * @return string
1508 */
1509 function uwp_help_tip($tip, $allow_html = false)
1510 {
1511 global $aui_bs5;
1512 if ($allow_html) {
1513 $tip = uwp_sanitize_tooltip($tip);
1514 } else {
1515 $tip = esc_attr($tip);
1516 }
1517
1518 $ml = $aui_bs5 ? 'ms-2 float-end' : 'ml-2 float-right';
1519
1520 return '<span class="uwp-help-tip dashicons dashicons-editor-help text-muted ' . $ml . '" title="' . $tip . '" data-bs-toggle="tooltip" data-bs-html="true"></span>';
1521 }
1522
1523 /**
1524 * Sanitize a string destined to be a tooltip.
1525 *
1526 * Tooltips are encoded with htmlspecialchars to prevent XSS. Should not be used in conjunction with esc_attr()
1527 *
1528 * @param string $var
1529 * @return string
1530 */
1531 function uwp_sanitize_tooltip($var)
1532 {
1533 return htmlspecialchars(wp_kses(html_entity_decode($var), array(
1534 'br' => array(),
1535 'em' => array(),
1536 'strong' => array(),
1537 'small' => array(),
1538 'span' => array(),
1539 'ul' => array(),
1540 'li' => array(),
1541 'ol' => array(),
1542 'p' => array(),
1543 )));
1544 }
1545
1546 function uwp_all_email_tags($inline = true, $extra_tags = array())
1547 {
1548 $tags = array('[#site_name#]', '[#site_name_url#]', '[#to_name#]', '[#from_name#]', '[#from_email#]', '[#user_name#]', '[#username#]', '[#user_email#]', '[#first_name#]', '[#last_name#]', '[#login_details#]', '[#date_time#]', '[#current_date#]', '[#login_url#]', '[#user_login#]', '[#profile_link#]');
1549
1550 if (is_array($extra_tags) && count($extra_tags) > 0) {
1551 $tags = array_merge($extra_tags, $tags);
1552 }
1553
1554 $tags = apply_filters('uwp_all_email_tags', $tags);
1555
1556 if ($inline) {
1557 $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1558 }
1559
1560 return $tags;
1561 }
1562
1563 function uwp_wp_new_user_notification_tags($inline = true, $extra_tags = array())
1564 {
1565 $tags = array('[#site_name#]', '[#site_name_url#]', '[#to_name#]', '[#from_name#]', '[#from_email#]', '[#user_name#]', '[#username#]', '[#user_email#]', '[#date_time#]', '[#current_date#]', '[#login_url#]', '[#user_login#]',);
1566
1567 if (is_array($extra_tags) && count($extra_tags) > 0) {
1568 $tags = array_merge($tags, $extra_tags);
1569 }
1570
1571 $tags = apply_filters('uwp_wp_new_user_notification_email_tags', $tags);
1572
1573 if ($inline) {
1574 $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1575 }
1576
1577 return $tags;
1578 }
1579
1580
1581 function uwp_delete_account_email_tags($inline = true)
1582 {
1583 $tags = array('[#site_name#]', '[#site_name_url#]', '[#from_name#]', '[#from_email#]', '[#date_time#]', '[#current_date#]', '[#login_url#]', '[#user_login#]');
1584
1585 $tags = apply_filters('uwp_delete_account_email_tags', $tags);
1586
1587 if ($inline) {
1588 $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1589 }
1590
1591 return $tags;
1592 }
1593
1594 function uwp_authbox_tags($inline = true)
1595 {
1596 global $wpdb;
1597
1598 $tags = array('[#post_id#]', '[#author_id#]', '[#author_display_name#]', '[#author_name#]', '[#author_link#]', '[#author_bio#]', '[#author_image#]', '[#author_image_url#]', '[#post_modified#]', '[#post_date#]', '[#author_nicename#]', '[#author_registered#]', '[#author_website#]');
1599
1600 $tags = apply_filters('uwp_author_box_default_tags', $tags, $inline);
1601
1602 $table_name = uwp_get_table_prefix() . 'uwp_usermeta';
1603
1604 $excluded = uwp_get_excluded_fields();
1605
1606 $columns = $wpdb->get_col("show columns from $table_name"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
1607
1608 $extra_tags = array_diff($columns, $excluded);
1609
1610 if (!empty($extra_tags) && '' != $extra_tags) {
1611
1612 foreach ($extra_tags as $tag_val) {
1613 $tags[] = '[#' . $tag_val . '#]';
1614 }
1615 }
1616
1617 $tags = apply_filters('uwp_all_author_box_tags', $tags);
1618
1619 if ($inline) {
1620 $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1621 }
1622
1623 return $tags;
1624 }
1625
1626 function uwp_get_posttypes()
1627 {
1628
1629 $exclude_posts = array('attachment', 'revision', 'nav_menu_item', 'custom_css', 'uwp-post');
1630 $exclude_posttype = apply_filters('uwp_exclude_register_posttype', $exclude_posts);
1631
1632 $all_posttyps = get_post_types(array('public' => true,), 'objects');
1633
1634 $display_posttypes = array();
1635
1636 if (!empty($all_posttyps) && '' != $all_posttyps) {
1637 foreach ($all_posttyps as $pt_keys => $pt_values) {
1638
1639 if (!in_array($pt_values->name, $exclude_posttype)) {
1640 $display_posttypes[$pt_values->name] = $pt_values->label;
1641 }
1642 }
1643 }
1644
1645 return $display_posttypes;
1646 }
1647
1648 function uwp_get_user_by_author_slug()
1649 {
1650 $url_type = apply_filters('uwp_profile_url_type', 'slug');
1651 $author_slug = get_query_var('uwp_profile');
1652 if ($url_type == 'id') {
1653 $user = get_user_by('id', $author_slug);
1654 } else {
1655 $user = get_user_by('slug', $author_slug);
1656 }
1657
1658 return $user;
1659 }
1660
1661 function uwp_get_show_in_locations()
1662 {
1663 $show_in_locations = array(
1664 "[users]" => __("Users Page", 'userswp'),
1665 "[more_info]" => __("More info tab", 'userswp'),
1666 "[profile_side]" => __("Profile side (non bootstrap)", 'userswp'),
1667 "[fieldset]" => __("Fieldset", 'userswp'),
1668 );
1669
1670 $show_in_locations = apply_filters('uwp_show_in_locations', $show_in_locations);
1671
1672 return $show_in_locations;
1673 }
1674
1675 function uwp_get_displayed_user()
1676 {
1677 global $uwp_user;
1678 $user = uwp_get_user_by_author_slug(); // for user displayed in profile
1679
1680 if (!$user && is_user_logged_in()) {
1681 $user = get_userdata(get_current_user_id()); // for user currently logged in
1682 }
1683
1684 if (isset($uwp_user) && !empty($uwp_user) && $uwp_user instanceof WP_User) { // for user displaying in loop
1685 $user = $uwp_user;
1686 }
1687
1688 return apply_filters('uwp_get_displayed_user', $user);
1689 }
1690
1691 function uwp_is_gdv2()
1692 {
1693
1694 if (defined('GEODIRECTORY_VERSION') && version_compare(GEODIRECTORY_VERSION, '2.0.0.0', '>=')) {
1695 return true;
1696 }
1697
1698 return false;
1699 }
1700
1701 function uwp_get_blogname()
1702 {
1703 $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
1704
1705 return apply_filters('uwp_get_blogname', $blogname);
1706 }
1707
1708 /**
1709 * RGB from hex.
1710 *
1711 * @since 1.2.1.3
1712 *
1713 * @param string $color Color.
1714 * @return array $rgb.
1715 */
1716 function uwp_rgb_from_hex($color)
1717 {
1718 $color = str_replace('#', '', $color);
1719
1720 // Convert shorthand colors to full format, e.g. "FFF" -> "FFFFFF"
1721 $color = preg_replace('~^(.)(.)(.)$~', '$1$1$2$2$3$3', $color);
1722 if (empty($color)) {
1723 return NULL;
1724 }
1725
1726 $color = str_split($color);
1727
1728 $rgb = array();
1729 $rgb['R'] = hexdec($color[0] . $color[1]);
1730 $rgb['G'] = hexdec($color[2] . $color[3]);
1731 $rgb['B'] = hexdec($color[4] . $color[5]);
1732
1733 return $rgb;
1734 }
1735
1736 /**
1737 * HEX darker.
1738 *
1739 * @since 1.2.1.3
1740 *
1741 * @param string $color Color.
1742 * @param int $factor Optional. Factor. Default 30.
1743 * @return string $color.
1744 */
1745 function uwp_hex_darker($color, $factor = 30)
1746 {
1747 $base = uwp_rgb_from_hex($color);
1748 if (empty($base)) {
1749 return $color;
1750 }
1751
1752 $color = '#';
1753 foreach ($base as $k => $v) {
1754 $amount = $v / 100;
1755 $amount = round($amount * $factor);
1756 $new_decimal = $v - $amount;
1757
1758 $new_hex_component = dechex($new_decimal);
1759 if (strlen($new_hex_component) < 2) {
1760 $new_hex_component = "0" . $new_hex_component;
1761 }
1762 $color .= $new_hex_component;
1763 }
1764
1765 return $color;
1766 }
1767
1768 /**
1769 * Hex lighter.
1770 *
1771 * @since 1.2.1.3
1772 *
1773 * @param string $color Color.
1774 * @param int $factor Optional. factor. Default 30.
1775 * @return string $color.
1776 */
1777 function uwp_hex_lighter($color, $factor = 30)
1778 {
1779 $base = uwp_rgb_from_hex($color);
1780 if (empty($base)) {
1781 return $color;
1782 }
1783
1784 $color = '#';
1785
1786 foreach ($base as $k => $v) {
1787 $amount = 255 - $v;
1788 $amount = $amount / 100;
1789 $amount = round($amount * $factor);
1790 $new_decimal = $v + $amount;
1791
1792 $new_hex_component = dechex($new_decimal);
1793 if (strlen($new_hex_component) < 2) {
1794 $new_hex_component = "0" . $new_hex_component;
1795 }
1796 $color .= $new_hex_component;
1797 }
1798
1799 return $color;
1800 }
1801
1802 /**
1803 * Get Light or dark.
1804 *
1805 * @since 1.2.1.3
1806 *
1807 * @param string $color color.
1808 * @param string $dark Optional. Dark. Default #000000.
1809 * @param string $light Optional. Light. Default #FFFFFF.
1810 * @return string
1811 */
1812 function uwp_light_or_dark($color, $dark = '#000000', $light = '#FFFFFF')
1813 {
1814 $hex = str_replace('#', '', $color);
1815 if (empty($hex)) {
1816 return $color;
1817 }
1818
1819 $c_r = hexdec(substr($hex, 0, 2));
1820 $c_g = hexdec(substr($hex, 2, 2));
1821 $c_b = hexdec(substr($hex, 4, 2));
1822
1823 $brightness = (($c_r * 299) + ($c_g * 587) + ($c_b * 114)) / 1000;
1824
1825 return $brightness > 155 ? $dark : $light;
1826 }
1827
1828 /**
1829 * Format hex.
1830 *
1831 * @since 1.2.1.3
1832 *
1833 * @param string $hex hex.
1834 * @return string
1835 */
1836 function uwp_format_hex($hex)
1837 {
1838 $hex = trim(str_replace('#', '', $hex));
1839 if (empty($hex)) {
1840 return NULL;
1841 }
1842
1843 if (strlen($hex) == 3) {
1844 $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
1845 }
1846
1847 return $hex ? '#' . $hex : null;
1848 }
1849
1850 /**
1851 * Returns activation link for user.
1852 *
1853 * @since 1.2.1.3
1854 *
1855 * @param int $user_id User ID.
1856 *
1857 * @return string $activation_link
1858 */
1859 function uwp_get_activation_link($user_id)
1860 {
1861
1862 global $wpdb, $wp_hasher;
1863
1864 if (!$user_id) {
1865 return false;
1866 }
1867
1868 $user_data = get_userdata($user_id);
1869
1870 $key = wp_generate_password(20, false);
1871
1872 do_action('uwp_activation_key', $user_data->user_login, $key);
1873
1874 if ( function_exists( 'wp_fast_hash' ) ) {
1875 $hashed = wp_fast_hash( $key );
1876 } else {
1877 if ( empty( $wp_hasher ) ) {
1878 require_once ABSPATH . 'wp-includes/class-phpass.php';
1879 $wp_hasher = new PasswordHash( 8, true );
1880 }
1881 $hashed = $wp_hasher->HashPassword( $key );
1882 }
1883 $wpdb->update($wpdb->users, array('user_activation_key' => time() . ":" . $hashed), array('user_login' => $user_data->user_login)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
1884 update_user_meta($user_id, 'uwp_mod', 'email_unconfirmed');
1885
1886 $activation_args = array(
1887 'uwp_activate' => 'yes',
1888 'key' => $key,
1889 'login' => rawurlencode($user_data->user_login)
1890 );
1891
1892 $activation_args = apply_filters('uwp_activation_link_args', $activation_args, $user_id, $user_data);
1893
1894 $activation_link = add_query_arg(
1895 $activation_args,
1896 home_url('/login/')
1897 );
1898
1899 return apply_filters('uwp_activation_link', $activation_link, $user_id, $user_data, $activation_args);
1900 }
1901
1902 /**
1903 * Checks a version number against the core version and adds a admin notice if requirements are not met.
1904 *
1905 * @param $name
1906 * @param $version
1907 *
1908 * @return bool
1909 */
1910 function uwp_min_version_check($name, $version)
1911 {
1912 if (version_compare(USERSWP_VERSION, $version, '<')) {
1913 add_action('admin_notices', function () use (&$name) {
1914 ?>
1915 <div class="notice notice-error is-dismissible">
1916 <p><?php echo esc_html(wp_sprintf(__("%s requires a newer version of UsersWP and will not run until the UsersWP plugin is updated.", "userswp"), $name)); ?></p>
1917 </div>
1918 <?php
1919 });
1920
1921 return false;
1922 }
1923
1924 return true;
1925 }
1926
1927 function uwp_get_user_roles($exclude = array())
1928 {
1929 $user_roles = array();
1930 if (!function_exists('get_editable_roles')) {
1931 require_once(ABSPATH . '/wp-admin/includes/user.php');
1932 }
1933
1934 $wp_roles = get_editable_roles();
1935 if (!empty($wp_roles) && is_array($wp_roles)) {
1936 foreach ($wp_roles as $role => $details) {
1937 if (in_array($role, $exclude)) {
1938 } else {
1939 $user_roles[esc_attr($role)] = !empty($details['name']) ? translate_user_role($details['name']) : $role;
1940 }
1941 }
1942 }
1943
1944 return $user_roles;
1945 }
1946
1947 function uwp_get_sort_by_order_list()
1948 {
1949
1950 $cache = wp_cache_get("uwp_get_sort_options");
1951 if ($cache !== false) {
1952 return $cache;
1953 }
1954
1955 global $wpdb;
1956 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
1957
1958 $sort_options_raw = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $table_name . " WHERE is_active = %d AND field_type != 'address' AND tab_parent = '0' ORDER BY sort_order ASC", array(1))); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
1959
1960 $sort_options = array();
1961
1962 if (! empty($sort_options_raw) && count($sort_options_raw) > 1) {
1963 foreach ($sort_options_raw as $sort) {
1964 $sort = stripslashes_deep($sort);
1965
1966 $sort->site_title = __(wp_unslash($sort->site_title), 'userswp');
1967
1968 if ($sort->htmlvar_name == 'comment_count') {
1969 $sort->htmlvar_name = 'rating_count';
1970 }
1971
1972 $key = $sort->htmlvar_name;
1973 if (!in_array($key, array('newer', 'older'))) {
1974 if ($sort->sort == 'asc') {
1975 $key = esc_attr($sort->htmlvar_name . "_asc");
1976 } elseif ($sort->sort == 'desc') {
1977 $key = esc_attr($sort->htmlvar_name . "_desc");
1978 }
1979 }
1980
1981 $sort_options[$key] = wp_unslash($sort->site_title);
1982 }
1983 }
1984
1985 /**
1986 * Filter post sort options.
1987 *
1988 * @param array $sort_options Unfiltered sort field array.
1989 */
1990 $sort_options = apply_filters('uwp_available_users_layout', $sort_options);
1991
1992 wp_cache_set("uwp_get_sort_options", $sort_options);
1993
1994 return $sort_options;
1995 }
1996
1997 function uwp_get_default_sort()
1998 {
1999
2000 $cache = wp_cache_get("uwp_get_default_sort");
2001
2002 if ($cache !== false) {
2003 return $cache;
2004 }
2005
2006 $default_sort = 'newer_asc';
2007
2008 global $wpdb;
2009 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
2010
2011 $field = $wpdb->get_row("SELECT htmlvar_name, sort, field_type FROM " . $table_name . " WHERE is_active = 1 AND is_default = 1 ORDER BY sort_order ASC"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
2012 if (! empty($field)) {
2013 if ($field->field_type == 'random') {
2014 $default_sort = 'random';
2015 } elseif ('newer' == $field->htmlvar_name) {
2016 $default_sort = 'user_registered_desc';
2017 } elseif ('older' == $field->htmlvar_name) {
2018 $default_sort = 'user_registered_asc';
2019 } else {
2020 $default_sort = $field->htmlvar_name . '_' . $field->sort;
2021 }
2022 }
2023
2024 wp_cache_set("uwp_get_default_sort", $default_sort);
2025
2026 return $default_sort;
2027 }
2028
2029 function uwp_get_username($user_id)
2030 {
2031 $user_data = get_userdata($user_id);
2032
2033 if (! $user_data) {
2034 return '';
2035 }
2036
2037 $display_name = ! empty($user_data->display_name) ? $user_data->display_name : $user_data->user_login;
2038
2039 return apply_filters('uwp_get_username', $display_name, $user_id, $user_data);
2040 }
2041
2042 /**
2043 * File relative url.
2044 *
2045 * @since 1.2.66
2046 *
2047 * @param string $url URL.
2048 * @param bool $full_path Optional. Full Path. Default false.
2049 * @return string
2050 */
2051 function uwp_get_file_relative_url( $url, $full_path = false ) {
2052 $url = trim( $url );
2053
2054 if ( !$url ) {
2055 return $url;
2056 }
2057
2058 $relative_url = $url;
2059 $url = trim( $url, '/\\' ); // clean slashes
2060
2061 $upload_dir = wp_upload_dir();
2062 $upload_basedir = $upload_dir['basedir'];
2063 $upload_baseurl = $upload_dir['baseurl'];
2064 $content_dir = untrailingslashit( WP_CONTENT_DIR );
2065 $content_url = untrailingslashit( WP_CONTENT_URL );
2066
2067 if ( strpos( $upload_baseurl, 'https://' ) === 0 ) {
2068 $https = 'https://';
2069 $match_upload_baseurl = str_replace( 'https://', '', $upload_baseurl );
2070 $content_url = str_replace( 'http://', 'https://', $content_url );
2071 } else {
2072 $https = 'http://';
2073 $match_upload_baseurl = str_replace( 'http://', '', $upload_baseurl );
2074 $content_url = str_replace( 'https://', 'http://', $content_url );
2075 }
2076
2077 $match_content_url = strpos( $content_url, 'https://' ) === 0 ? str_replace( 'https://', '', $content_url ) : str_replace( 'http://', '', $content_url );
2078 $match_url = strpos( $url, 'https://' ) === 0 ? str_replace( 'https://', '', $url ) : str_replace( 'http://', '', $url );
2079
2080 // www.
2081 $www = '';
2082 if ( strpos( $match_upload_baseurl, 'www.' ) === 0 ) {
2083 $www = 'www.';
2084 $match_upload_baseurl = str_replace( 'www.', '', $match_upload_baseurl );
2085 }
2086 if ( strpos( $match_content_url, 'www.' ) === 0 ) {
2087 $match_content_url = str_replace( 'www.', '', $match_content_url );
2088 }
2089 if ( strpos( $match_url, 'www.' ) === 0 ) {
2090 $match_url = str_replace( 'www.', '', $match_url );
2091 }
2092
2093 if ( $full_path ) {
2094 if ( strpos( $relative_url, 'http://' ) === 0 || strpos( $relative_url, 'https://' ) === 0 ) {
2095 if ( strpos( $match_url, $match_upload_baseurl ) === 0 || strpos( $match_url, $match_content_url ) === 0 ) {
2096 $relative_url = $https . $www . $match_url;
2097 }
2098 } else {
2099 if ( is_file( $content_dir . '/' . $match_url ) && file_exists( $content_dir . '/' . $match_url ) ) { // url contains content url
2100 $relative_url = $content_url . '/' . $match_url;
2101 } elseif ( is_file( $upload_basedir . '/' . $match_url ) && file_exists( $upload_basedir . '/' . $match_url ) ) { // url contains content url
2102 $relative_url = $upload_baseurl . '/' . $match_url;
2103 }
2104 }
2105 } else {
2106 if ( substr_count( $match_url, $match_upload_baseurl ) > 1 || substr_count( $match_url, $match_content_url ) > 1 ) {
2107 return '';
2108 }
2109
2110 if ( strpos( $match_url, $match_upload_baseurl ) === 0 ) { // url contains uploads baseurl
2111 $relative_url = substr( $match_url, strlen( $match_upload_baseurl ) );
2112 } elseif ( strpos( $match_url, $match_content_url ) === 0 ) { // url contains content url
2113 $relative_url = substr( $match_url, strlen( $match_content_url ) );
2114 }
2115
2116 $relative_url = trim( $relative_url, '/\\' );
2117
2118 if ( false !== strpos( $relative_url, '..' ) ) {
2119 return '';
2120 }
2121 }
2122
2123 return apply_filters( 'uwp_get_file_relative_url', $relative_url, $url, $full_path );
2124 }
2125