PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.74
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.74
1.2.74 1.2.73 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 All 174 releases
← All changes | includes/helpers/misc.php +1692 -981 1.0.111.2.74 View file →
@@ -1,5 +1,6 @@
1 1 <?php
2 +
2 3 /**
3 4 * Converts string value to options array.
4 5 * Used in select, multiselect and radio fields.
5 6 * Wraps inside optgroup if available.
@@ -13,55 +14,55 @@
13 14 * @return array|null Options array.
14 15 */
15 16 function uwp_string_values_to_options($option_values = '', $translated = false)
16 17 {
17 - $options = array();
18 - if ($option_values == '') {
19 - return NULL;
20 - }
18 + $options = array();
19 + if ($option_values == '') {
20 + return NULL;
21 + }
21 22
22 - if (strpos($option_values, "{/optgroup}") !== false) {
23 - $option_values_arr = explode("{/optgroup}", $option_values);
23 + if (strpos($option_values, "{/optgroup}") !== false) {
24 + $option_values_arr = explode("{/optgroup}", $option_values);
24 25
25 - foreach ($option_values_arr as $optgroup) {
26 - if (strpos($optgroup, "{optgroup}") !== false) {
27 - $optgroup_arr = explode("{optgroup}", $optgroup);
26 + foreach ($option_values_arr as $optgroup) {
27 + if (strpos($optgroup, "{optgroup}") !== false) {
28 + $optgroup_arr = explode("{optgroup}", $optgroup);
28 29
29 - $count = 0;
30 - foreach ($optgroup_arr as $optgroup_str) {
31 - $count++;
32 - $optgroup_str = trim($optgroup_str);
30 + $count = 0;
31 + foreach ($optgroup_arr as $optgroup_str) {
32 + $count++;
33 + $optgroup_str = trim($optgroup_str);
33 34
34 - $optgroup_label = '';
35 - if (strpos($optgroup_str, "|") !== false) {
36 - $optgroup_str_arr = explode("|", $optgroup_str, 2);
37 - $optgroup_label = trim($optgroup_str_arr[0]);
38 - if ($translated && $optgroup_label != '') {
39 - $optgroup_label = __($optgroup_label, 'userswp');
40 - }
41 - $optgroup_label = ucfirst($optgroup_label);
42 - $optgroup_str = $optgroup_str_arr[1];
43 - }
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 + }
44 45
45 - $optgroup3 = uwp_string_to_options($optgroup_str, $translated);
46 + $optgroup3 = uwp_string_to_options($optgroup_str, $translated);
46 47
47 - if ($count > 1 && $optgroup_label != '' && !empty($optgroup3)) {
48 - $optgroup_start = array(array('label' => $optgroup_label, 'value' => NULL, 'optgroup' => 'start'));
49 - $optgroup_end = array(array('label' => $optgroup_label, 'value' => NULL, 'optgroup' => 'end'));
50 - $optgroup3 = array_merge($optgroup_start, $optgroup3, $optgroup_end);
51 - }
52 - $options = array_merge($options, $optgroup3);
53 - }
54 - } else {
55 - $optgroup1 = uwp_string_to_options($optgroup, $translated);
56 - $options = array_merge($options, $optgroup1);
57 - }
58 - }
59 - } else {
60 - $options = uwp_string_to_options($option_values, $translated);
61 - }
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 + }
62 63
63 - return $options;
64 + return $options;
64 65 }
65 66
66 67 /**
67 68 * Converts string value to options array.
@@ -76,105 +77,48 @@
76 77 * @return array Options array.
77 78 */
78 79 function uwp_string_to_options($input = '', $translated = false)
79 80 {
80 - $return = array();
81 - if ($input != '') {
82 - $input = trim($input);
83 - $input = rtrim($input, ",");
84 - $input = ltrim($input, ",");
85 - $input = trim($input);
86 - }
81 + $return = array();
82 + if ($input != '') {
83 + $input = trim($input);
84 + $input = rtrim($input, ",");
85 + $input = ltrim($input, ",");
86 + $input = trim($input);
87 + }
87 88
88 - $input_arr = explode(',', $input);
89 + $input_arr = explode(',', $input);
89 90
90 - if (!empty($input_arr)) {
91 - foreach ($input_arr as $input_str) {
92 - $input_str = trim($input_str);
91 + if (!empty($input_arr)) {
92 + foreach ($input_arr as $input_str) {
93 + $input_str = trim(stripslashes($input_str));
93 94
94 - if (strpos($input_str, "/") !== false) {
95 - $input_str = explode("/", $input_str, 2);
96 - $label = trim($input_str[0]);
97 - if ($translated && $label != '') {
98 - $label = __($label, 'userswp');
99 - }
100 - $label = ucfirst($label);
101 - $value = trim($input_str[1]);
102 - } else {
103 - if ($translated && $input_str != '') {
104 - $input_str = __($input_str, 'userswp');
105 - }
106 - $label = ucfirst($input_str);
107 - $value = $input_str;
108 - }
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 + }
109 110
110 - if ($label != '') {
111 - $return[] = array('label' => $label, 'value' => $value, 'optgroup' => NULL);
112 - }
113 - }
114 - }
111 + if ($label != '') {
112 + $return[] = array('label' => $label, 'value' => $value, 'optgroup' => NULL);
113 + }
114 + }
115 + }
115 116
116 - return $return;
117 + return $return;
117 118 }
118 119
119 -
120 120 /**
121 - * Resizes the image.
122 - *
123 - * @since 1.0.0
124 - * @package userswp
125 - *
126 - * @param string $image Reference a local file
127 - * @param int $width Image width
128 - * @param int $height Image height
129 - * @param float $scale Image scale ratio.
130 - *
131 - * @return mixed Resized image.
132 - */
133 -function uwp_resizeImage($image,$width,$height,$scale) {
134 - /** @noinspection PhpUnusedLocalVariableInspection */
135 - list($imagewidth, $imageheight, $imageType) = getimagesize($image);
136 - $imageType = image_type_to_mime_type($imageType);
137 - $newImageWidth = ceil($width * $scale);
138 - $newImageHeight = ceil($height * $scale);
139 - $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
140 - $source = false;
141 - switch($imageType) {
142 - case "image/gif":
143 - $source=imagecreatefromgif($image);
144 - break;
145 - case "image/pjpeg":
146 - case "image/jpeg":
147 - case "image/jpg":
148 - $source=imagecreatefromjpeg($image);
149 - break;
150 - case "image/png":
151 - case "image/x-png":
152 - $source=imagecreatefrompng($image);
153 - break;
154 - }
155 - imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height);
156 -
157 - switch($imageType) {
158 - case "image/gif":
159 - imagegif($newImage,$image);
160 - break;
161 - case "image/pjpeg":
162 - case "image/jpeg":
163 - case "image/jpg":
164 - imagejpeg($newImage,$image,90);
165 - break;
166 - case "image/png":
167 - case "image/x-png":
168 - imagepng($newImage,$image);
169 - break;
170 - }
171 -
172 - chmod($image, 0777);
173 - return $image;
174 -}
175 -
176 -/**
177 121 * Resizes thumbnail image.
178 122 *
179 123 * @since 1.0.0
180 124 * @package userswp
@@ -188,54 +132,131 @@
188 132 * @param float $scale Image scale ratio.
189 133 *
190 134 * @return mixed Resized image.
191 135 */
192 -function uwp_resizeThumbnailImage($thumb_image_name, $image, $x, $y, $src_w, $src_h, $scale){
193 - // ignore image createion warnings
194 - @ini_set('gd.jpeg_ignore_warning', 1);
195 - /** @noinspection PhpUnusedLocalVariableInspection */
196 - list($imagewidth, $imageheight, $imageType) = getimagesize($image);
197 - $imageType = image_type_to_mime_type($imageType);
136 +function uwp_resizeThumbnailImage($thumb_image_name, $image, $x, $y, $src_w, $src_h, $scale, $wp_error = false)
137 +{
138 + uwp_set_php_limits();
198 139
199 - $newImageWidth = ceil($src_w * $scale);
200 - $newImageHeight = ceil($src_h * $scale);
201 - $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
202 - $source = false;
203 - switch($imageType) {
204 - case "image/gif":
205 - $source=imagecreatefromgif($image);
206 - break;
207 - case "image/pjpeg":
208 - case "image/jpeg":
209 - case "image/jpg":
210 - $source=imagecreatefromjpeg($image);
211 - break;
212 - case "image/png":
213 - case "image/x-png":
214 - $source=imagecreatefrompng($image);
215 - break;
216 - }
217 - imagecopyresampled($newImage,$source,0,0,$x,$y,$newImageWidth, $newImageHeight, $src_w, $src_h);
218 - switch($imageType) {
219 - case "image/gif":
220 - imagegif($newImage, $thumb_image_name);
221 - break;
222 - case "image/pjpeg":
223 - case "image/jpeg":
224 - case "image/jpg":
225 - imagejpeg($newImage, $thumb_image_name, 100);
226 - break;
227 - case "image/png":
228 - case "image/x-png":
229 - imagepng($newImage, $thumb_image_name);
230 - break;
231 - }
140 + // Ignore image creation warnings
141 + @ini_set('gd.jpeg_ignore_warning', 1);
232 142
233 - chmod($thumb_image_name, 0777);
234 - return $thumb_image_name;
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;
235 228 }
236 229
230 +/**
231 + * Try to set higher limits on the fly
232 + */
233 +function uwp_set_php_limits()
234 +{
235 + error_reporting(0);
237 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 +
238 259 /**
239 260 * Logs the error message.
240 261 *
241 262 * @since 1.0.0
@@ -244,244 +265,317 @@
244 265 * @param array|object|string $log Error message.
245 266 *
246 267 * @return void
247 268 */
248 -function uwp_error_log($log){
249 - /*
250 - * A filter to override the WP_DEBUG setting for function uwp_error_log().
251 - */
252 - $should_log = apply_filters( 'uwp_log_errors', WP_DEBUG);
253 - if ( true === $should_log ) {
254 - if ( is_array( $log ) || is_object( $log ) ) {
255 - error_log( print_r( $log, true ) );
256 - } else {
257 - error_log( $log );
258 - }
259 - }
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 + }
260 282 }
261 283
284 +function uwp_get_excluded_users_list()
285 +{
262 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 +
263 322 /**
264 - * Prints the users page main content.
323 + * Retrieves a list of users with optional filtering, searching, and sorting.
265 324 *
266 - * @since 1.0.0
267 - * @package userswp
325 + * @since 1.0.0
326 + * @package userswp
268 327 *
269 - * @return void
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 + * }
270 335 */
271 -function get_uwp_users_list() {
336 +function get_uwp_users_list( $roles = array() )
337 +{
338 + global $wpdb;
272 339
273 - global $wpdb;
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 + }
274 345
275 - $keyword = false;
276 - if (isset($_GET['uwps']) && $_GET['uwps'] != '') {
277 - $keyword = stripslashes(strip_tags($_GET['uwps']));
278 - }
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 + }
279 357
280 - $sort_by = false;
281 - if (isset($_GET['uwp_sort_by']) && $_GET['uwp_sort_by'] != '') {
282 - $sort_by = strip_tags(esc_sql($_GET['uwp_sort_by']));
283 - }
358 + // Get number of items per page
359 + $number = absint( uwp_get_option( 'users_no_of_items', 10 ) );
360 + $number = $number > 0 ? $number : 10;
284 361
285 - $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
362 + // Get search where clause from filters
363 + $where = '';
364 + $where = apply_filters( 'uwp_users_search_where', $where, $keyword );
286 365
287 - $number = uwp_get_option('profile_no_of_items', 10);
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();
288 370
289 - $where = '';
290 - $where = apply_filters('uwp_users_search_where', $where, $keyword);
371 + // Initialize sorting parameters
372 + $exclude_query = ' ';
373 + $order_by = 'uwp_meta_value';
374 + $order = 'ASC';
375 + $meta_key = '';
291 376
292 - if ($keyword || $where) {
293 - if (empty($where)) {
294 - $users = $wpdb->get_results($wpdb->prepare(
295 - "SELECT DISTINCT SQL_CALC_FOUND_ROWS $wpdb->users.*
296 - FROM $wpdb->users
297 - INNER JOIN $wpdb->usermeta
298 - ON ( $wpdb->users.ID = $wpdb->usermeta.user_id )
299 - WHERE 1=1
300 - AND (
301 - ( $wpdb->usermeta.meta_key = 'first_name' AND $wpdb->usermeta.meta_value LIKE %s )
302 - OR
303 - ( $wpdb->usermeta.meta_key = 'last_name' AND $wpdb->usermeta.meta_value LIKE %s )
304 - OR
305 - user_login LIKE %s
306 - OR
307 - user_nicename LIKE %s
308 - OR
309 - display_name LIKE %s
310 - OR
311 - user_email LIKE %s
312 - )
313 - ORDER BY display_name ASC
314 - LIMIT 0, 20",
315 - array(
316 - '%' . $keyword . '%',
317 - '%' . $keyword . '%',
318 - '%' . $keyword . '%',
319 - '%' . $keyword . '%',
320 - '%' . $keyword . '%',
321 - '%' . $keyword . '%'
322 - )
323 - ));
324 - } else {
325 - $usermeta_table = uwp_get_table_prefix() . 'uwp_usermeta';
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 + }
326 382
327 - $users = $wpdb->get_results(
328 - "SELECT DISTINCT SQL_CALC_FOUND_ROWS $wpdb->users.*
329 - FROM $wpdb->users
330 - INNER JOIN $usermeta_table
331 - ON ( $wpdb->users.ID = $usermeta_table.user_id )
332 - WHERE 1=1
333 - $where
334 - ORDER BY display_name ASC
335 - LIMIT 0, 20");
336 - }
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 + }
337 407
338 - } else {
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 + }
339 413
340 - $args = array(
341 - 'number' => (int) $number,
342 - 'paged' => $paged
343 - );
414 + $users = array();
344 415
416 + // Check if we have search criteria
417 + if ( $keyword || $where ) {
345 418
346 - if ($sort_by) {
347 - switch ($sort_by) {
348 - case "newer":
349 - $args['orderby'] = 'registered';
350 - $args['order'] = 'desc';
351 - break;
352 - case "older":
353 - $args['orderby'] = 'registered';
354 - $args['order'] = 'asc';
355 - break;
356 - case "alpha_asc":
357 - $args['orderby'] = 'display_name';
358 - $args['order'] = 'asc';
359 - break;
360 - case "alpha_desc":
361 - $args['orderby'] = 'display_name';
362 - $args['order'] = 'desc';
363 - break;
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 = '';
364 451
365 - }
366 - }
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 + }
367 469
368 - $users_query = new WP_User_Query($args);
369 - $users = $users_query->get_results();
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 + }
370 477
371 - }
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' );
372 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 + }
373 494
374 - $result = count_users();
375 - $total_user = $result['total_users'];
376 - $total_pages=ceil($total_user/$number);
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 + );
377 503
378 - $layout_class = uwp_get_layout_class();
379 - ?>
380 - <ul class="uwp-users-list-wrap <?php echo $layout_class; ?>" id="uwp_user_items_layout">
381 - <?php
382 - if ($users) {
383 - foreach ($users as $user) {
384 - $user_obj = get_user_by('id', $user->ID);
504 + // Add exclude users if any
505 + if ( ! empty( $exclude_users ) ) {
506 + $args['exclude'] = $exclude_users;
507 + }
385 508
386 - // exclude logged in user
387 - $exclude_loggedin_user = apply_filters('uwp_users_list_exclude_loggedin_user', false);
388 - if ($exclude_loggedin_user) {
389 - if ($user_obj->ID == get_current_user_id()) {
390 - continue;
391 - }
392 - }
393 - ?>
394 - <li class="uwp-users-list-user">
395 - <div class="uwp-users-list-user-left">
396 - <?php do_action('uwp_users_profile_header', $user); ?>
397 - </div>
398 - <div class="uwp-users-list-user-right">
399 - <div class="uwp-users-list-user-name">
400 - <h3 class="uwp-user-title" data-user="<?php echo $user_obj->ID; ?>">
401 - <a href="<?php echo apply_filters('uwp_profile_link', get_author_posts_url($user_obj->ID), $user_obj->ID); ?>">
402 - <?php echo apply_filters('uwp_profile_display_name', $user_obj->display_name); ?>
403 - </a>
404 - <?php do_action('uwp_users_after_title', $user_obj->ID ); ?>
405 - </h3>
406 - </div>
407 - <div class="uwp-users-list-user-btns">
408 - <?php do_action('uwp_profile_buttons', $user_obj ); ?>
409 - </div>
410 - <div class="uwp-users-list-user-social">
411 - <?php do_action('uwp_profile_social', $user_obj ); ?>
412 - </div>
413 - <div class="uwp-users-list-extra">
414 - <?php do_action('uwp_users_extra', $user_obj ); ?>
415 - </div>
416 - <div class="clfx"></div>
417 - </div>
418 - </li>
419 - <?php
420 - }
421 - } else {
422 - // no users found
423 - echo '<div class="uwp-alert-error text-center">';
424 - echo __('No Users Found', 'userswp');
425 - echo '</div>';
426 - }
427 - ?>
428 - </ul>
509 + // Add meta_key if specified
510 + if ( ! empty( $meta_key ) ) {
511 + $args['meta_key'] = $meta_key;
512 + }
429 513
430 - <?php
431 - if (!$keyword) {
432 - do_action('uwp_profile_pagination', $total_pages);
433 - }
434 - ?>
435 - <?php
436 -}
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 + }
437 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();
438 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 + );
439 541
440 -/**
441 - * Loads the font-awesome css files.
442 - *
443 - * @since 1.0.0
444 - * @package userswp
445 - *
446 - * @return void
447 - */
448 -function uwp_load_font_awesome() {
449 - //load font awesome
450 - global $wp_styles;
451 - if ($wp_styles) {
452 - $srcs = array_map('basename', (array) wp_list_pluck($wp_styles->registered, 'src') );
453 - if ( in_array('font-awesome.css', $srcs) || in_array('font-awesome.min.css', $srcs) ) {
454 - /* echo 'font-awesome.css registered'; */
455 - } else {
456 - wp_register_style('font-awesome', '//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css', array(), null);
457 - wp_enqueue_style('font-awesome');
458 - }
459 - } else {
460 - wp_register_style('font-awesome', '//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css', array(), null);
461 - wp_enqueue_style('font-awesome');
462 - }
463 -}
542 + // Add exclude users if any
543 + if ( ! empty( $exclude_users ) ) {
544 + $args['exclude'] = $exclude_users;
545 + }
464 546
465 -/**
466 - * Gets the custom field info for given key.
467 - *
468 - * @since 1.0.0
469 - * @package userswp
470 - *
471 - * @param string $htmlvar_name Custom field key.
472 - *
473 - * @return object Field info.
474 - */
475 -function uwp_get_custom_field_info($htmlvar_name) {
476 - global $wpdb;
477 - $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
478 - $field = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $table_name . " WHERE htmlvar_name = %s", array($htmlvar_name)));
479 - return $field;
480 -}
547 + // Filter by roles if specified
548 + if ( ! empty( $roles ) && is_array( $roles ) ) {
549 + $args['role__in'] = $roles;
550 + }
481 551
552 + // Add meta_key if specified
553 + if ( ! empty( $meta_key ) ) {
554 + $args['meta_key'] = $meta_key;
555 + }
482 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 + }
483 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 +
484 578 /**
485 579 * Returns the Users page layout class based on the setting.
486 580 *
487 581 * @since 1.0.0
@@ -488,35 +582,66 @@
488 582 * @package userswp
489 583 *
490 584 * @return string Layout class.
491 585 */
492 -function uwp_get_layout_class() {
493 - $default_layout = uwp_get_option('users_default_layout', 'list');
494 - switch ($default_layout) {
495 - case "list":
496 - $class = "uwp_listview";
497 - break;
498 - case "2col":
499 - $class = "uwp_gridview uwp_gridview_2col";
500 - break;
501 - case "3col":
502 - $class = "uwp_gridview uwp_gridview_3col";
503 - break;
504 - case "4col":
505 - $class = "uwp_gridview uwp_gridview_4col";
506 - break;
507 - case "5col":
508 - $class = "uwp_gridview uwp_gridview_5col";
509 - break;
510 - default:
511 - $class = "uwp_listview";
512 - }
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 + }
513 596
514 - return $class;
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;
515 638 }
516 639
517 -add_filter( 'get_user_option_metaboxhidden_nav-menus', 'uwp_always_nav_menu_visibility', 10, 3 );
640 +add_filter('uwp_users_list_ul_extra_class', 'uwp_get_layout_class', 10, 1);
518 641
642 +add_filter('get_user_option_metaboxhidden_nav-menus', 'uwp_always_nav_menu_visibility', 10, 3);
643 +
519 644 /**
520 645 * Filters nav menu visibility option value.
521 646 *
522 647 * @since 1.0.0
@@ -527,144 +652,17 @@
527 652 * @param WP_User $user WP_User object of the user whose option is being retrieved.
528 653 *
529 654 * @return array Filtered value.
530 655 */
531 -function uwp_always_nav_menu_visibility( $result, $option, $user )
656 +function uwp_always_nav_menu_visibility($result, $option, $user)
532 657 {
533 - if( is_array($result) && in_array( 'add-users-wp-nav-menu', $result ) ) {
534 - $result = array_diff( $result, array( 'add-users-wp-nav-menu' ) );
535 - }
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 + }
536 661
537 - return $result;
662 + return $result;
538 663 }
539 664
540 -add_filter('user_profile_picture_description', 'uwp_admin_user_profile_picture_description');
541 -
542 -/**
543 - * Filters the user profile picture description displayed under the Gravatar.
544 - *
545 - * @since 1.0.0
546 - * @package userswp
547 - *
548 - * @param string $description Profile picture description.
549 - *
550 - * @return string Modified description.
551 - */
552 -function uwp_admin_user_profile_picture_description($description) {
553 - if (is_admin() && IS_PROFILE_PAGE) {
554 - $user_id = get_current_user_id();
555 - $avatar = uwp_get_usermeta($user_id, 'uwp_account_avatar_thumb', '');
556 -
557 - if (!empty($avatar)) {
558 - $description = sprintf( __( 'You can change your profile picture on your <a href="%s">Profile Page</a>.', 'userswp' ),
559 - uwp_build_profile_tab_url( $user_id ));
560 - }
561 -
562 - }
563 - return $description;
564 -}
565 -
566 -/**
567 - * Adds avatar and banner fields in admin side.
568 - *
569 - * @since 1.0.0
570 - * @package userswp
571 - *
572 - * @param object $user User object.
573 - *
574 - * @return void
575 - */
576 -function uwp_admin_edit_banner_fields($user) {
577 - global $wpdb;
578 -
579 - $file_obj = new UsersWP_Files();
580 -
581 - $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
582 - $fields = $wpdb->get_results("SELECT * FROM " . $table_name . " WHERE (form_type = 'avatar' OR form_type = 'banner') ORDER BY sort_order ASC");
583 - if ($fields) {
584 - ?>
585 - <div class="uwp-profile-extra uwp_page">
586 - <?php do_action('uwp_admin_profile_edit', $user ); ?>
587 - <table class="uwp-profile-extra-table form-table">
588 - <?php
589 - foreach ($fields as $field) {
590 -
591 - // Icon
592 - if ($field->field_icon) {
593 - $icon = '<i class="uwp_field_icon '.$field->field_icon.'"></i>';
594 - } else {
595 - $icon = '';
596 - }
597 -
598 - if ($field->field_type == 'fieldset') {
599 - ?>
600 - <tr style="margin: 0; padding: 0">
601 - <th class="uwp-profile-extra-key" style="margin: 0; padding: 0"><h3 style="margin: 10px 0;">
602 - <?php echo $icon.$field->site_title; ?></h3></th>
603 - <td></td>
604 - </tr>
605 - <?php
606 - } else { ?>
607 - <tr>
608 - <th class="uwp-profile-extra-key"><?php echo $icon.$field->site_title; ?></th>
609 - <td class="uwp-profile-extra-value">
610 - <?php
611 - if ($field->htmlvar_name == "uwp_avatar_file") {
612 - $value = uwp_get_usermeta($user->ID, "uwp_account_avatar_thumb", "");
613 - } elseif ($field->htmlvar_name == "uwp_banner_file") {
614 - $value = uwp_get_usermeta($user->ID, "uwp_account_banner_thumb", "");
615 - } else {
616 - $value = "";
617 - }
618 - ?>
619 - <?php echo $file_obj->uwp_file_upload_preview($field, $value); ?>
620 - <?php
621 - if ($field->htmlvar_name == "uwp_avatar_file") {
622 - if (!empty($value)) {
623 - ?>
624 - <a class="uwp-profile-modal-form-trigger" data-type="avatar" href="#">
625 - <?php echo __("Change Avatar", "userswp"); ?>
626 - </a>
627 - <?php
628 - } else {
629 - ?>
630 - <a class="uwp-profile-modal-form-trigger" data-type="avatar" href="#">
631 - <?php echo __("Upload Avatar", "userswp"); ?>
632 - </a>
633 - <?php
634 - }
635 - } elseif ($field->htmlvar_name == "uwp_banner_file") {
636 - if (!empty($value)) {
637 - ?>
638 - <a class="uwp-profile-modal-form-trigger" data-type="banner" href="#">
639 - <?php echo __("Change Banner", "userswp"); ?>
640 - </a>
641 - <?php
642 - } else {
643 - ?>
644 - <a class="uwp-profile-modal-form-trigger" data-type="banner" href="#">
645 - <?php echo __("Upload Banner", "userswp"); ?>
646 - </a>
647 - <?php
648 - }
649 - }
650 - ?>
651 - </td>
652 - </tr>
653 - <?php
654 - }
655 - }
656 - ?>
657 - </table>
658 - </div>
659 - <?php
660 - }
661 -}
662 -add_action('show_user_profile', 'uwp_admin_edit_banner_fields');
663 -add_action('edit_user_profile', 'uwp_admin_edit_banner_fields');
664 -
665 -
666 -
667 665 // Privacy
668 666 add_filter('uwp_account_page_title', 'uwp_account_privacy_page_title', 10, 2);
669 667
670 668 /**
@@ -675,98 +673,26 @@
675 673 *
676 674 * @param string $title Privacy title.
677 675 * @param string $type Tab type.
678 676 *
679 - * @return string|void Title.
677 + * @return string Title.
680 678 */
681 -function uwp_account_privacy_page_title($title, $type) {
682 - if ($type == 'privacy') {
683 - $title = __( 'Privacy', 'userswp' );
684 - }
679 +function uwp_account_privacy_page_title($title, $type)
680 +{
685 681
686 - return $title;
687 -}
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 + }
688 693
689 -add_action('uwp_account_form_display', 'uwp_account_privacy_edit_form_display');
690 -
691 -/**
692 - * Adds form html for privacy fields in account page.
693 - *
694 - * @since 1.0.0
695 - * @package userswp
696 - *
697 - * @param string $type Form type.
698 - *
699 - * @return void
700 - */
701 -function uwp_account_privacy_edit_form_display($type) {
702 - if ($type == 'privacy') {
703 - $make_profile_private = uwp_can_make_profile_private();
704 - echo '<div class="uwp-account-form uwp_wc_form">';
705 - $extra_where = "AND is_public='2'";
706 - $fields = get_account_form_fields($extra_where);
707 - $fields = apply_filters('uwp_account_privacy_fields', $fields);
708 - $user_id = get_current_user_id();
709 - if ($fields || $make_profile_private) {
710 - ?>
711 - <div class="uwp-profile-extra">
712 - <div class="uwp-profile-extra-div form-table">
713 - <form class="uwp-account-form uwp_form" method="post">
714 - <?php if ($fields) { ?>
715 - <div class="uwp-profile-extra-wrap">
716 - <div class="uwp-profile-extra-key" style="font-weight: bold;">
717 - <?php echo __("Field", "userswp") ?>
718 - </div>
719 - <div class="uwp-profile-extra-value" style="font-weight: bold;">
720 - <?php echo __("Is Public?", "userswp") ?>
721 - </div>
722 - </div>
723 - <?php } ?>
724 - <?php foreach ($fields as $field) { ?>
725 - <div class="uwp-profile-extra-wrap">
726 - <div class="uwp-profile-extra-key"><?php echo $field->site_title; ?>
727 - <span class="uwp-profile-extra-sep">:</span></div>
728 - <div class="uwp-profile-extra-value">
729 - <?php
730 - $field_name = $field->htmlvar_name.'_privacy';
731 - $value = uwp_get_usermeta($user_id, $field_name, false);
732 - if ($value === false) {
733 - $value = 'yes';
734 - }
735 - ?>
736 - <select name="<?php echo $field_name; ?>" class="uwp_privacy_field" style="margin: 0;">
737 - <option value="no" <?php selected( $value, "no" ); ?>><?php echo __("No", "userswp") ?></option>
738 - <option value="yes" <?php selected( $value, "yes" ); ?>><?php echo __("Yes", "userswp") ?></option>
739 - </select>
740 - </div>
741 - </div>
742 - <?php } ?>
743 -
744 - <?php
745 - if ($make_profile_private) {
746 - $field_name = 'uwp_make_profile_private';
747 - $value = get_user_meta($user_id, $field_name, true);
748 - if ($value === false) {
749 - $value = '0';
750 - }
751 - ?>
752 - <div id="uwp_make_profile_private" class=" uwp_make_profile_private_row">
753 - <input type="hidden" name="uwp_make_profile_private" value="0">
754 - <input name="uwp_make_profile_private" class="" <?php checked( $value, "1", true ); ?> type="checkbox" value="1">
755 - Make the whole profile Private
756 - </div>
757 - <?php
758 - }
759 - ?>
760 - <input type="hidden" name="uwp_privacy_nonce" value="<?php echo wp_create_nonce( 'uwp-privacy-nonce' ); ?>" />
761 - <input name="uwp_privacy_submit" value="<?php echo __( 'Submit', 'userswp' ); ?>" type="submit">
762 - </form>
763 - </div>
764 - </div>
765 - <?php
766 - }
767 - echo '</div>';
768 - }
694 + return $title;
769 695 }
770 696
771 697 add_action('uwp_account_menu_display', 'uwp_add_account_menu_links');
772 698
@@ -777,57 +703,72 @@
777 703 * @package userswp
778 704 *
779 705 * @return void
780 706 */
781 -function uwp_add_account_menu_links() {
707 +function uwp_add_account_menu_links()
708 +{
709 + global $aui_bs5;
782 710
783 - if (isset($_GET['type'])) {
784 - $type = strip_tags(esc_sql($_GET['type']));
785 - } else {
786 - $type = 'account';
787 - }
711 + if (isset($_GET['type'])) {
712 + $type = strip_tags(esc_sql($_GET['type']));
713 + } else {
714 + $type = 'account';
715 + }
788 716
789 - $account_page = uwp_get_option('account_page', false);
790 - $account_page_link = get_permalink($account_page);
717 + $account_page = uwp_get_page_id('account_page', false);
718 + $account_page_link = get_permalink($account_page);
791 719
792 - $account_available_tabs = uwp_account_get_available_tabs();
720 + $account_available_tabs = uwp_account_get_available_tabs();
793 721
794 - if (!is_array($account_available_tabs) || count($account_available_tabs) <= 1) {
795 - return;
796 - }
722 + if (!is_array($account_available_tabs) && count($account_available_tabs) > 0) {
723 + return;
724 + }
797 725
798 - echo '<ul class="uwp_account_menu">';
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) {
799 732
800 - foreach( $account_available_tabs as $tab_id => $tab ) {
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 + }
801 740
802 - if ($tab_id == 'account') {
803 - $tab_url = $account_page_link;
804 - } else {
805 - $tab_url = add_query_arg(array(
806 - 'type' => $tab_id,
807 - ), $account_page_link);
808 - }
741 + if (isset($tab['link'])) {
742 + $tab_url = $tab['link'];
743 + }
809 744
810 - if (isset($tab['link'])) {
811 - $tab_url = $tab['link'];
812 - }
745 + $active = $type == $tab_id ? ' active' : '';
813 746
814 - $active = $type == $tab_id ? ' active' : '';
815 - ?>
816 - <li id="uwp-account-<?php echo $tab_id; ?>">
817 - <a class="<?php echo $active; ?>" href="<?php echo esc_url( $tab_url ); ?>">
818 - <i class="<?php echo $tab['icon']; ?>"></i> <?php echo $tab['title']; ?>
819 - </a>
820 - </li>
821 - <?php
822 - }
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
823 752
824 - echo '</ul>';
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 + }
825 769 }
826 770
827 -
828 -
829 -
830 771 /**
831 772 * Updates extras fields sort order.
832 773 *
833 774 * @since 1.0.0
@@ -834,37 +775,38 @@
834 775 * @package userswp
835 776 *
836 777 * @param array $field_ids Form extras field ids.
837 778 * @param string $form_type Form type.
779 + * @param int $form_id Form ID.
838 780 *
839 781 * @return array|bool Sorted field ids.
840 782 */
841 -function uwp_form_extras_field_order($field_ids = array(), $form_type = 'register')
783 +function uwp_form_extras_field_order($field_ids = array(), $form_type = 'register', $form_id = 1)
842 784 {
843 - global $wpdb;
844 - $extras_table_name = uwp_get_table_prefix() . 'uwp_form_extras';
785 + global $wpdb;
786 + $extras_table_name = uwp_get_table_prefix() . 'uwp_form_extras';
845 787
846 - $count = 0;
847 - if (!empty($field_ids)):
848 - foreach ($field_ids as $id) {
788 + $count = 0;
789 + if (!empty($field_ids)):
790 + foreach ($field_ids as $id) {
849 791
850 - $cf = trim($id, '_');
792 + $cf = trim($id, '_');
851 793
852 - $wpdb->query(
853 - $wpdb->prepare(
854 - "update " . $extras_table_name . " set
855 - sort_order=%d
856 - where id= %d",
857 - array($count, $cf)
858 - )
859 - );
860 - $count++;
861 - }
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 + );
862 801
863 - return $field_ids;
864 - else:
865 - return false;
866 - endif;
802 + $count++;
803 + }
804 +
805 + return $field_ids;
806 + else:
807 + return false;
808 + endif;
867 809 }
868 810
869 811 /**
870 812 * Uppercase the first character of each word in a string.
@@ -876,14 +818,15 @@
876 818 * @param string $charset Charset.
877 819 *
878 820 * @return string Converted string.
879 821 */
880 -function uwp_ucwords($string, $charset='UTF-8') {
881 - if (function_exists('mb_convert_case')) {
882 - return mb_convert_case($string, MB_CASE_TITLE, $charset);
883 - } else {
884 - return ucwords($string);
885 - }
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 + }
886 829 }
887 830
888 831 /**
889 832 * Checks whether the column exists in the table.
@@ -897,10 +840,10 @@
897 840 * @return bool
898 841 */
899 842 function uwp_column_exist($db, $column)
900 843 {
901 - $table = new UsersWP_Tables();
902 - $table->column_exists($db, $column);
844 + $table = new UsersWP_Tables();
845 + return $table->column_exists($db, $column);
903 846 }
904 847
905 848 /**
906 849 * Adds column if not exist in the table.
@@ -915,11 +858,10 @@
915 858 * @return bool|int True when success.
916 859 */
917 860 function uwp_add_column_if_not_exist($db, $column, $column_attr = "VARCHAR( 255 ) NOT NULL")
918 861 {
919 - $table = new UsersWP_Tables();
920 - $table->add_column_if_not_exist($db, $column, $column_attr);
921 -
862 + $table = new UsersWP_Tables();
863 + return $table->add_column_if_not_exist($db, $column, $column_attr);
922 864 }
923 865
924 866 /**
925 867 * Returns excluded custom fields.
@@ -928,14 +870,16 @@
928 870 * @package userswp
929 871 *
930 872 * @return array Excluded custom fields.
931 873 */
932 -function uwp_get_excluded_fields() {
933 - $excluded = array(
934 - 'uwp_account_password',
935 - 'uwp_account_confirm_password',
936 - );
937 - return $excluded;
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);
938 882 }
939 883
940 884 /**
941 885 * Formats the currency using currency separator.
@@ -947,50 +891,61 @@
947 891 * @param array|string $cf Custom field info.
948 892 *
949 893 * @return string Formatted currency.
950 894 */
951 -function uwp_currency_format_number($number='',$cf=''){
895 +function uwp_currency_format_number($number = '', $cf = '')
896 +{
952 897
953 - $cs = isset($cf['extra_fields']) ? maybe_unserialize($cf['extra_fields']) : '';
898 + $cs = isset($cf['extra_fields']) ? maybe_unserialize($cf['extra_fields']) : '';
954 899
955 - $symbol = isset($cs['currency_symbol']) ? $cs['currency_symbol'] : '$';
956 - $decimals = isset($cf['decimal_point']) && $cf['decimal_point'] ? $cf['decimal_point'] : 2;
957 - $decimal_display = isset($cf['decimal_display']) && $cf['decimal_display'] ? $cf['decimal_display'] : 'if';
958 - $decimalpoint = '.';
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 = '.';
959 904
960 - if(isset($cs['decimal_separator']) && $cs['decimal_separator']=='comma'){
961 - $decimalpoint = ',';
962 - }
905 + if (isset($cs['decimal_separator']) && $cs['decimal_separator'] == 'comma') {
906 + $decimalpoint = ',';
907 + }
963 908
964 - $separator = ',';
909 + $separator = ',';
965 910
966 - if(isset($cs['thousand_separator'])){
967 - if($cs['thousand_separator']=='comma'){$separator = ',';}
968 - if($cs['thousand_separator']=='slash'){$separator = '\\';}
969 - if($cs['thousand_separator']=='period'){$separator = '.';}
970 - if($cs['thousand_separator']=='space'){$separator = ' ';}
971 - if($cs['thousand_separator']=='none'){$separator = '';}
972 - }
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 + }
973 928
974 - $currency_symbol_placement = isset($cs['currency_symbol_placement']) ? $cs['currency_symbol_placement'] : 'left';
929 + $currency_symbol_placement = isset($cs['currency_symbol_placement']) ? $cs['currency_symbol_placement'] : 'left';
975 930
976 - if($decimals>0 && $decimal_display=='if'){
977 - if(is_int($number) || floor( $number ) == $number)
978 - $decimals = 0;
979 - }
931 + if ($decimals > 0 && $decimal_display == 'if') {
932 + if (is_int($number) || floor($number) == $number)
933 + $decimals = 0;
934 + }
980 935
981 - $number = number_format($number,$decimals,$decimalpoint,$separator);
936 + $number = number_format($number, $decimals, $decimalpoint, $separator);
982 937
983 938
984 939
985 - if($currency_symbol_placement=='left'){
986 - $number = $symbol . $number;
987 - }else{
988 - $number = $number . $symbol;
989 - }
940 + if ($currency_symbol_placement == 'left') {
941 + $number = $symbol . $number;
942 + } else {
943 + $number = $number . $symbol;
944 + }
990 945
991 946
992 - return $number;
947 + return $number;
993 948 }
994 949
995 950
996 951 /**
@@ -1000,217 +955,83 @@
1000 955 * @package userswp
1001 956 *
1002 957 * @return bool
1003 958 */
1004 -function uwp_can_make_profile_private() {
1005 - $make_profile_private = apply_filters('uwp_user_can_make_profile_private', false);
1006 - return $make_profile_private;
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;
1007 963 }
1008 964
1009 965 /**
1010 - * Returns available registration status options.
966 + * Returns the installation type.
1011 967 *
1012 968 * @since 1.0.0
1013 969 * @package userswp
1014 970 *
1015 - * @return array Registration status options.
971 + * @return string Installation type.
1016 972 */
1017 -function uwp_registration_status_options() {
1018 - $registration_options = array(
1019 - 'auto_approve' => __('Auto approve', 'userswp'),
1020 - 'auto_approve_login' => __('Auto approve + Auto Login', 'userswp'),
1021 - 'require_email_activation' => __('Require Email Activation', 'userswp'),
1022 - );
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 + }
1023 983
1024 - $registration_options = apply_filters('uwp_registration_status_options', $registration_options);
1025 -
1026 - return $registration_options;
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 + }
1027 1004 }
1028 1005
1029 1006 /**
1030 - * Retrieves a user row based on password reset key and login
1007 + * Returns the table prefix based on the installation type.
1031 1008 *
1032 1009 * @since 1.0.0
1033 1010 * @package userswp
1034 1011 *
1035 - * @param string $key Hash to validate sending user's password.
1036 - * @param string $login The user login.
1037 - *
1038 - * @return WP_Error|WP_User User object.
1012 + * @return string Table prefix
1039 1013 */
1040 -function uwp_check_activation_key( $key, $login ) {
1041 - $user_data = check_password_reset_key( $key, $login );
1042 -
1043 - return $user_data;
1014 +function uwp_get_table_prefix()
1015 +{
1016 + $tables = new UsersWP_Tables();
1017 + return $tables->get_table_prefix();
1044 1018 }
1045 1019
1046 -
1047 -add_action('uwp_template_fields', 'uwp_template_fields_terms_check', 100, 1);
1048 -
1049 1020 /**
1050 - * Adds "Accept terms and conditions" checkbox in register form.
1051 - *
1052 - * @since 1.0.0
1053 - * @package userswp
1054 - *
1055 - * @param string $form_type Form type.
1056 - *
1057 - * @return void
1058 - */
1059 -function uwp_template_fields_terms_check($form_type) {
1060 - if ($form_type == 'register') {
1061 - $terms_page = false;
1062 - $reg_terms_page_id = uwp_get_option('register_terms_page', '');
1063 - $reg_terms_page_id = apply_filters('uwp_reg_terms_page_id', $reg_terms_page_id);
1064 - if (!empty($reg_terms_page_id)) {
1065 - $terms_page = get_permalink($reg_terms_page_id);
1066 - }
1067 - if ($terms_page) {
1068 - ?>
1069 - <div class="uwp-remember-me">
1070 - <label style="display: inline-block;font-weight: normal" for="agree_terms">
1071 - <input name="agree_terms" id="agree_terms" value="yes" type="checkbox">
1072 - <?php echo sprintf( __( 'I Accept <a href="%s" target="_blank">Terms and Conditions</a>.', 'userswp' ), $terms_page); ?>
1073 - </label>
1074 - </div>
1075 - <?php
1076 - }
1077 - }
1078 -}
1079 -
1080 -
1081 -
1082 -/**
1083 - * Redirects the user to login page when email not confirmed.
1084 - *
1085 - * @since 1.0.0
1086 - * @package userswp
1087 - *
1088 - * @param string $username Username.
1089 - * @param object $user User object.
1090 - *
1091 - * @return void
1092 - */
1093 -function uwp_unconfirmed_login_redirect( $username, $user ) {
1094 - if (!is_wp_error($user)) {
1095 - $mod_value = get_user_meta( $user->ID, 'uwp_mod', true );
1096 - if ($mod_value == 'email_unconfirmed') {
1097 - if ( !in_array( 'administrator', $user->roles ) ) {
1098 - $login_page = uwp_get_option('login_page', false);
1099 - if ($login_page) {
1100 - $redirect_to = add_query_arg(array('uwp_err' => 'act_pending'), get_permalink($login_page));
1101 - wp_destroy_current_session();
1102 - wp_clear_auth_cookie();
1103 - wp_redirect($redirect_to);
1104 - exit();
1105 - }
1106 - }
1107 - }
1108 - }
1109 -}
1110 -add_filter( 'wp_login', 'uwp_unconfirmed_login_redirect', 10, 2 );
1111 -
1112 -/**
1113 - * Adds notification menu in admin toolbar.
1114 - *
1115 - * @since 1.0.0
1116 - * @package userswp
1117 - *
1118 - * @return void
1119 - */
1120 -function uwp_notifications_toolbar_menu() {
1121 - global $wp_admin_bar;
1122 -
1123 - if ( ! is_user_logged_in() ) {
1124 - return;
1125 - }
1126 -
1127 - $available_counts = apply_filters('uwp_notifications_available_counts', array());
1128 -
1129 - if (count($available_counts) == 0) {
1130 - return;
1131 - }
1132 -
1133 - $total_count = 0;
1134 - foreach ($available_counts as $key => $value) {
1135 - $total_count = $total_count + $value;
1136 - }
1137 -
1138 -
1139 - $alert_class = (int) $total_count > 0 ? 'pending-count' : 'count';
1140 - $menu_title = '<span id="uwp-notification-count" class="' . $alert_class . '">'
1141 - . number_format_i18n( $total_count ) . '</span>';
1142 - $menu_link = '';
1143 -
1144 - // Add the top-level Notifications button.
1145 - $wp_admin_bar->add_menu( array(
1146 - 'parent' => 'top-secondary',
1147 - 'id' => 'uwp-notifications',
1148 - 'title' => $menu_title,
1149 - 'href' => $menu_link,
1150 - ) );
1151 -
1152 - do_action('uwp_notifications_items', $wp_admin_bar);
1153 -
1154 - return;
1155 -}
1156 -add_action( 'admin_bar_menu', 'uwp_notifications_toolbar_menu', 90 );
1157 -
1158 -/**
1159 - * Returns the installation type.
1160 - *
1161 - * @since 1.0.0
1162 - * @package userswp
1163 - *
1164 - * @return string Installation type.
1165 - */
1166 -function uwp_get_installation_type() {
1167 - // *. Single Site
1168 - if (!is_multisite()) {
1169 - return "single";
1170 - } else {
1171 - // Multisite
1172 - if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
1173 - require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
1174 - }
1175 -
1176 - // Network active.
1177 - if ( is_plugin_active_for_network( 'userswp/userswp.php' ) ) {
1178 - if (defined('UWP_ROOT_PAGES')) {
1179 - if (UWP_ROOT_PAGES == 'all') {
1180 - // *. Multisite - Network Active - Pages on all sites
1181 - return "multi_na_all";
1182 - } else {
1183 - // *. Multisite - Network Active - Pages on specific site
1184 - return "multi_na_site_id";
1185 - }
1186 - } else {
1187 - // Multi - network active - default
1188 - // *. Multisite - Network Active - Pages on main site
1189 - return "multi_na_default";
1190 - }
1191 - } else {
1192 - // * Multisite - Not network active
1193 - return "multi_not_na";
1194 - }
1195 - }
1196 -}
1197 -
1198 -/**
1199 1021 * Returns the table prefix based on the installation type.
1200 1022 *
1201 - * @since 1.0.0
1023 + * @since 1.0.16
1202 1024 * @package userswp
1203 1025 *
1204 1026 * @return string Table prefix
1205 1027 */
1206 -function uwp_get_table_prefix() {
1207 - $tables = new UsersWP_Tables();
1208 - return $tables->get_table_prefix();
1028 +function get_usermeta_table_prefix()
1029 +{
1030 + $tables = new UsersWP_Tables();
1031 + return $tables->get_usermeta_table_prefix();
1209 1032 }
1210 1033
1211 -
1212 -
1213 1034 /**
1214 1035 * Converts array to comma separated string.
1215 1036 *
1216 1037 *
@@ -1221,14 +1042,15 @@
1221 1042 * @param string $value Custom field value.
1222 1043 *
1223 1044 * @return string Converted custom field value string.
1224 1045 */
1225 -function uwp_maybe_serialize($key, $value) {
1226 - $field = uwp_get_custom_field_info($key);
1227 - if (isset($field->field_type) && $field->field_type == 'multiselect') {
1228 - $value = implode(",", $value);
1229 - }
1230 - return $value;
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;
1231 1053 }
1232 1054
1233 1055 /**
1234 1056 * Converts comma separated string to array.
@@ -1240,14 +1062,15 @@
1240 1062 * @param string $value Custom field value.
1241 1063 *
1242 1064 * @return array Converted custom field value array.
1243 1065 */
1244 -function uwp_maybe_unserialize($key, $value) {
1245 - $field = uwp_get_custom_field_info($key);
1246 - if (isset($field->field_type) && $field->field_type == 'multiselect') {
1247 - $value = explode(",", $value);
1248 - }
1249 - return $value;
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;
1250 1073 }
1251 1074
1252 1075 /**
1253 1076 * Creates UsersWP related tables.
@@ -1258,26 +1081,13 @@
1258 1081 * @return void
1259 1082 */
1260 1083 function uwp_create_tables()
1261 1084 {
1262 - $tables = new UsersWP_Tables();
1263 - $tables->uwp_create_tables();
1085 + $tables = new UsersWP_Tables();
1086 + $tables->create_tables();
1264 1087 }
1265 1088
1266 1089 /**
1267 - * Creates uwp_usermeta table which introduced in version 1.0.1
1268 - *
1269 - * @since 1.0.0
1270 - * @package userswp
1271 - *
1272 - * @return void
1273 - */
1274 -function uwp101_create_tables() {
1275 - $tables = new UsersWP_Tables();
1276 - $tables->uwp101_create_tables();
1277 -}
1278 -
1279 -/**
1280 1090 * Returns tye client IP.
1281 1091 *
1282 1092 * @since 1.0.0
1283 1093 * @package userswp
@@ -1283,20 +1093,21 @@
1283 1093 * @package userswp
1284 1094 *
1285 1095 * @return string IP address.
1286 1096 */
1287 -function uwp_get_ip() {
1288 - if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
1289 - //check ip from share internet
1290 - $ip = $_SERVER['HTTP_CLIENT_IP'];
1291 - } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
1292 - //to check ip is pass from proxy
1293 - $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
1294 - } else {
1295 - $ip = $_SERVER['REMOTE_ADDR'];
1296 - }
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 + }
1297 1108
1298 - return apply_filters('uwp_get_ip', $ip);
1109 + return apply_filters('uwp_get_ip', $ip);
1299 1110 }
1300 1111
1301 1112 /**
1302 1113 * Checks whether the string starts with the given string.
@@ -1310,10 +1121,10 @@
1310 1121 * @return bool True when success. False when failure.
1311 1122 */
1312 1123 function uwp_str_starts_with($haystack, $needle)
1313 1124 {
1314 - $length = strlen($needle);
1315 - return (substr($haystack, 0, $length) === $needle);
1125 + $length = strlen($needle);
1126 + return (substr($haystack, 0, $length) === $needle);
1316 1127 }
1317 1128
1318 1129 /**
1319 1130 * Checks whether the string ends with the given string.
@@ -1327,18 +1138,18 @@
1327 1138 * @return bool True when success. False when failure.
1328 1139 */
1329 1140 function uwp_str_ends_with($haystack, $needle)
1330 1141 {
1331 - $length = strlen($needle);
1332 - if ($length == 0) {
1333 - return true;
1334 - }
1142 + $length = strlen($needle);
1143 + if ($length == 0) {
1144 + return true;
1145 + }
1335 1146
1336 - return (substr($haystack, -$length) === $needle);
1147 + return (substr($haystack, -$length) === $needle);
1337 1148 }
1338 1149
1339 1150 /**
1340 - * Returns the font awesome icon value for field type.
1151 + * Returns the font awesome icon value for field type.
1341 1152 * Displayed in profile tabs.
1342 1153 *
1343 1154 * @since 1.0.0
1344 1155 * @package userswp
@@ -1346,30 +1157,30 @@
1346 1157 * @param string $type Field type.
1347 1158 *
1348 1159 * @return string Font awesome icon value.
1349 1160 */
1350 -function uwp_field_type_to_fa_icon($type) {
1351 - $field_types = array(
1352 - 'text' => 'fa fa-minus',
1353 - 'datepicker' => 'fa fa-calendar',
1354 - 'textarea' => 'fa fa-bars',
1355 - 'time' =>'fa fa-clock-o',
1356 - 'checkbox' =>'fa fa-check-square-o',
1357 - 'phone' =>'fa fa-phone',
1358 - 'radio' =>'fa fa-dot-circle-o',
1359 - 'email' =>'fa fa-envelope-o',
1360 - 'select' =>'fa fa-caret-square-o-down',
1361 - 'multiselect' =>'fa fa-caret-square-o-down',
1362 - 'url' =>'fa fa-link',
1363 - 'file' =>'fa fa-file'
1364 - );
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 + );
1365 1177
1366 - if (isset($field_types[$type])) {
1367 - return $field_types[$type];
1368 - } else {
1369 - return "";
1370 - }
1371 -
1178 + if (isset($field_types[$type])) {
1179 + return $field_types[$type];
1180 + } else {
1181 + return "";
1182 + }
1372 1183 }
1373 1184
1374 1185 /**
1375 1186 * Check wpml active or not.
@@ -1377,14 +1188,15 @@
1377 1188 * @since 1.0.7
1378 1189 *
1379 1190 * @return True if WPML is active else False.
1380 1191 */
1381 -function uwp_is_wpml() {
1382 - if (class_exists('SitePress') && function_exists('icl_object_id')) {
1383 - return true;
1384 - }
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 + }
1385 1197
1386 - return false;
1198 + return false;
1387 1199 }
1388 1200
1389 1201 /**
1390 1202 * Get the element in the WPML current language.
@@ -1400,15 +1212,914 @@
1400 1212 * the original if the translation is missing and $return_original_if_missing is set to TRUE.
1401 1213 *
1402 1214 * @return int|NULL
1403 1215 */
1404 -function uwp_wpml_object_id( $element_id, $element_type = 'post', $return_original_if_missing = false, $ulanguage_code = null ) {
1405 - if ( uwp_is_wpml() ) {
1406 - if ( function_exists( 'wpml_object_id_filter' ) ) {
1407 - return apply_filters( 'wpml_object_id', $element_id, $element_type, $return_original_if_missing, $ulanguage_code );
1408 - } else {
1409 - return icl_object_id( $element_id, $element_type, $return_original_if_missing, $ulanguage_code );
1410 - }
1411 - }
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 + }
1412 1225
1413 - return $element_id;
1414 -}
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 + 'wordfence_2fa_active' => ( class_exists( '\WordfenceLS\Controller_Users' ) && class_exists( '\WordfenceLS\Controller_TOTP' ) ) ? 1 : ''
1478 + );
1479 +
1480 + return apply_filters('uwp_localize_data', $uwp_localize_data);
1481 +}
1482 +
1483 +function uwp_is_page_builder() {
1484 + if (
1485 + ( isset( $_GET['elementor-preview'] ) && $_GET['elementor-preview'] > 0 ) // elementor
1486 + || isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) // divi
1487 + || isset( $_REQUEST['fl_builder'] ) // beaver
1488 + || ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) // siteorigin
1489 + || ! empty( $_REQUEST['cornerstone_preview'] ) // cornerstone
1490 + || ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) // fusion builder
1491 + || ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) // oxygen
1492 + || ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || bricks_is_builder_call() ) ) // Bricks Builder
1493 + || ( \function_exists( 'Breakdance\\isRequestFromBuilderIframe' ) && ( \Breakdance\isRequestFromBuilderIframe() || \Breakdance\isRequestFromBuilderSsr() ) ) // Breakdance Builder
1494 + || ( function_exists( 'znhg_kallyas_theme_config' ) && ! empty( $_REQUEST['zn_pb_edit'] ) ) // Kallyas theme Zion builder
1495 + ) {
1496 + return true; // builder.
1497 + }
1498 +
1499 + return false;
1500 +}
1501 +
1502 +/**
1503 + * Display a help tip for settings.
1504 + *
1505 + * @param string $tip Help tip text
1506 + * @param bool $allow_html Allow sanitized HTML if true or escape
1507 + *
1508 + * @return string
1509 + */
1510 +function uwp_help_tip($tip, $allow_html = false)
1511 +{
1512 + global $aui_bs5;
1513 + if ($allow_html) {
1514 + $tip = uwp_sanitize_tooltip($tip);
1515 + } else {
1516 + $tip = esc_attr($tip);
1517 + }
1518 +
1519 + $ml = $aui_bs5 ? 'ms-2 float-end' : 'ml-2 float-right';
1520 +
1521 + return '<span class="uwp-help-tip dashicons dashicons-editor-help text-muted ' . $ml . '" title="' . $tip . '" data-bs-toggle="tooltip" data-bs-html="true"></span>';
1522 +}
1523 +
1524 +/**
1525 + * Sanitize a string destined to be a tooltip.
1526 + *
1527 + * Tooltips are encoded with htmlspecialchars to prevent XSS. Should not be used in conjunction with esc_attr()
1528 + *
1529 + * @param string $var
1530 + * @return string
1531 + */
1532 +function uwp_sanitize_tooltip($var)
1533 +{
1534 + return htmlspecialchars(wp_kses(html_entity_decode($var), array(
1535 + 'br' => array(),
1536 + 'em' => array(),
1537 + 'strong' => array(),
1538 + 'small' => array(),
1539 + 'span' => array(),
1540 + 'ul' => array(),
1541 + 'li' => array(),
1542 + 'ol' => array(),
1543 + 'p' => array(),
1544 + )));
1545 +}
1546 +
1547 +function uwp_all_email_tags($inline = true, $extra_tags = array())
1548 +{
1549 + $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#]');
1550 +
1551 + if (is_array($extra_tags) && count($extra_tags) > 0) {
1552 + $tags = array_merge($extra_tags, $tags);
1553 + }
1554 +
1555 + $tags = apply_filters('uwp_all_email_tags', $tags);
1556 +
1557 + if ($inline) {
1558 + $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1559 + }
1560 +
1561 + return $tags;
1562 +}
1563 +
1564 +function uwp_wp_new_user_notification_tags($inline = true, $extra_tags = array())
1565 +{
1566 + $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#]',);
1567 +
1568 + if (is_array($extra_tags) && count($extra_tags) > 0) {
1569 + $tags = array_merge($tags, $extra_tags);
1570 + }
1571 +
1572 + $tags = apply_filters('uwp_wp_new_user_notification_email_tags', $tags);
1573 +
1574 + if ($inline) {
1575 + $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1576 + }
1577 +
1578 + return $tags;
1579 +}
1580 +
1581 +
1582 +function uwp_delete_account_email_tags($inline = true)
1583 +{
1584 + $tags = array('[#site_name#]', '[#site_name_url#]', '[#from_name#]', '[#from_email#]', '[#date_time#]', '[#current_date#]', '[#login_url#]', '[#user_login#]');
1585 +
1586 + $tags = apply_filters('uwp_delete_account_email_tags', $tags);
1587 +
1588 + if ($inline) {
1589 + $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1590 + }
1591 +
1592 + return $tags;
1593 +}
1594 +
1595 +function uwp_authbox_tags($inline = true)
1596 +{
1597 + global $wpdb;
1598 +
1599 + $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#]');
1600 +
1601 + $tags = apply_filters('uwp_author_box_default_tags', $tags, $inline);
1602 +
1603 + $table_name = uwp_get_table_prefix() . 'uwp_usermeta';
1604 +
1605 + $excluded = uwp_get_excluded_fields();
1606 +
1607 + $columns = $wpdb->get_col("show columns from $table_name"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
1608 +
1609 + $extra_tags = array_diff($columns, $excluded);
1610 +
1611 + if (!empty($extra_tags) && '' != $extra_tags) {
1612 +
1613 + foreach ($extra_tags as $tag_val) {
1614 + $tags[] = '[#' . $tag_val . '#]';
1615 + }
1616 + }
1617 +
1618 + $tags = apply_filters('uwp_all_author_box_tags', $tags);
1619 +
1620 + if ($inline) {
1621 + $tags = '<code>' . implode('</code> <code>', $tags) . '</code>';
1622 + }
1623 +
1624 + return $tags;
1625 +}
1626 +
1627 +function uwp_get_posttypes()
1628 +{
1629 +
1630 + $exclude_posts = array('attachment', 'revision', 'nav_menu_item', 'custom_css', 'uwp-post');
1631 + $exclude_posttype = apply_filters('uwp_exclude_register_posttype', $exclude_posts);
1632 +
1633 + $all_posttyps = get_post_types(array('public' => true,), 'objects');
1634 +
1635 + $display_posttypes = array();
1636 +
1637 + if (!empty($all_posttyps) && '' != $all_posttyps) {
1638 + foreach ($all_posttyps as $pt_keys => $pt_values) {
1639 +
1640 + if (!in_array($pt_values->name, $exclude_posttype)) {
1641 + $display_posttypes[$pt_values->name] = $pt_values->label;
1642 + }
1643 + }
1644 + }
1645 +
1646 + return $display_posttypes;
1647 +}
1648 +
1649 +function uwp_get_user_by_author_slug()
1650 +{
1651 + $url_type = apply_filters('uwp_profile_url_type', 'slug');
1652 + $author_slug = get_query_var('uwp_profile');
1653 + if ($url_type == 'id') {
1654 + $user = get_user_by('id', $author_slug);
1655 + } else {
1656 + $user = get_user_by('slug', $author_slug);
1657 + }
1658 +
1659 + return $user;
1660 +}
1661 +
1662 +function uwp_get_show_in_locations()
1663 +{
1664 + $show_in_locations = array(
1665 + "[users]" => __("Users Page", 'userswp'),
1666 + "[more_info]" => __("More info tab", 'userswp'),
1667 + "[profile_side]" => __("Profile side (non bootstrap)", 'userswp'),
1668 + "[fieldset]" => __("Fieldset", 'userswp'),
1669 + );
1670 +
1671 + $show_in_locations = apply_filters('uwp_show_in_locations', $show_in_locations);
1672 +
1673 + return $show_in_locations;
1674 +}
1675 +
1676 +function uwp_get_displayed_user()
1677 +{
1678 + global $uwp_user;
1679 + $user = uwp_get_user_by_author_slug(); // for user displayed in profile
1680 +
1681 + if (!$user && is_user_logged_in()) {
1682 + $user = get_userdata(get_current_user_id()); // for user currently logged in
1683 + }
1684 +
1685 + if (isset($uwp_user) && !empty($uwp_user) && $uwp_user instanceof WP_User) { // for user displaying in loop
1686 + $user = $uwp_user;
1687 + }
1688 +
1689 + return apply_filters('uwp_get_displayed_user', $user);
1690 +}
1691 +
1692 +function uwp_is_gdv2()
1693 +{
1694 +
1695 + if (defined('GEODIRECTORY_VERSION') && version_compare(GEODIRECTORY_VERSION, '2.0.0.0', '>=')) {
1696 + return true;
1697 + }
1698 +
1699 + return false;
1700 +}
1701 +
1702 +function uwp_get_blogname()
1703 +{
1704 + $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
1705 +
1706 + return apply_filters('uwp_get_blogname', $blogname);
1707 +}
1708 +
1709 +/**
1710 + * RGB from hex.
1711 + *
1712 + * @since 1.2.1.3
1713 + *
1714 + * @param string $color Color.
1715 + * @return array $rgb.
1716 + */
1717 +function uwp_rgb_from_hex($color)
1718 +{
1719 + $color = str_replace('#', '', $color);
1720 +
1721 + // Convert shorthand colors to full format, e.g. "FFF" -> "FFFFFF"
1722 + $color = preg_replace('~^(.)(.)(.)$~', '$1$1$2$2$3$3', $color);
1723 + if (empty($color)) {
1724 + return NULL;
1725 + }
1726 +
1727 + $color = str_split($color);
1728 +
1729 + $rgb = array();
1730 + $rgb['R'] = hexdec($color[0] . $color[1]);
1731 + $rgb['G'] = hexdec($color[2] . $color[3]);
1732 + $rgb['B'] = hexdec($color[4] . $color[5]);
1733 +
1734 + return $rgb;
1735 +}
1736 +
1737 +/**
1738 + * HEX darker.
1739 + *
1740 + * @since 1.2.1.3
1741 + *
1742 + * @param string $color Color.
1743 + * @param int $factor Optional. Factor. Default 30.
1744 + * @return string $color.
1745 + */
1746 +function uwp_hex_darker($color, $factor = 30)
1747 +{
1748 + $base = uwp_rgb_from_hex($color);
1749 + if (empty($base)) {
1750 + return $color;
1751 + }
1752 +
1753 + $color = '#';
1754 + foreach ($base as $k => $v) {
1755 + $amount = $v / 100;
1756 + $amount = round($amount * $factor);
1757 + $new_decimal = $v - $amount;
1758 +
1759 + $new_hex_component = dechex($new_decimal);
1760 + if (strlen($new_hex_component) < 2) {
1761 + $new_hex_component = "0" . $new_hex_component;
1762 + }
1763 + $color .= $new_hex_component;
1764 + }
1765 +
1766 + return $color;
1767 +}
1768 +
1769 +/**
1770 + * Hex lighter.
1771 + *
1772 + * @since 1.2.1.3
1773 + *
1774 + * @param string $color Color.
1775 + * @param int $factor Optional. factor. Default 30.
1776 + * @return string $color.
1777 + */
1778 +function uwp_hex_lighter($color, $factor = 30)
1779 +{
1780 + $base = uwp_rgb_from_hex($color);
1781 + if (empty($base)) {
1782 + return $color;
1783 + }
1784 +
1785 + $color = '#';
1786 +
1787 + foreach ($base as $k => $v) {
1788 + $amount = 255 - $v;
1789 + $amount = $amount / 100;
1790 + $amount = round($amount * $factor);
1791 + $new_decimal = $v + $amount;
1792 +
1793 + $new_hex_component = dechex($new_decimal);
1794 + if (strlen($new_hex_component) < 2) {
1795 + $new_hex_component = "0" . $new_hex_component;
1796 + }
1797 + $color .= $new_hex_component;
1798 + }
1799 +
1800 + return $color;
1801 +}
1802 +
1803 +/**
1804 + * Get Light or dark.
1805 + *
1806 + * @since 1.2.1.3
1807 + *
1808 + * @param string $color color.
1809 + * @param string $dark Optional. Dark. Default #000000.
1810 + * @param string $light Optional. Light. Default #FFFFFF.
1811 + * @return string
1812 + */
1813 +function uwp_light_or_dark($color, $dark = '#000000', $light = '#FFFFFF')
1814 +{
1815 + $hex = str_replace('#', '', $color);
1816 + if (empty($hex)) {
1817 + return $color;
1818 + }
1819 +
1820 + $c_r = hexdec(substr($hex, 0, 2));
1821 + $c_g = hexdec(substr($hex, 2, 2));
1822 + $c_b = hexdec(substr($hex, 4, 2));
1823 +
1824 + $brightness = (($c_r * 299) + ($c_g * 587) + ($c_b * 114)) / 1000;
1825 +
1826 + return $brightness > 155 ? $dark : $light;
1827 +}
1828 +
1829 +/**
1830 + * Format hex.
1831 + *
1832 + * @since 1.2.1.3
1833 + *
1834 + * @param string $hex hex.
1835 + * @return string
1836 + */
1837 +function uwp_format_hex($hex)
1838 +{
1839 + $hex = trim(str_replace('#', '', $hex));
1840 + if (empty($hex)) {
1841 + return NULL;
1842 + }
1843 +
1844 + if (strlen($hex) == 3) {
1845 + $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
1846 + }
1847 +
1848 + return $hex ? '#' . $hex : null;
1849 +}
1850 +
1851 +/**
1852 + * Returns activation link for user.
1853 + *
1854 + * @since 1.2.1.3
1855 + *
1856 + * @param int $user_id User ID.
1857 + *
1858 + * @return string $activation_link
1859 + */
1860 +function uwp_get_activation_link($user_id)
1861 +{
1862 +
1863 + global $wpdb, $wp_hasher;
1864 +
1865 + if (!$user_id) {
1866 + return false;
1867 + }
1868 +
1869 + $user_data = get_userdata($user_id);
1870 +
1871 + $key = wp_generate_password(20, false);
1872 +
1873 + do_action('uwp_activation_key', $user_data->user_login, $key);
1874 +
1875 + if ( function_exists( 'wp_fast_hash' ) ) {
1876 + $hashed = wp_fast_hash( $key );
1877 + } else {
1878 + if ( empty( $wp_hasher ) ) {
1879 + require_once ABSPATH . 'wp-includes/class-phpass.php';
1880 + $wp_hasher = new PasswordHash( 8, true );
1881 + }
1882 + $hashed = $wp_hasher->HashPassword( $key );
1883 + }
1884 + $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
1885 + update_user_meta($user_id, 'uwp_mod', 'email_unconfirmed');
1886 +
1887 + $activation_args = array(
1888 + 'uwp_activate' => 'yes',
1889 + 'key' => $key,
1890 + 'login' => rawurlencode($user_data->user_login)
1891 + );
1892 +
1893 + $activation_args = apply_filters('uwp_activation_link_args', $activation_args, $user_id, $user_data);
1894 +
1895 + $activation_link = add_query_arg(
1896 + $activation_args,
1897 + home_url('/login/')
1898 + );
1899 +
1900 + return apply_filters('uwp_activation_link', $activation_link, $user_id, $user_data, $activation_args);
1901 +}
1902 +
1903 +/**
1904 + * Checks a version number against the core version and adds a admin notice if requirements are not met.
1905 + *
1906 + * @param $name
1907 + * @param $version
1908 + *
1909 + * @return bool
1910 + */
1911 +function uwp_min_version_check($name, $version)
1912 +{
1913 + if (version_compare(USERSWP_VERSION, $version, '<')) {
1914 + add_action('admin_notices', function () use (&$name) {
1915 + ?>
1916 + <div class="notice notice-error is-dismissible">
1917 + <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>
1918 + </div>
1919 +<?php
1920 + });
1921 +
1922 + return false;
1923 + }
1924 +
1925 + return true;
1926 +}
1927 +
1928 +function uwp_get_user_roles($exclude = array())
1929 +{
1930 + $user_roles = array();
1931 + if (!function_exists('get_editable_roles')) {
1932 + require_once(ABSPATH . '/wp-admin/includes/user.php');
1933 + }
1934 +
1935 + $wp_roles = get_editable_roles();
1936 + if (!empty($wp_roles) && is_array($wp_roles)) {
1937 + foreach ($wp_roles as $role => $details) {
1938 + if (in_array($role, $exclude)) {
1939 + } else {
1940 + $user_roles[esc_attr($role)] = !empty($details['name']) ? translate_user_role($details['name']) : $role;
1941 + }
1942 + }
1943 + }
1944 +
1945 + return $user_roles;
1946 +}
1947 +
1948 +function uwp_get_sort_by_order_list()
1949 +{
1950 +
1951 + $cache = wp_cache_get("uwp_get_sort_options");
1952 + if ($cache !== false) {
1953 + return $cache;
1954 + }
1955 +
1956 + global $wpdb;
1957 + $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
1958 +
1959 + $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
1960 +
1961 + $sort_options = array();
1962 +
1963 + if (! empty($sort_options_raw) && count($sort_options_raw) > 1) {
1964 + foreach ($sort_options_raw as $sort) {
1965 + $sort = stripslashes_deep($sort);
1966 +
1967 + $sort->site_title = __(wp_unslash($sort->site_title), 'userswp');
1968 +
1969 + if ($sort->htmlvar_name == 'comment_count') {
1970 + $sort->htmlvar_name = 'rating_count';
1971 + }
1972 +
1973 + $key = $sort->htmlvar_name;
1974 + if (!in_array($key, array('newer', 'older'))) {
1975 + if ($sort->sort == 'asc') {
1976 + $key = esc_attr($sort->htmlvar_name . "_asc");
1977 + } elseif ($sort->sort == 'desc') {
1978 + $key = esc_attr($sort->htmlvar_name . "_desc");
1979 + }
1980 + }
1981 +
1982 + $sort_options[$key] = wp_unslash($sort->site_title);
1983 + }
1984 + }
1985 +
1986 + /**
1987 + * Filter post sort options.
1988 + *
1989 + * @param array $sort_options Unfiltered sort field array.
1990 + */
1991 + $sort_options = apply_filters('uwp_available_users_layout', $sort_options);
1992 +
1993 + wp_cache_set("uwp_get_sort_options", $sort_options);
1994 +
1995 + return $sort_options;
1996 +}
1997 +
1998 +function uwp_get_default_sort()
1999 +{
2000 +
2001 + $cache = wp_cache_get("uwp_get_default_sort");
2002 +
2003 + if ($cache !== false) {
2004 + return $cache;
2005 + }
2006 +
2007 + $default_sort = 'newer_asc';
2008 +
2009 + global $wpdb;
2010 + $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
2011 +
2012 + $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
2013 + if (! empty($field)) {
2014 + if ($field->field_type == 'random') {
2015 + $default_sort = 'random';
2016 + } elseif ('newer' == $field->htmlvar_name) {
2017 + $default_sort = 'user_registered_desc';
2018 + } elseif ('older' == $field->htmlvar_name) {
2019 + $default_sort = 'user_registered_asc';
2020 + } else {
2021 + $default_sort = $field->htmlvar_name . '_' . $field->sort;
2022 + }
2023 + }
2024 +
2025 + wp_cache_set("uwp_get_default_sort", $default_sort);
2026 +
2027 + return $default_sort;
2028 +}
2029 +
2030 +function uwp_get_username($user_id)
2031 +{
2032 + $user_data = get_userdata($user_id);
2033 +
2034 + if (! $user_data) {
2035 + return '';
2036 + }
2037 +
2038 + $display_name = ! empty($user_data->display_name) ? $user_data->display_name : $user_data->user_login;
2039 +
2040 + return apply_filters('uwp_get_username', $display_name, $user_id, $user_data);
2041 +}
2042 +
2043 +/**
2044 + * File relative url.
2045 + *
2046 + * @since 1.2.66
2047 + *
2048 + * @param string $url URL.
2049 + * @param bool $full_path Optional. Full Path. Default false.
2050 + * @return string
2051 + */
2052 +function uwp_get_file_relative_url( $url, $full_path = false ) {
2053 + $url = trim( $url );
2054 +
2055 + if ( !$url ) {
2056 + return $url;
2057 + }
2058 +
2059 + $relative_url = $url;
2060 + $url = trim( $url, '/\\' ); // clean slashes
2061 +
2062 + $upload_dir = wp_upload_dir();
2063 + $upload_basedir = $upload_dir['basedir'];
2064 + $upload_baseurl = $upload_dir['baseurl'];
2065 + $content_dir = untrailingslashit( WP_CONTENT_DIR );
2066 + $content_url = untrailingslashit( WP_CONTENT_URL );
2067 +
2068 + if ( strpos( $upload_baseurl, 'https://' ) === 0 ) {
2069 + $https = 'https://';
2070 + $match_upload_baseurl = str_replace( 'https://', '', $upload_baseurl );
2071 + $content_url = str_replace( 'http://', 'https://', $content_url );
2072 + } else {
2073 + $https = 'http://';
2074 + $match_upload_baseurl = str_replace( 'http://', '', $upload_baseurl );
2075 + $content_url = str_replace( 'https://', 'http://', $content_url );
2076 + }
2077 +
2078 + $match_content_url = strpos( $content_url, 'https://' ) === 0 ? str_replace( 'https://', '', $content_url ) : str_replace( 'http://', '', $content_url );
2079 + $match_url = strpos( $url, 'https://' ) === 0 ? str_replace( 'https://', '', $url ) : str_replace( 'http://', '', $url );
2080 +
2081 + // www.
2082 + $www = '';
2083 + if ( strpos( $match_upload_baseurl, 'www.' ) === 0 ) {
2084 + $www = 'www.';
2085 + $match_upload_baseurl = str_replace( 'www.', '', $match_upload_baseurl );
2086 + }
2087 + if ( strpos( $match_content_url, 'www.' ) === 0 ) {
2088 + $match_content_url = str_replace( 'www.', '', $match_content_url );
2089 + }
2090 + if ( strpos( $match_url, 'www.' ) === 0 ) {
2091 + $match_url = str_replace( 'www.', '', $match_url );
2092 + }
2093 +
2094 + if ( $full_path ) {
2095 + if ( strpos( $relative_url, 'http://' ) === 0 || strpos( $relative_url, 'https://' ) === 0 ) {
2096 + if ( strpos( $match_url, $match_upload_baseurl ) === 0 || strpos( $match_url, $match_content_url ) === 0 ) {
2097 + $relative_url = $https . $www . $match_url;
2098 + }
2099 + } else {
2100 + if ( is_file( $content_dir . '/' . $match_url ) && file_exists( $content_dir . '/' . $match_url ) ) { // url contains content url
2101 + $relative_url = $content_url . '/' . $match_url;
2102 + } elseif ( is_file( $upload_basedir . '/' . $match_url ) && file_exists( $upload_basedir . '/' . $match_url ) ) { // url contains content url
2103 + $relative_url = $upload_baseurl . '/' . $match_url;
2104 + }
2105 + }
2106 + } else {
2107 + if ( substr_count( $match_url, $match_upload_baseurl ) > 1 || substr_count( $match_url, $match_content_url ) > 1 ) {
2108 + return '';
2109 + }
2110 +
2111 + if ( strpos( $match_url, $match_upload_baseurl ) === 0 ) { // url contains uploads baseurl
2112 + $relative_url = substr( $match_url, strlen( $match_upload_baseurl ) );
2113 + } elseif ( strpos( $match_url, $match_content_url ) === 0 ) { // url contains content url
2114 + $relative_url = substr( $match_url, strlen( $match_content_url ) );
2115 + }
2116 +
2117 + $relative_url = trim( $relative_url, '/\\' );
2118 +
2119 + if ( false !== strpos( $relative_url, '..' ) ) {
2120 + return '';
2121 + }
2122 + }
2123 +
2124 + return apply_filters( 'uwp_get_file_relative_url', $relative_url, $url, $full_path );
2125 +}