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 +1686 -1022 1.0.121.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,311 +265,383 @@
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 - $arg = array(
293 - 'fields' => 'ID',
294 - 'meta_query' => array(
295 - 'relation' => 'OR',
296 - array(
297 - 'key' => 'uwp_mod',
298 - 'value' => 'email_unconfirmed',
299 - 'compare' => '=='
300 - ),
301 - array(
302 - 'key' => 'uwp_hide_from_listing',
303 - 'value' => 1,
304 - 'compare' => '=='
305 - )
306 - )
307 - );
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 + }
308 382
309 - $inactive_users = new WP_User_Query($arg);
310 - $exclude_users = $inactive_users->get_results();
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 + }
311 407
312 - $exclude_users = apply_filters('uwp_excluded_users_from_list', $exclude_users, $where, $keyword);
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 + }
313 413
314 - if($exclude_users){
315 - $exclude_users_list = implode(',', $exclude_users);
316 - $exclude_query = 'AND '. $wpdb->users.'.ID NOT IN ('.$exclude_users_list.')';
317 - } else {
318 - $exclude_query = ' ';
319 - }
414 + $users = array();
320 415
321 - if ($keyword || $where) {
322 - if (empty($where)) {
323 - $users = $wpdb->get_results($wpdb->prepare(
324 - "SELECT DISTINCT SQL_CALC_FOUND_ROWS $wpdb->users.*
325 - FROM $wpdb->users
326 - INNER JOIN $wpdb->usermeta
327 - ON ( $wpdb->users.ID = $wpdb->usermeta.user_id )
328 - WHERE 1=1
329 - $exclude_query
330 - AND (
331 - ( $wpdb->usermeta.meta_key = 'first_name' AND $wpdb->usermeta.meta_value LIKE %s )
332 - OR
333 - ( $wpdb->usermeta.meta_key = 'last_name' AND $wpdb->usermeta.meta_value LIKE %s )
334 - OR
335 - user_login LIKE %s
336 - OR
337 - user_nicename LIKE %s
338 - OR
339 - display_name LIKE %s
340 - OR
341 - user_email LIKE %s
342 - )
343 - ORDER BY display_name ASC
344 - LIMIT 0, 20",
345 - array(
346 - '%' . $keyword . '%',
347 - '%' . $keyword . '%',
348 - '%' . $keyword . '%',
349 - '%' . $keyword . '%',
350 - '%' . $keyword . '%',
351 - '%' . $keyword . '%'
352 - )
353 - ));
354 - } else {
355 - $usermeta_table = uwp_get_table_prefix() . 'uwp_usermeta';
416 + // Check if we have search criteria
417 + if ( $keyword || $where ) {
356 418
357 - $users = $wpdb->get_results(
358 - "SELECT DISTINCT SQL_CALC_FOUND_ROWS $wpdb->users.*
359 - FROM $wpdb->users
360 - INNER JOIN $usermeta_table
361 - ON ( $wpdb->users.ID = $usermeta_table.user_id )
362 - WHERE 1=1
363 - $exclude_query
364 - $where
365 - ORDER BY display_name ASC
366 - LIMIT 0, 20");
367 - }
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 = '';
368 451
369 - $total_user = count($users);
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 + }
370 469
371 - } else {
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 + }
372 477
373 - $args = array(
374 - 'number' => (int) $number,
375 - 'paged' => $paged,
376 - 'exclude' => $exclude_users,
377 - );
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' );
378 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 + }
379 494
380 - if ($sort_by) {
381 - switch ($sort_by) {
382 - case "newer":
383 - $args['orderby'] = 'registered';
384 - $args['order'] = 'desc';
385 - break;
386 - case "older":
387 - $args['orderby'] = 'registered';
388 - $args['order'] = 'asc';
389 - break;
390 - case "alpha_asc":
391 - $args['orderby'] = 'display_name';
392 - $args['order'] = 'asc';
393 - break;
394 - case "alpha_desc":
395 - $args['orderby'] = 'display_name';
396 - $args['order'] = 'desc';
397 - break;
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 + );
398 503
399 - }
400 - }
504 + // Add exclude users if any
505 + if ( ! empty( $exclude_users ) ) {
506 + $args['exclude'] = $exclude_users;
507 + }
401 508
402 - $users_query = new WP_User_Query($args);
403 - $users = $users_query->get_results();
404 - $total_user = $users_query->get_total();
509 + // Add meta_key if specified
510 + if ( ! empty( $meta_key ) ) {
511 + $args['meta_key'] = $meta_key;
512 + }
405 513
406 - }
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 + }
407 525
408 - $total_pages=ceil($total_user/$number);
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();
409 530
410 - $layout_class = uwp_get_layout_class();
411 - ?>
412 - <ul class="uwp-users-list-wrap <?php echo $layout_class; ?>" id="uwp_user_items_layout">
413 - <?php
414 - if ($users) {
415 - foreach ($users as $user) {
416 - $user_obj = get_user_by('id', $user->ID);
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 + );
417 541
418 - // exclude logged in user
419 - $exclude_loggedin_user = apply_filters('uwp_users_list_exclude_loggedin_user', false);
420 - if ($exclude_loggedin_user) {
421 - if ($user_obj->ID == get_current_user_id()) {
422 - continue;
423 - }
424 - }
425 - ?>
426 - <li class="uwp-users-list-user">
427 - <div class="uwp-users-list-user-left">
428 - <?php do_action('uwp_users_profile_header', $user); ?>
429 - </div>
430 - <div class="uwp-users-list-user-right">
431 - <div class="uwp-users-list-user-name">
432 - <h3 class="uwp-user-title" data-user="<?php echo $user_obj->ID; ?>">
433 - <a href="<?php echo apply_filters('uwp_profile_link', get_author_posts_url($user_obj->ID), $user_obj->ID); ?>">
434 - <?php echo apply_filters('uwp_profile_display_name', $user_obj->display_name); ?>
435 - </a>
436 - <?php do_action('uwp_users_after_title', $user_obj->ID ); ?>
437 - </h3>
438 - </div>
439 - <div class="uwp-users-list-user-btns">
440 - <?php do_action('uwp_profile_buttons', $user_obj ); ?>
441 - </div>
442 - <div class="uwp-users-list-user-social">
443 - <?php do_action('uwp_profile_social', $user_obj ); ?>
444 - </div>
445 - <div class="uwp-users-list-extra">
446 - <?php do_action('uwp_users_extra', $user_obj ); ?>
447 - </div>
448 - <div class="clfx"></div>
449 - </div>
450 - </li>
451 - <?php
452 - }
453 - } else {
454 - // no users found
455 - echo '<div class="uwp-alert-error text-center">';
456 - echo __('No Users Found', 'userswp');
457 - echo '</div>';
458 - }
459 - ?>
460 - </ul>
542 + // Add exclude users if any
543 + if ( ! empty( $exclude_users ) ) {
544 + $args['exclude'] = $exclude_users;
545 + }
461 546
462 - <?php
463 - if ($total_pages > 1) {
464 - do_action('uwp_profile_pagination', $total_pages);
465 - }
466 - ?>
467 - <?php
468 -}
547 + // Filter by roles if specified
548 + if ( ! empty( $roles ) && is_array( $roles ) ) {
549 + $args['role__in'] = $roles;
550 + }
469 551
552 + // Add meta_key if specified
553 + if ( ! empty( $meta_key ) ) {
554 + $args['meta_key'] = $meta_key;
555 + }
470 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 + }
471 568
472 -/**
473 - * Loads the font-awesome css files.
474 - *
475 - * @since 1.0.0
476 - * @package userswp
477 - *
478 - * @return void
479 - */
480 -function uwp_load_font_awesome() {
481 - //load font awesome
482 - global $wp_styles;
483 - if ($wp_styles) {
484 - $srcs = array_map('basename', (array) wp_list_pluck($wp_styles->registered, 'src') );
485 - if ( in_array('font-awesome.css', $srcs) || in_array('font-awesome.min.css', $srcs) ) {
486 - /* echo 'font-awesome.css registered'; */
487 - } else {
488 - wp_register_style('font-awesome', '//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css', array(), null);
489 - wp_enqueue_style('font-awesome');
490 - }
491 - } else {
492 - wp_register_style('font-awesome', '//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css', array(), null);
493 - wp_enqueue_style('font-awesome');
494 - }
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;
495 576 }
496 577
497 578 /**
498 - * Gets the custom field info for given key.
579 + * Returns the Users page layout class based on the setting.
499 580 *
500 581 * @since 1.0.0
501 582 * @package userswp
502 583 *
503 - * @param string $htmlvar_name Custom field key.
504 - *
505 - * @return object Field info.
584 + * @return string Layout class.
506 585 */
507 -function uwp_get_custom_field_info($htmlvar_name) {
508 - global $wpdb;
509 - $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
510 - $field = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $table_name . " WHERE htmlvar_name = %s", array($htmlvar_name)));
511 - return $field;
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
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 + }
514 628
629 + if ($count_only) {
630 + return $col_count;
631 + }
515 632
516 -/**
517 - * Returns the Users page layout class based on the setting.
518 - *
519 - * @since 1.0.0
520 - * @package userswp
521 - *
522 - * @return string Layout class.
523 - */
524 -function uwp_get_layout_class() {
525 - $default_layout = uwp_get_option('users_default_layout', 'list');
526 - switch ($default_layout) {
527 - case "list":
528 - $class = "uwp_listview";
529 - break;
530 - case "2col":
531 - $class = "uwp_gridview uwp_gridview_2col";
532 - break;
533 - case "3col":
534 - $class = "uwp_gridview uwp_gridview_3col";
535 - break;
536 - case "4col":
537 - $class = "uwp_gridview uwp_gridview_4col";
538 - break;
539 - case "5col":
540 - $class = "uwp_gridview uwp_gridview_5col";
541 - break;
542 - default:
543 - $class = "uwp_listview";
544 - }
633 + if (uwp_get_option("design_style", 'bootstrap')) {
634 + return $bs_class;
635 + }
545 636
546 - return $class;
637 + return $class;
547 638 }
548 639
549 -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);
550 641
642 +add_filter('get_user_option_metaboxhidden_nav-menus', 'uwp_always_nav_menu_visibility', 10, 3);
643 +
551 644 /**
552 645 * Filters nav menu visibility option value.
553 646 *
554 647 * @since 1.0.0
@@ -559,140 +652,17 @@
559 652 * @param WP_User $user WP_User object of the user whose option is being retrieved.
560 653 *
561 654 * @return array Filtered value.
562 655 */
563 -function uwp_always_nav_menu_visibility( $result, $option, $user )
656 +function uwp_always_nav_menu_visibility($result, $option, $user)
564 657 {
565 - if( is_array($result) && in_array( 'add-users-wp-nav-menu', $result ) ) {
566 - $result = array_diff( $result, array( 'add-users-wp-nav-menu' ) );
567 - }
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 + }
568 661
569 - return $result;
662 + return $result;
570 663 }
571 664
572 -add_filter('user_profile_picture_description', 'uwp_admin_user_profile_picture_description');
573 -
574 -/**
575 - * Filters the user profile picture description displayed under the Gravatar.
576 - *
577 - * @since 1.0.0
578 - * @package userswp
579 - *
580 - * @param string $description Profile picture description.
581 - *
582 - * @return string Modified description.
583 - */
584 -function uwp_admin_user_profile_picture_description($description) {
585 - if (is_admin() && IS_PROFILE_PAGE) {
586 - $user_id = get_current_user_id();
587 - $avatar = uwp_get_usermeta($user_id, 'uwp_account_avatar_thumb', '');
588 -
589 - if (!empty($avatar)) {
590 - $description = sprintf( __( 'You can change your profile picture on your <a href="%s">Profile Page</a>.', 'userswp' ),
591 - uwp_build_profile_tab_url( $user_id ));
592 - }
593 -
594 - }
595 - return $description;
596 -}
597 -
598 -/**
599 - * Adds avatar and banner fields in admin side.
600 - *
601 - * @since 1.0.0
602 - * @package userswp
603 - *
604 - * @param object $user User object.
605 - *
606 - * @return void
607 - */
608 -function uwp_admin_edit_banner_fields($user) {
609 - global $wpdb;
610 -
611 - $file_obj = new UsersWP_Files();
612 -
613 - $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
614 - $fields = $wpdb->get_results("SELECT * FROM " . $table_name . " WHERE (form_type = 'avatar' OR form_type = 'banner') ORDER BY sort_order ASC");
615 - if ($fields) {
616 - ?>
617 - <div class="uwp-profile-extra uwp_page">
618 - <?php do_action('uwp_admin_profile_edit', $user ); ?>
619 - <table class="uwp-profile-extra-table form-table">
620 - <?php
621 - foreach ($fields as $field) {
622 -
623 - // Icon
624 - $icon = uwp_get_field_icon( $field->field_icon );
625 -
626 - if ($field->field_type == 'fieldset') {
627 - ?>
628 - <tr style="margin: 0; padding: 0">
629 - <th class="uwp-profile-extra-key" style="margin: 0; padding: 0"><h3 style="margin: 10px 0;">
630 - <?php echo $icon.$field->site_title; ?></h3></th>
631 - <td></td>
632 - </tr>
633 - <?php
634 - } else { ?>
635 - <tr>
636 - <th class="uwp-profile-extra-key"><?php echo $icon.$field->site_title; ?></th>
637 - <td class="uwp-profile-extra-value">
638 - <?php
639 - if ($field->htmlvar_name == "uwp_avatar_file") {
640 - $value = uwp_get_usermeta($user->ID, "uwp_account_avatar_thumb", "");
641 - } elseif ($field->htmlvar_name == "uwp_banner_file") {
642 - $value = uwp_get_usermeta($user->ID, "uwp_account_banner_thumb", "");
643 - } else {
644 - $value = "";
645 - }
646 - ?>
647 - <?php echo $file_obj->uwp_file_upload_preview($field, $value); ?>
648 - <?php
649 - if ($field->htmlvar_name == "uwp_avatar_file") {
650 - if (!empty($value)) {
651 - ?>
652 - <a class="uwp-profile-modal-form-trigger" data-type="avatar" href="#">
653 - <?php echo __("Change Avatar", "userswp"); ?>
654 - </a>
655 - <?php
656 - } else {
657 - ?>
658 - <a class="uwp-profile-modal-form-trigger" data-type="avatar" href="#">
659 - <?php echo __("Upload Avatar", "userswp"); ?>
660 - </a>
661 - <?php
662 - }
663 - } elseif ($field->htmlvar_name == "uwp_banner_file") {
664 - if (!empty($value)) {
665 - ?>
666 - <a class="uwp-profile-modal-form-trigger" data-type="banner" href="#">
667 - <?php echo __("Change Banner", "userswp"); ?>
668 - </a>
669 - <?php
670 - } else {
671 - ?>
672 - <a class="uwp-profile-modal-form-trigger" data-type="banner" href="#">
673 - <?php echo __("Upload Banner", "userswp"); ?>
674 - </a>
675 - <?php
676 - }
677 - }
678 - ?>
679 - </td>
680 - </tr>
681 - <?php
682 - }
683 - }
684 - ?>
685 - </table>
686 - </div>
687 - <?php
688 - }
689 -}
690 -//add_action('show_user_profile', 'uwp_admin_edit_banner_fields');
691 -//add_action('edit_user_profile', 'uwp_admin_edit_banner_fields');
692 -
693 -
694 -
695 665 // Privacy
696 666 add_filter('uwp_account_page_title', 'uwp_account_privacy_page_title', 10, 2);
697 667
698 668 /**
@@ -703,103 +673,26 @@
703 673 *
704 674 * @param string $title Privacy title.
705 675 * @param string $type Tab type.
706 676 *
707 - * @return string|void Title.
677 + * @return string Title.
708 678 */
709 -function uwp_account_privacy_page_title($title, $type) {
710 - if ($type == 'privacy') {
711 - $title = __( 'Privacy', 'userswp' );
712 - }
679 +function uwp_account_privacy_page_title($title, $type)
680 +{
713 681
714 - return $title;
715 -}
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 + }
716 693
717 -add_action('uwp_account_form_display', 'uwp_account_privacy_edit_form_display');
718 -
719 -/**
720 - * Adds form html for privacy fields in account page.
721 - *
722 - * @since 1.0.0
723 - * @package userswp
724 - *
725 - * @param string $type Form type.
726 - *
727 - * @return void
728 - */
729 -function uwp_account_privacy_edit_form_display($type) {
730 - if ($type == 'privacy') {
731 - $make_profile_private = uwp_can_make_profile_private();
732 - echo '<div class="uwp-account-form uwp_wc_form">';
733 - $extra_where = "AND is_public='2'";
734 - $fields = get_account_form_fields($extra_where);
735 - $fields = apply_filters('uwp_account_privacy_fields', $fields);
736 - $user_id = get_current_user_id();
737 - ?>
738 - <div class="uwp-profile-extra">
739 - <div class="uwp-profile-extra-div form-table">
740 - <form class="uwp-account-form uwp_form" method="post">
741 - <?php if ($fields) { ?>
742 - <div class="uwp-profile-extra-wrap">
743 - <div class="uwp-profile-extra-key" style="font-weight: bold;">
744 - <?php echo __("Field", "userswp") ?>
745 - </div>
746 - <div class="uwp-profile-extra-value" style="font-weight: bold;">
747 - <?php echo __("Is Public?", "userswp") ?>
748 - </div>
749 - </div>
750 - <?php foreach ($fields as $field) { ?>
751 - <div class="uwp-profile-extra-wrap">
752 - <div class="uwp-profile-extra-key"><?php echo $field->site_title; ?>
753 - <span class="uwp-profile-extra-sep">:</span></div>
754 - <div class="uwp-profile-extra-value">
755 - <?php
756 - $field_name = $field->htmlvar_name . '_privacy';
757 - $value = uwp_get_usermeta($user_id, $field_name, false);
758 - if ($value === false) {
759 - $value = 'yes';
760 - }
761 - ?>
762 - <select name="<?php echo $field_name; ?>" class="uwp_privacy_field"
763 - style="margin: 0;">
764 - <option value="no" <?php selected($value, "no"); ?>><?php echo __("No", "userswp") ?></option>
765 - <option value="yes" <?php selected($value, "yes"); ?>><?php echo __("Yes", "userswp") ?></option>
766 - </select>
767 - </div>
768 - </div>
769 - <?php }
770 - }
771 - $value = get_user_meta($user_id, 'uwp_hide_from_listing', true); ?>
772 - <div class="uwp-profile-extra-wrap">
773 - <div id="uwp_hide_from_listing" class="uwp_hide_from_listing">
774 - <input name="uwp_hide_from_listing" class="" <?php checked($value, "1", true); ?> type="checkbox" value="1"><?php _e('Hide profile from the users listing page.'); ?>
775 - </div>
776 - </div>
777 - <?php
778 - do_action('uwp_after_privacy_form_fields', $fields);
779 - if ($make_profile_private) {
780 - $field_name = 'uwp_make_profile_private';
781 - $value = get_user_meta($user_id, $field_name, true);
782 - if ($value === false) {
783 - $value = '0';
784 - }
785 - ?>
786 - <div id="uwp_make_profile_private" class=" uwp_make_profile_private_row">
787 - <input type="hidden" name="uwp_make_profile_private" value="0">
788 - <input name="uwp_make_profile_private" class="" <?php checked( $value, "1", true ); ?> type="checkbox" value="1">
789 - <?php _e( 'Make the whole profile private', 'userswp' ); ?>
790 - </div>
791 - <?php
792 - }
793 - ?>
794 - <input type="hidden" name="uwp_privacy_nonce" value="<?php echo wp_create_nonce( 'uwp-privacy-nonce' ); ?>" />
795 - <input name="uwp_privacy_submit" value="<?php echo __( 'Submit', 'userswp' ); ?>" type="submit">
796 - </form>
797 - </div>
798 - </div>
799 - <?php
800 - echo '</div>';
801 - }
694 + return $title;
802 695 }
803 696
804 697 add_action('uwp_account_menu_display', 'uwp_add_account_menu_links');
805 698
@@ -810,60 +703,72 @@
810 703 * @package userswp
811 704 *
812 705 * @return void
813 706 */
814 -function uwp_add_account_menu_links() {
707 +function uwp_add_account_menu_links()
708 +{
709 + global $aui_bs5;
815 710
816 - if (isset($_GET['type'])) {
817 - $type = strip_tags(esc_sql($_GET['type']));
818 - } else {
819 - $type = 'account';
820 - }
711 + if (isset($_GET['type'])) {
712 + $type = strip_tags(esc_sql($_GET['type']));
713 + } else {
714 + $type = 'account';
715 + }
821 716
822 - $account_page = uwp_get_option('account_page', false);
823 - $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);
824 719
825 - $account_available_tabs = uwp_account_get_available_tabs();
720 + $account_available_tabs = uwp_account_get_available_tabs();
826 721
827 - if (!is_array($account_available_tabs) && count($account_available_tabs) > 0) {
828 - return;
829 - }
722 + if (!is_array($account_available_tabs) && count($account_available_tabs) > 0) {
723 + return;
724 + }
830 725
831 - 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) {
832 732
833 - 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 + }
834 740
835 - if ($tab_id == 'account') {
836 - $tab_url = $account_page_link;
837 - } else {
838 - $tab_url = add_query_arg(array(
839 - 'type' => $tab_id,
840 - ), $account_page_link);
841 - }
741 + if (isset($tab['link'])) {
742 + $tab_url = $tab['link'];
743 + }
842 744
843 - if (isset($tab['link'])) {
844 - $tab_url = $tab['link'];
845 - }
745 + $active = $type == $tab_id ? ' active' : '';
846 746
847 - $active = $type == $tab_id ? ' active' : '';
848 - ?>
849 - <li id="uwp-account-<?php echo $tab_id; ?>">
850 - <a class="<?php echo $active; ?>" href="<?php echo esc_url( $tab_url ); ?>">
851 - <i class="<?php echo $tab['icon']; ?>"></i> <?php echo $tab['title']; ?>
852 - </a>
853 - </li>
854 - <?php
855 - }
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
856 752
857 - $template = new UsersWP_Templates();
858 - $logout_url = $template->uwp_logout_url();
859 - echo '<li id="uwp-account-logout"><a class="uwp-account-logout-link" href="'.$logout_url.'"><i class="fa fa-sign-out"></i>'.__('Logout', 'userswp').'</a></li>';
860 - 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 + }
861 769 }
862 770
863 -
864 -
865 -
866 771 /**
867 772 * Updates extras fields sort order.
868 773 *
869 774 * @since 1.0.0
@@ -870,37 +775,38 @@
870 775 * @package userswp
871 776 *
872 777 * @param array $field_ids Form extras field ids.
873 778 * @param string $form_type Form type.
779 + * @param int $form_id Form ID.
874 780 *
875 781 * @return array|bool Sorted field ids.
876 782 */
877 -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)
878 784 {
879 - global $wpdb;
880 - $extras_table_name = uwp_get_table_prefix() . 'uwp_form_extras';
785 + global $wpdb;
786 + $extras_table_name = uwp_get_table_prefix() . 'uwp_form_extras';
881 787
882 - $count = 0;
883 - if (!empty($field_ids)):
884 - foreach ($field_ids as $id) {
788 + $count = 0;
789 + if (!empty($field_ids)):
790 + foreach ($field_ids as $id) {
885 791
886 - $cf = trim($id, '_');
792 + $cf = trim($id, '_');
887 793
888 - $wpdb->query(
889 - $wpdb->prepare(
890 - "update " . $extras_table_name . " set
891 - sort_order=%d
892 - where id= %d",
893 - array($count, $cf)
894 - )
895 - );
896 - $count++;
897 - }
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 + );
898 801
899 - return $field_ids;
900 - else:
901 - return false;
902 - endif;
802 + $count++;
803 + }
804 +
805 + return $field_ids;
806 + else:
807 + return false;
808 + endif;
903 809 }
904 810
905 811 /**
906 812 * Uppercase the first character of each word in a string.
@@ -912,14 +818,15 @@
912 818 * @param string $charset Charset.
913 819 *
914 820 * @return string Converted string.
915 821 */
916 -function uwp_ucwords($string, $charset='UTF-8') {
917 - if (function_exists('mb_convert_case')) {
918 - return mb_convert_case($string, MB_CASE_TITLE, $charset);
919 - } else {
920 - return ucwords($string);
921 - }
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 + }
922 829 }
923 830
924 831 /**
925 832 * Checks whether the column exists in the table.
@@ -933,10 +840,10 @@
933 840 * @return bool
934 841 */
935 842 function uwp_column_exist($db, $column)
936 843 {
937 - $table = new UsersWP_Tables();
938 - $table->column_exists($db, $column);
844 + $table = new UsersWP_Tables();
845 + return $table->column_exists($db, $column);
939 846 }
940 847
941 848 /**
942 849 * Adds column if not exist in the table.
@@ -951,11 +858,10 @@
951 858 * @return bool|int True when success.
952 859 */
953 860 function uwp_add_column_if_not_exist($db, $column, $column_attr = "VARCHAR( 255 ) NOT NULL")
954 861 {
955 - $table = new UsersWP_Tables();
956 - $table->add_column_if_not_exist($db, $column, $column_attr);
957 -
862 + $table = new UsersWP_Tables();
863 + return $table->add_column_if_not_exist($db, $column, $column_attr);
958 864 }
959 865
960 866 /**
961 867 * Returns excluded custom fields.
@@ -964,14 +870,16 @@
964 870 * @package userswp
965 871 *
966 872 * @return array Excluded custom fields.
967 873 */
968 -function uwp_get_excluded_fields() {
969 - $excluded = array(
970 - 'uwp_account_password',
971 - 'uwp_account_confirm_password',
972 - );
973 - 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);
974 882 }
975 883
976 884 /**
977 885 * Formats the currency using currency separator.
@@ -983,50 +891,61 @@
983 891 * @param array|string $cf Custom field info.
984 892 *
985 893 * @return string Formatted currency.
986 894 */
987 -function uwp_currency_format_number($number='',$cf=''){
895 +function uwp_currency_format_number($number = '', $cf = '')
896 +{
988 897
989 - $cs = isset($cf['extra_fields']) ? maybe_unserialize($cf['extra_fields']) : '';
898 + $cs = isset($cf['extra_fields']) ? maybe_unserialize($cf['extra_fields']) : '';
990 899
991 - $symbol = isset($cs['currency_symbol']) ? $cs['currency_symbol'] : '$';
992 - $decimals = isset($cf['decimal_point']) && $cf['decimal_point'] ? $cf['decimal_point'] : 2;
993 - $decimal_display = isset($cf['decimal_display']) && $cf['decimal_display'] ? $cf['decimal_display'] : 'if';
994 - $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 = '.';
995 904
996 - if(isset($cs['decimal_separator']) && $cs['decimal_separator']=='comma'){
997 - $decimalpoint = ',';
998 - }
905 + if (isset($cs['decimal_separator']) && $cs['decimal_separator'] == 'comma') {
906 + $decimalpoint = ',';
907 + }
999 908
1000 - $separator = ',';
909 + $separator = ',';
1001 910
1002 - if(isset($cs['thousand_separator'])){
1003 - if($cs['thousand_separator']=='comma'){$separator = ',';}
1004 - if($cs['thousand_separator']=='slash'){$separator = '\\';}
1005 - if($cs['thousand_separator']=='period'){$separator = '.';}
1006 - if($cs['thousand_separator']=='space'){$separator = ' ';}
1007 - if($cs['thousand_separator']=='none'){$separator = '';}
1008 - }
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 + }
1009 928
1010 - $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';
1011 930
1012 - if($decimals>0 && $decimal_display=='if'){
1013 - if(is_int($number) || floor( $number ) == $number)
1014 - $decimals = 0;
1015 - }
931 + if ($decimals > 0 && $decimal_display == 'if') {
932 + if (is_int($number) || floor($number) == $number)
933 + $decimals = 0;
934 + }
1016 935
1017 - $number = number_format($number,$decimals,$decimalpoint,$separator);
936 + $number = number_format($number, $decimals, $decimalpoint, $separator);
1018 937
1019 938
1020 939
1021 - if($currency_symbol_placement=='left'){
1022 - $number = $symbol . $number;
1023 - }else{
1024 - $number = $number . $symbol;
1025 - }
940 + if ($currency_symbol_placement == 'left') {
941 + $number = $symbol . $number;
942 + } else {
943 + $number = $number . $symbol;
944 + }
1026 945
1027 946
1028 - return $number;
947 + return $number;
1029 948 }
1030 949
1031 950
1032 951 /**
@@ -1036,217 +955,83 @@
1036 955 * @package userswp
1037 956 *
1038 957 * @return bool
1039 958 */
1040 -function uwp_can_make_profile_private() {
1041 - $make_profile_private = apply_filters('uwp_user_can_make_profile_private', false);
1042 - 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;
1043 963 }
1044 964
1045 965 /**
1046 - * Returns available registration status options.
966 + * Returns the installation type.
1047 967 *
1048 968 * @since 1.0.0
1049 969 * @package userswp
1050 970 *
1051 - * @return array Registration status options.
971 + * @return string Installation type.
1052 972 */
1053 -function uwp_registration_status_options() {
1054 - $registration_options = array(
1055 - 'auto_approve' => __('Auto approve', 'userswp'),
1056 - 'auto_approve_login' => __('Auto approve + Auto Login', 'userswp'),
1057 - 'require_email_activation' => __('Require Email Activation', 'userswp'),
1058 - );
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 + }
1059 983
1060 - $registration_options = apply_filters('uwp_registration_status_options', $registration_options);
1061 -
1062 - 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 + }
1063 1004 }
1064 1005
1065 1006 /**
1066 - * Retrieves a user row based on password reset key and login
1007 + * Returns the table prefix based on the installation type.
1067 1008 *
1068 1009 * @since 1.0.0
1069 1010 * @package userswp
1070 1011 *
1071 - * @param string $key Hash to validate sending user's password.
1072 - * @param string $login The user login.
1073 - *
1074 - * @return WP_Error|WP_User User object.
1012 + * @return string Table prefix
1075 1013 */
1076 -function uwp_check_activation_key( $key, $login ) {
1077 - $user_data = check_password_reset_key( $key, $login );
1078 -
1079 - return $user_data;
1014 +function uwp_get_table_prefix()
1015 +{
1016 + $tables = new UsersWP_Tables();
1017 + return $tables->get_table_prefix();
1080 1018 }
1081 1019
1082 -
1083 -add_action('uwp_template_fields', 'uwp_template_fields_terms_check', 100, 1);
1084 -
1085 1020 /**
1086 - * Adds "Accept terms and conditions" checkbox in register form.
1087 - *
1088 - * @since 1.0.0
1089 - * @package userswp
1090 - *
1091 - * @param string $form_type Form type.
1092 - *
1093 - * @return void
1094 - */
1095 -function uwp_template_fields_terms_check($form_type) {
1096 - if ($form_type == 'register') {
1097 - $terms_page = false;
1098 - $reg_terms_page_id = uwp_get_option('register_terms_page', '');
1099 - $reg_terms_page_id = apply_filters('uwp_reg_terms_page_id', $reg_terms_page_id);
1100 - if (!empty($reg_terms_page_id)) {
1101 - $terms_page = get_permalink($reg_terms_page_id);
1102 - }
1103 - if ($terms_page) {
1104 - ?>
1105 - <div class="uwp-remember-me">
1106 - <label style="display: inline-block;font-weight: normal" for="agree_terms">
1107 - <input name="agree_terms" id="agree_terms" value="yes" type="checkbox">
1108 - <?php echo sprintf( __( 'I Accept <a href="%s" target="_blank">Terms and Conditions</a>.', 'userswp' ), $terms_page); ?>
1109 - </label>
1110 - </div>
1111 - <?php
1112 - }
1113 - }
1114 -}
1115 -
1116 -
1117 -
1118 -/**
1119 - * Redirects the user to login page when email not confirmed.
1120 - *
1121 - * @since 1.0.0
1122 - * @package userswp
1123 - *
1124 - * @param string $username Username.
1125 - * @param object $user User object.
1126 - *
1127 - * @return void
1128 - */
1129 -function uwp_unconfirmed_login_redirect( $username, $user ) {
1130 - if (!is_wp_error($user)) {
1131 - $mod_value = get_user_meta( $user->ID, 'uwp_mod', true );
1132 - if ($mod_value == 'email_unconfirmed') {
1133 - if ( !in_array( 'administrator', $user->roles ) ) {
1134 - $login_page = uwp_get_option('login_page', false);
1135 - if ($login_page) {
1136 - $redirect_to = add_query_arg(array('uwp_err' => 'act_pending'), get_permalink($login_page));
1137 - wp_destroy_current_session();
1138 - wp_clear_auth_cookie();
1139 - wp_redirect($redirect_to);
1140 - exit();
1141 - }
1142 - }
1143 - }
1144 - }
1145 -}
1146 -add_filter( 'wp_login', 'uwp_unconfirmed_login_redirect', 10, 2 );
1147 -
1148 -/**
1149 - * Adds notification menu in admin toolbar.
1150 - *
1151 - * @since 1.0.0
1152 - * @package userswp
1153 - *
1154 - * @return void
1155 - */
1156 -function uwp_notifications_toolbar_menu() {
1157 - global $wp_admin_bar;
1158 -
1159 - if ( ! is_user_logged_in() ) {
1160 - return;
1161 - }
1162 -
1163 - $available_counts = apply_filters('uwp_notifications_available_counts', array());
1164 -
1165 - if (count($available_counts) == 0) {
1166 - return;
1167 - }
1168 -
1169 - $total_count = 0;
1170 - foreach ($available_counts as $key => $value) {
1171 - $total_count = $total_count + $value;
1172 - }
1173 -
1174 -
1175 - $alert_class = (int) $total_count > 0 ? 'pending-count' : 'count';
1176 - $menu_title = '<span id="uwp-notification-count" class="' . $alert_class . '">'
1177 - . number_format_i18n( $total_count ) . '</span>';
1178 - $menu_link = '';
1179 -
1180 - // Add the top-level Notifications button.
1181 - $wp_admin_bar->add_menu( array(
1182 - 'parent' => 'top-secondary',
1183 - 'id' => 'uwp-notifications',
1184 - 'title' => $menu_title,
1185 - 'href' => $menu_link,
1186 - ) );
1187 -
1188 - do_action('uwp_notifications_items', $wp_admin_bar);
1189 -
1190 - return;
1191 -}
1192 -add_action( 'admin_bar_menu', 'uwp_notifications_toolbar_menu', 90 );
1193 -
1194 -/**
1195 - * Returns the installation type.
1196 - *
1197 - * @since 1.0.0
1198 - * @package userswp
1199 - *
1200 - * @return string Installation type.
1201 - */
1202 -function uwp_get_installation_type() {
1203 - // *. Single Site
1204 - if (!is_multisite()) {
1205 - return "single";
1206 - } else {
1207 - // Multisite
1208 - if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
1209 - require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
1210 - }
1211 -
1212 - // Network active.
1213 - if ( is_plugin_active_for_network( 'userswp/userswp.php' ) ) {
1214 - if (defined('UWP_ROOT_PAGES')) {
1215 - if (UWP_ROOT_PAGES == 'all') {
1216 - // *. Multisite - Network Active - Pages on all sites
1217 - return "multi_na_all";
1218 - } else {
1219 - // *. Multisite - Network Active - Pages on specific site
1220 - return "multi_na_site_id";
1221 - }
1222 - } else {
1223 - // Multi - network active - default
1224 - // *. Multisite - Network Active - Pages on main site
1225 - return "multi_na_default";
1226 - }
1227 - } else {
1228 - // * Multisite - Not network active
1229 - return "multi_not_na";
1230 - }
1231 - }
1232 -}
1233 -
1234 -/**
1235 1021 * Returns the table prefix based on the installation type.
1236 1022 *
1237 - * @since 1.0.0
1023 + * @since 1.0.16
1238 1024 * @package userswp
1239 1025 *
1240 1026 * @return string Table prefix
1241 1027 */
1242 -function uwp_get_table_prefix() {
1243 - $tables = new UsersWP_Tables();
1244 - return $tables->get_table_prefix();
1028 +function get_usermeta_table_prefix()
1029 +{
1030 + $tables = new UsersWP_Tables();
1031 + return $tables->get_usermeta_table_prefix();
1245 1032 }
1246 1033
1247 -
1248 -
1249 1034 /**
1250 1035 * Converts array to comma separated string.
1251 1036 *
1252 1037 *
@@ -1257,14 +1042,15 @@
1257 1042 * @param string $value Custom field value.
1258 1043 *
1259 1044 * @return string Converted custom field value string.
1260 1045 */
1261 -function uwp_maybe_serialize($key, $value) {
1262 - $field = uwp_get_custom_field_info($key);
1263 - if (isset($field->field_type) && $field->field_type == 'multiselect') {
1264 - $value = implode(",", $value);
1265 - }
1266 - 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;
1267 1053 }
1268 1054
1269 1055 /**
1270 1056 * Converts comma separated string to array.
@@ -1276,14 +1062,15 @@
1276 1062 * @param string $value Custom field value.
1277 1063 *
1278 1064 * @return array Converted custom field value array.
1279 1065 */
1280 -function uwp_maybe_unserialize($key, $value) {
1281 - $field = uwp_get_custom_field_info($key);
1282 - if (isset($field->field_type) && $field->field_type == 'multiselect') {
1283 - $value = explode(",", $value);
1284 - }
1285 - 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;
1286 1073 }
1287 1074
1288 1075 /**
1289 1076 * Creates UsersWP related tables.
@@ -1294,26 +1081,13 @@
1294 1081 * @return void
1295 1082 */
1296 1083 function uwp_create_tables()
1297 1084 {
1298 - $tables = new UsersWP_Tables();
1299 - $tables->uwp_create_tables();
1085 + $tables = new UsersWP_Tables();
1086 + $tables->create_tables();
1300 1087 }
1301 1088
1302 1089 /**
1303 - * Creates uwp_usermeta table which introduced in version 1.0.1
1304 - *
1305 - * @since 1.0.0
1306 - * @package userswp
1307 - *
1308 - * @return void
1309 - */
1310 -function uwp101_create_tables() {
1311 - $tables = new UsersWP_Tables();
1312 - $tables->uwp101_create_tables();
1313 -}
1314 -
1315 -/**
1316 1090 * Returns tye client IP.
1317 1091 *
1318 1092 * @since 1.0.0
1319 1093 * @package userswp
@@ -1319,20 +1093,21 @@
1319 1093 * @package userswp
1320 1094 *
1321 1095 * @return string IP address.
1322 1096 */
1323 -function uwp_get_ip() {
1324 - if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
1325 - //check ip from share internet
1326 - $ip = $_SERVER['HTTP_CLIENT_IP'];
1327 - } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
1328 - //to check ip is pass from proxy
1329 - $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
1330 - } else {
1331 - $ip = $_SERVER['REMOTE_ADDR'];
1332 - }
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 + }
1333 1108
1334 - return apply_filters('uwp_get_ip', $ip);
1109 + return apply_filters('uwp_get_ip', $ip);
1335 1110 }
1336 1111
1337 1112 /**
1338 1113 * Checks whether the string starts with the given string.
@@ -1346,10 +1121,10 @@
1346 1121 * @return bool True when success. False when failure.
1347 1122 */
1348 1123 function uwp_str_starts_with($haystack, $needle)
1349 1124 {
1350 - $length = strlen($needle);
1351 - return (substr($haystack, 0, $length) === $needle);
1125 + $length = strlen($needle);
1126 + return (substr($haystack, 0, $length) === $needle);
1352 1127 }
1353 1128
1354 1129 /**
1355 1130 * Checks whether the string ends with the given string.
@@ -1363,18 +1138,18 @@
1363 1138 * @return bool True when success. False when failure.
1364 1139 */
1365 1140 function uwp_str_ends_with($haystack, $needle)
1366 1141 {
1367 - $length = strlen($needle);
1368 - if ($length == 0) {
1369 - return true;
1370 - }
1142 + $length = strlen($needle);
1143 + if ($length == 0) {
1144 + return true;
1145 + }
1371 1146
1372 - return (substr($haystack, -$length) === $needle);
1147 + return (substr($haystack, -$length) === $needle);
1373 1148 }
1374 1149
1375 1150 /**
1376 - * Returns the font awesome icon value for field type.
1151 + * Returns the font awesome icon value for field type.
1377 1152 * Displayed in profile tabs.
1378 1153 *
1379 1154 * @since 1.0.0
1380 1155 * @package userswp
@@ -1382,30 +1157,30 @@
1382 1157 * @param string $type Field type.
1383 1158 *
1384 1159 * @return string Font awesome icon value.
1385 1160 */
1386 -function uwp_field_type_to_fa_icon($type) {
1387 - $field_types = array(
1388 - 'text' => 'fa fa-minus',
1389 - 'datepicker' => 'fa fa-calendar',
1390 - 'textarea' => 'fa fa-bars',
1391 - 'time' =>'fa fa-clock-o',
1392 - 'checkbox' =>'fa fa-check-square-o',
1393 - 'phone' =>'fa fa-phone',
1394 - 'radio' =>'fa fa-dot-circle-o',
1395 - 'email' =>'fa fa-envelope-o',
1396 - 'select' =>'fa fa-caret-square-o-down',
1397 - 'multiselect' =>'fa fa-caret-square-o-down',
1398 - 'url' =>'fa fa-link',
1399 - 'file' =>'fa fa-file'
1400 - );
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 + );
1401 1177
1402 - if (isset($field_types[$type])) {
1403 - return $field_types[$type];
1404 - } else {
1405 - return "";
1406 - }
1407 -
1178 + if (isset($field_types[$type])) {
1179 + return $field_types[$type];
1180 + } else {
1181 + return "";
1182 + }
1408 1183 }
1409 1184
1410 1185 /**
1411 1186 * Check wpml active or not.
@@ -1413,14 +1188,15 @@
1413 1188 * @since 1.0.7
1414 1189 *
1415 1190 * @return True if WPML is active else False.
1416 1191 */
1417 -function uwp_is_wpml() {
1418 - if (class_exists('SitePress') && function_exists('icl_object_id')) {
1419 - return true;
1420 - }
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 + }
1421 1197
1422 - return false;
1198 + return false;
1423 1199 }
1424 1200
1425 1201 /**
1426 1202 * Get the element in the WPML current language.
@@ -1436,26 +1212,914 @@
1436 1212 * the original if the translation is missing and $return_original_if_missing is set to TRUE.
1437 1213 *
1438 1214 * @return int|NULL
1439 1215 */
1440 -function uwp_wpml_object_id( $element_id, $element_type = 'post', $return_original_if_missing = false, $ulanguage_code = null ) {
1441 - if ( uwp_is_wpml() ) {
1442 - if ( function_exists( 'wpml_object_id_filter' ) ) {
1443 - return apply_filters( 'wpml_object_id', $element_id, $element_type, $return_original_if_missing, $ulanguage_code );
1444 - } else {
1445 - return icl_object_id( $element_id, $element_type, $return_original_if_missing, $ulanguage_code );
1446 - }
1447 - }
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 + }
1448 1225
1449 - return $element_id;
1226 + return $element_id;
1450 1227 }
1451 1228
1452 -function uwp_get_default_avatar_uri(){
1453 - $default = uwp_get_option('profile_default_profile', '');
1454 - if(empty($default)){
1455 - $default = USERSWP_PLUGIN_URL."public/assets/images/no_profile.png";
1456 - } else {
1457 - $default = wp_get_attachment_url($default);
1458 - }
1229 +/**
1230 + * Check if we might be on localhost.
1231 + *
1232 + * @return bool
1233 + */
1234 +function uwp_is_localhost()
1235 +{
1236 + $localhost = false;
1459 1237
1460 - return $default;
1461 -}
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 +}