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/class-forms.php +4897 -2220 1.0.201.2.74 View file →
@@ -1,5 +1,6 @@
1 1 <?php
2 +
2 3 /**
3 4 * Form related functions
4 5 *
5 6 * This class defines all code necessary to handle UsersWP forms like login. register etc.
@@ -8,2643 +9,5319 @@
8 9 * @author GeoDirectory Team <info@wpgeodirectory.com>
9 10 */
10 11 class UsersWP_Forms {
11 12
12 - protected $generated_password;
13 + protected $generated_password;
13 14
14 - /**
15 - * Initialize UsersWP notices.
16 - *
17 - * @since 1.0.0
18 - * @package userswp
19 - *
20 - * @return void
21 - */
22 - public function init_notices() {
23 - global $uwp_notices;
24 - $uwp_notices = array();
25 - }
15 + /**
16 + * Logs the error message.
17 + *
18 + * @param array|object|string $log Error message.
19 + *
20 + * @return void
21 + * @since 1.0.0
22 + * @package userswp
23 + *
24 + */
25 + public static function uwp_error_log( $log ) {
26 + uwp_error_log( $log );
27 + }
26 28
27 - /**
28 - * Handles all UsersWP forms.
29 - *
30 - * @since 1.0.0
31 - * @package userswp
32 - *
33 - * @return void
34 - */
35 - public function handler()
36 - {
37 - global $uwp_notices;
29 + /**
30 + * Initialize UsersWP notices.
31 + *
32 + * @return void
33 + * @package userswp
34 + *
35 + * @since 1.0.0
36 + */
37 + public function init_notices() {
38 + global $uwp_notices;
39 + $uwp_notices = array();
40 + }
38 41
39 - ob_start();
42 + /**
43 + * Handles all UsersWP forms.
44 + *
45 + * @return void
46 + * @package userswp
47 + *
48 + * @since 1.0.0
49 + */
50 + public function handler() {
51 + global $uwp_notices;
40 52
41 - $errors = null;
42 - $message = null;
43 - $redirect = false;
44 - $processed = false;
45 - $type = null;
53 + ob_start();
46 54
47 - $login_page_url = wp_login_url();
55 + $errors = null;
56 + $message = null;
57 + $redirect = false;
58 + $processed = false;
59 + $type = null;
48 60
49 - if (isset($_POST['uwp_register_nonce'])) {
50 - $auto_login = uwp_get_option('uwp_registration_action', false);
51 - $errors = $this->process_register($_POST, $_FILES);
52 - if (!is_wp_error($errors)) {
53 - $message = $errors;
54 - }
55 - $force_redirect = apply_filters('uwp_registration_force_redirect', false, $_POST, $_FILES);
56 - if ($auto_login == 'auto_approve_login' || $force_redirect) {
57 - $reg_redirect_page_id = uwp_get_option('register_redirect_to', '');
58 - if(isset( $_REQUEST['redirect_to'] )){
59 - $reg_redirect_to = esc_url($_REQUEST['redirect_to']);
60 - } elseif ( isset($reg_redirect_page_id) && (int)$reg_redirect_page_id > 0) {
61 - $reg_redirect_to = get_permalink($reg_redirect_page_id);
62 - } else {
63 - $reg_redirect_to = home_url('/');
64 - }
65 - $redirect = apply_filters('uwp_register_redirect', $reg_redirect_to);
66 - }
67 - $processed = true;
68 - $type = 'register';
69 - } elseif (isset($_POST['uwp_login_nonce'])) {
70 - $errors = $this->process_login($_POST);
71 - $redirect_page_id = uwp_get_option('login_redirect_to', -1);
72 - if (isset($redirect_page_id) && (int)$redirect_page_id > 0) {
73 - $redirect_to = get_permalink($redirect_page_id);
74 - } elseif(isset( $_REQUEST['redirect_to'] ) && !empty($data['redirect_to'])){
75 - $redirect_to = esc_url($_REQUEST['redirect_to']);
76 - } else {
77 - $redirect_to = home_url('/');
78 - }
79 - $redirect = apply_filters('uwp_login_redirect', $redirect_to);
80 - $processed = true;
81 - $type = 'login';
82 - } elseif (isset($_POST['uwp_forgot_nonce'])) {
83 - $errors = $this->process_forgot($_POST);
84 - $message = __('Please check your email.', 'userswp');
85 - $processed = true;
86 - } elseif (isset($_POST['uwp_change_nonce'])) {
87 - $errors = $this->process_change($_POST);
88 - $message = __('Password changed successfully', 'userswp');
89 - $processed = true;
90 - } elseif (isset($_POST['uwp_reset_submit'])) {
91 - $errors = $this->process_reset($_POST);
92 - $message = sprintf(__('Password updated successfully. Please <a href="%s">login</a> with your new password', 'userswp'), $login_page_url);
93 - $processed = true;
94 - } elseif (isset($_POST['uwp_account_nonce'])) {
95 - $errors = $this->process_account($_POST, $_FILES);
96 - $message = __('Account updated successfully.', 'userswp');
97 - $processed = true;
98 - } elseif (isset($_POST['uwp_avatar_submit'])) {
99 - $errors = $this->process_upload_submit($_POST, $_FILES, 'avatar');
100 - if (!is_wp_error($errors)) {
101 - $redirect = $errors;
102 - }
103 - $message = __('Avatar cropped successfully.', 'userswp');
104 - $processed = true;
105 - } elseif (isset($_POST['uwp_banner_submit'])) {
106 - $errors = $this->process_upload_submit($_POST, $_FILES, 'banner');
107 - if (!is_wp_error($errors)) {
108 - $redirect = $errors;
109 - }
110 - $message = __('Banner cropped successfully.', 'userswp');
111 - $processed = true;
112 - } elseif (isset($_POST['uwp_avatar_crop'])) {
113 - $errors = $this->process_image_crop($_POST, 'avatar', true);
114 - if (!is_wp_error($errors)) {
115 - $redirect = $errors;
116 - }
117 - $message = __('Avatar cropped successfully.', 'userswp');
118 - $processed = true;
119 - } elseif (isset($_POST['uwp_banner_crop'])) {
120 - $errors = $this->process_image_crop($_POST, 'banner', true);
121 - if (!is_wp_error($errors)) {
122 - $redirect = $errors;
123 - }
124 - $message = __('Banner cropped successfully.', 'userswp');
125 - $processed = true;
61 + if ( isset( $_POST['uwp_avatar_submit'] ) ) {
62 + $errors = $this->process_upload_submit( $_POST, $_FILES, 'avatar' );
63 + if ( ! is_wp_error( $errors ) ) {
64 + $redirect = $errors;
65 + }
66 + $message = __( 'Avatar cropped successfully.', 'userswp' );
67 + $processed = true;
68 + } elseif ( isset( $_POST['uwp_banner_submit'] ) ) {
69 + $errors = $this->process_upload_submit( $_POST, $_FILES, 'banner' );
70 + if ( ! is_wp_error( $errors ) ) {
71 + $redirect = $errors;
72 + }
73 + $message = __( 'Banner cropped successfully.', 'userswp' );
74 + $processed = true;
75 + } elseif ( isset( $_POST['uwp_avatar_crop'] ) ) {
76 + $errors = $this->process_image_crop( $_POST, 'avatar', true );
77 + if ( ! is_wp_error( $errors ) ) {
78 + $redirect = $errors;
79 + }
80 + $message = __( 'Avatar cropped successfully.', 'userswp' );
81 + $processed = true;
82 + } elseif ( isset( $_POST['uwp_banner_crop'] ) ) {
83 + $errors = $this->process_image_crop( $_POST, 'banner', true );
84 + if ( ! is_wp_error( $errors ) ) {
85 + $redirect = $errors;
86 + }
87 + $message = __( 'Banner cropped successfully.', 'userswp' );
88 + $processed = true;
89 + } elseif ( isset( $_POST['uwp_avatar_reset'] ) ) {
90 + $errors = $this->process_image_reset( 'avatar' );
91 + if ( ! is_wp_error( $errors ) ) {
92 + $redirect = $errors;
93 + }
94 + $message = __( 'Avatar reset successfully.', 'userswp' );
95 + $processed = true;
96 + } elseif ( isset( $_POST['uwp_banner_reset'] ) ) {
97 + $errors = $this->process_image_reset( 'banner' );
98 + if ( ! is_wp_error( $errors ) ) {
99 + $redirect = $errors;
100 + }
101 + $message = __( 'Banner reset successfully.', 'userswp' );
102 + $processed = true;
103 + }
104 +
105 + if ( $processed ) {
106 + if ( is_wp_error( $errors ) ) {
107 + aui()->alert(
108 + array(
109 + 'type' => 'error',
110 + 'content' => wp_kses_post( $errors->get_error_message() )
111 + ),
112 + true
113 + );
114 + } else if ( $redirect ) {
115 + wp_safe_redirect( $redirect );
116 + exit();
117 + } else {
118 + aui()->alert(
119 + array(
120 + 'type' => 'success',
121 + 'content' => wp_kses_post( $message )
122 + ),
123 + true
124 + );
125 + }
126 + }
127 +
128 + if ( $type ) {
129 + $uwp_notices[] = array( $type => ob_get_contents() );
130 + } else {
131 + $uwp_notices[] = ob_get_contents();
132 + }
133 +
134 + ob_end_clean();
135 + }
136 +
137 + /**
138 + * Processes avatar and banner uploads form submission.
139 + *
140 + * @param array $data Submitted $_POST data
141 + * @param array $files Submitted $_FILES data
142 + *
143 + * @return bool|WP_Error|string File url to crop.
144 + * @package userswp
145 + *
146 + * @since 1.0.0
147 + */
148 + public function process_upload_submit( $data = array(), $files = array(), $type = 'avatar' ) {
149 +
150 + $file_obj = new UsersWP_Files();
151 +
152 + $current_user_id = get_current_user_id();
153 + if ( ! $current_user_id ) {
154 + return false;
155 + }
156 +
157 + if ( ! isset( $data['uwp_upload_nonce'] ) || ! wp_verify_nonce( $data['uwp_upload_nonce'], 'uwp-upload-nonce' ) ) {
158 + return false;
159 + }
160 +
161 + do_action( 'uwp_before_validate', $type );
162 +
163 + $result = $file_obj->validate_uploads( $files, $type );
164 +
165 + $result = apply_filters( 'uwp_validate_result', $result, $type, $data );
166 +
167 + if ( is_wp_error( $result ) ) {
168 + return $result;
169 + }
170 +
171 + $profile_url = uwp_build_profile_tab_url( $current_user_id );
172 +
173 + $url = add_query_arg(
174 + array(
175 + 'uwp_crop' => $result[ 'uwp_' . $type . '_file' ],
176 + 'type' => $type,
177 + ),
178 + $profile_url
179 + );
180 +
181 + return $url;
182 + }
183 +
184 + /**
185 + * Processes avatar and banner uploads image crop.
186 + *
187 + * @param array $data Submitted $_POST data
188 + * @param string $type Image type. Default 'avatar'.
189 + * @param bool $unlink_prev_img True to remove previous image. Default false;
190 + *
191 + * @return bool|WP_Error|string Profile url.
192 + * @since 1.0.12 New param $unlink_prev_img introduced.
193 + * @package userswp
194 + *
195 + * @since 1.0.0
196 + */
197 + public function process_image_crop( $data = array(), $type = 'avatar', $unlink_prev_img = false ) {
198 + global $wpdb;
199 +
200 + if ( ! is_user_logged_in() ) {
201 + return false;
202 + }
203 +
204 + if ( empty( $_POST['uwp_crop_nonce'] ) || ! wp_verify_nonce( $_POST['uwp_crop_nonce'], 'uwp_crop_nonce_' . $type ) ) {
205 + return;
206 + }
207 +
208 + $image_url = ! empty( $data['uwp_crop'] ) ? esc_url( $data['uwp_crop'] ) : '';
209 +
210 + if ( empty( $image_url ) ) {
211 + return new WP_Error( 'empty_image', __( 'Upload valid image.', 'userswp' ) );
212 + }
213 +
214 + // Ensure we have a valid URL with an allowed meme type.
215 + $image_url = $this->normalize_url( $image_url );
216 +
217 + $content_url = str_replace( array( 'https://', 'http://' ) , '', untrailingslashit( WP_CONTENT_URL ) );
218 + $_image_url = str_replace( array( 'https://', 'http://' ), '', $image_url );
219 + if ( strpos( $_image_url, $content_url ) !== 0 ) {
220 + return new WP_Error( 'invalid_image', __( 'Invalid image url.', 'userswp' ) );
221 + }
222 +
223 + $filetype = wp_check_filetype( $image_url );
224 +
225 + if ( empty( $filetype['ext'] ) ) {
226 + return new WP_Error( 'invalid_image', __( 'Invalid image type.', 'userswp' ) );
227 + }
228 +
229 + // If is current user's profile (profile.php)
230 + if ( is_admin() && defined( 'IS_PROFILE_PAGE' ) && IS_PROFILE_PAGE ) {
231 + $user_id = get_current_user_id();
232 + // If is another user's profile page
233 + } elseif ( is_admin() && current_user_can( 'manage_options' ) && ! empty( $_GET['user_id'] ) && is_numeric( $_GET['user_id'] ) ) {
234 + $user_id = absint( $_GET['user_id'] );
235 + // Otherwise something is wrong.
236 + } else {
237 + $user_id = get_current_user_id();
238 + }
239 +
240 + // Retrieve current thumbnail.
241 + $current_field = 'avatar' === $type ? 'avatar_thumb' : 'banner_thumb';
242 + $current_thumbnail = $this->normalize_url( uwp_get_usermeta( $user_id, $current_field, '' ) );
243 + $thumb_postfix = '_uwp_' . $type . '_thumb';
244 +
245 + if ( $image_url ) {
246 + if ( $type == 'avatar' ) {
247 + $avatar_size = uwp_get_upload_image_size();
248 + $full_width = $avatar_size['width'];
249 + } else {
250 + $banner_size = uwp_get_upload_image_size( 'banner' );
251 + $full_width = $banner_size['width'];
252 + }
253 +
254 + add_filter( 'upload_dir', 'uwp_handle_multisite_profile_image', 10, 1 );
255 + $uploads = wp_upload_dir();
256 + remove_filter( 'upload_dir', 'uwp_handle_multisite_profile_image' );
257 + $upload_url = $uploads['baseurl'];
258 + $upload_path = $uploads['basedir'];
259 + $image_path = str_replace( $upload_url, $upload_path, $image_url );
260 + $ext = $filetype['ext']; // to get extension
261 + $name = sanitize_file_name( pathinfo( $image_path, PATHINFO_FILENAME ) ); //file name without extension
262 + $thumb_image_name = $name . $thumb_postfix . '.' . $ext;
263 + $thumb_image_location = str_replace( $name . '.' . $ext, $thumb_image_name, $image_path );
264 +
265 + //Get the new coordinates to crop the image.
266 + $x = $data['uwpx'];
267 + $y = $data['uwpy'];
268 + $w = $data['uwpw'];
269 + $h = $data['uwph'];
270 + //Scale the image based on cropped width setting
271 + $scale = $full_width / $w;
272 + //$scale = 1; // no scaling
273 +
274 + // check we are not editing another user file
275 + $db_value = trailingslashit( $uploads['subdir'] ) . $thumb_image_name;
276 + $meta_table = get_usermeta_table_prefix() . 'uwp_usermeta';
277 + $file_exists = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$meta_table} WHERE ( `avatar_thumb` = %s OR `banner_thumb` = %s ) ", $db_value, $db_value ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
278 +
279 + // if file already exists then we should not be cropping it.
280 + if ( $file_exists ) {
281 + wp_die( esc_html__( 'Something went wrong. Please contact site admin.', 'userswp' ), 403 );
282 + }
283 +
284 + $cropped = uwp_resizeThumbnailImage( $thumb_image_location, $image_path, $x, $y, $w, $h, $scale );
285 + $cropped = str_replace( $upload_path, $upload_url, $cropped );
286 +
287 + // Remove previous avatar/banner
288 + $unlink_img = '';
289 + if ( $unlink_prev_img && $current_thumbnail ) {
290 + $unlink_img = untrailingslashit( $upload_path ) . '/' . ltrim( $current_thumbnail, '/' );
291 + }
292 +
293 + // remove the uploads path for easy migrations
294 + $cropped = str_replace( $upload_url, '', $cropped );
295 + if ( $type == 'avatar' ) {
296 + uwp_update_usermeta( $user_id, 'avatar_thumb', $cropped );
297 + } else {
298 + uwp_update_usermeta( $user_id, 'banner_thumb', $cropped );
299 + }
300 +
301 + if ( $unlink_img && $unlink_img != $thumb_image_location && is_file( $unlink_img ) && file_exists( $unlink_img ) ) {
302 + @unlink( $unlink_img );
303 + $unlink_ori_img = str_replace( '_uwp_' . $type . '_thumb' . '.', '.', $unlink_img );
304 + if ( is_file( $unlink_ori_img ) && file_exists( $unlink_ori_img ) ) {
305 + @unlink( $unlink_ori_img );
306 + }
307 + }
308 + }
309 +
310 + if ( is_admin() ) {
311 + if ( $user_id == get_current_user_id() ) {
312 + $redirect_url = admin_url( 'profile.php' );
313 + } else {
314 + $redirect_url = admin_url( 'user-edit.php?user_id=' . $user_id );
315 + }
316 + } elseif ( uwp_current_page_url() ) {
317 + $redirect_url = uwp_current_page_url();
318 + } else {
319 + $redirect_url = uwp_build_profile_tab_url( $user_id );
320 + }
321 +
322 + return $redirect_url;
323 + }
324 +
325 + /**
326 + * Normalizes a URL.
327 + *
328 + */
329 + public function normalize_url( $url ) {
330 +
331 + if ( empty( $url ) ) {
332 + return '';
126 333 }
334 + // Normalize.
335 + $url = wp_normalize_path( $url );
127 336
128 - if ($processed) {
129 - if (is_wp_error($errors)) {
130 - echo '<div class="uwp-alert-error text-center">';
131 - echo $errors->get_error_message();
132 - echo '</div>';
133 - } else {
134 - if ($redirect) {
135 - wp_safe_redirect($redirect);
136 - exit();
137 - } else {
138 - echo '<div class="uwp-alert-success text-center">';
139 - echo $message;
140 - echo '</div>';
141 - }
337 + // Remove query vars.
338 + $url = strtok( $url, '?' );
339 +
340 + // Split.
341 + $url = explode( '/', $url );
342 +
343 + // Clean.
344 + $url = array_diff( $url, array( '..', '.' ) );
345 +
346 + // Rejoin and return.
347 + return implode( '/', $url );
348 + }
349 +
350 + /**
351 + * Processes avatar and banner image reset.
352 + *
353 + * @param string $type Image type. Default 'avatar'.
354 + *
355 + * @return bool|WP_Error|string Profile url.
356 + * @package userswp
357 + *
358 + */
359 + public function process_image_reset( $type ) {
360 + if ( ! is_user_logged_in() ) {
361 + return false;
362 + }
363 +
364 + if ( is_admin() && defined( 'IS_PROFILE_PAGE' ) && IS_PROFILE_PAGE ) {
365 + $user_id = get_current_user_id();
366 + } elseif ( is_admin() && current_user_can( 'manage_options' ) && ! empty( $_GET['user_id'] ) && is_numeric( $_GET['user_id'] ) ) {
367 + $user_id = absint( $_GET['user_id'] );
368 + } else {
369 + $user_id = get_current_user_id();
370 + }
371 +
372 + if ( empty( $_POST['uwp_reset_nonce'] ) || ! wp_verify_nonce( $_POST['uwp_reset_nonce'], 'uwp_reset_nonce_' . $type . '_' . $user_id ) ) {
373 + return;
374 + }
375 +
376 + $errors = new WP_Error();
377 + if ( empty( $user_id ) ) {
378 + $errors->add( 'something_wrong', __( 'Something went wrong. Please try again.', 'userswp' ) );
379 + }
380 +
381 + $error_code = $errors->get_error_code();
382 + if ( ! empty( $error_code ) ) {
383 + return $errors;
384 + }
385 +
386 + if ( $type == 'avatar' ) {
387 + uwp_update_usermeta( $user_id, 'avatar_thumb', '' );
388 + } elseif ( $type == 'banner' ) {
389 + uwp_update_usermeta( $user_id, 'banner_thumb', '' );
390 + } else {
391 + // Do nothing
392 + }
393 +
394 + if ( is_admin() ) {
395 + if ( $user_id == get_current_user_id() ) {
396 + $redirect_url = admin_url( 'profile.php' );
397 + } else {
398 + $redirect_url = admin_url( 'user-edit.php?user_id=' . $user_id );
399 + }
400 + } elseif ( uwp_current_page_url() ) {
401 + $redirect_url = uwp_current_page_url();
402 + } else {
403 + $redirect_url = uwp_build_profile_tab_url( $user_id );
404 + }
405 +
406 + return $redirect_url;
407 + }
408 +
409 + /**
410 + * Displays links in a dropdown
411 + *
412 + * @param $options
413 + *
414 + * @package userswp
415 + *
416 + * @since 1.0.0
417 + */
418 + public function output_dashboard_links( $options ) {
419 + if ( ! empty( $options ) ) {
420 + $class = uwp_get_option( 'design_style', 'bootstrap' ) == 'bootstrap' ? 'form-control' : 'aui-select2';
421 + echo '<select class="' . esc_attr( $class ) . '" onchange="window.location = jQuery(this).val();">';
422 + $this->output_options( $options );
423 + echo '</select>';
424 + }
425 + }
426 +
427 + /**
428 + * Displays options for the dashboard links
429 + *
430 + * @param $options
431 + *
432 + * @package userswp
433 + *
434 + * @since 1.0.0
435 + */
436 + public function output_options( $options ) {
437 + if ( ! empty( $options ) ) {
438 + foreach ( $options as $key => $link ) {
439 +
440 + if ( ! isset( $link['text'] ) && isset( $link[0] ) && is_array( $link[0] ) ) {
441 + $this->output_options( $link );
442 + } elseif ( ! empty( $link['optgroup'] ) && $link['optgroup'] == 'open' ) {
443 + echo "<optgroup label='" . esc_attr( $link['text'] ) . "'>";
444 + } elseif ( ! empty( $link['optgroup'] ) && $link['optgroup'] == 'close' ) {
445 + echo '</optgroup>';
446 + } elseif ( ! empty( $link['text'] ) ) {
447 + echo '<option value="' . ( ! empty( $link['url'] ) ? esc_url( $link['url'] ) : '' ) . '"' . selected( ! empty( $link['selected'] ), true, false ) . ( ! empty( $link['disabled'] ) ? ' disabled' : '' ) . '' . ( ! empty( $link['display_none'] ) ? ' style="display:none;"' : '' ) . '>';
448 + echo esc_attr__( $link['text'], 'userswp' );
449 + echo '</option>';
450 + }
451 + }
452 + }
453 + }
454 +
455 + /**
456 + * Displays UsersWP notices in forms.
457 + *
458 + * @param string $type Form type
459 + *
460 + * @return void
461 + * @since 1.0.0
462 + * @package userswp
463 + *
464 + */
465 + public function display_notices( $type ) {
466 + global $uwp_notices;
467 +
468 + if ( is_array( $uwp_notices ) ) {
469 + foreach ( $uwp_notices as $notice ) {
470 +
471 + // If the notification is type specific then only output on that type
472 + if ( is_array( $notice ) ) {
473 + foreach ( $notice as $key => $val ) {
474 + if ( $key == $type ) {
475 + echo wp_kses_post( $val );
476 + }
477 + }
478 + } elseif ( ! empty( $notice ) ) {
479 + echo wp_kses_post( $notice );
480 + }
142 481 }
143 482 }
144 483
145 - if($type){
146 - $uwp_notices[] = array($type => ob_get_contents());
147 - }else{
148 - $uwp_notices[] = ob_get_contents();
149 - }
484 + if ( $type == 'change' ) {
485 + $user_id = get_current_user_id();
486 + $password_nag = get_user_option( 'default_password_nag', $user_id );
150 487
488 + if ( $password_nag ) {
489 + $change_page = uwp_get_page_id( 'change_page', false );
490 + $remove_nag_url = add_query_arg( 'uwp_remove_nag', 'yes', get_permalink( $change_page ) );
151 491
152 - ob_end_clean();
492 + if ( isset( $_GET['uwp_remove_nag'] ) && $_GET['uwp_remove_nag'] == 'yes' ) {
493 + delete_user_meta( $user_id, 'default_password_nag' );
494 + $message = sprintf( __( 'We have removed the system generated password warning for you. From this point forward you can continue to access our site as usual. To go to home page, <a href="%s">click here</a>.', 'userswp' ), home_url( '/' ) );
495 + echo aui()->alert(
496 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
497 + 'class' => 'text-center',
498 + 'type' => 'success',
499 + 'content' => wp_kses_post( $message ),
500 + )
501 + );
502 + } else {
503 + $message = sprintf( __( '<strong>Warning</strong>: It seems like you are using a system generated password. Please change the password in this page. If this is not a problem for you, you can remove this warning by <a href="%s">clicking here</a>.', 'userswp' ), $remove_nag_url );
504 + echo aui()->alert(
505 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
506 + 'class' => 'text-center',
507 + 'type' => 'warning',
508 + 'content' => wp_kses_post( $message ),
509 + )
510 + );
511 + }
512 + }
513 + }
514 + }
153 515
154 - }
516 + /**
517 + * Processes register form submission.
518 + *
519 + * @since 1.0.0
520 + * @package userswp
521 + *
522 + */
523 + public function process_register() {
155 524
156 - /**
157 - * Displays UsersWP notices in forms.
158 - *
159 - * @since 1.0.0
160 - * @package userswp
161 - *
162 - * @param string $type Form type
163 - *
164 - * @return void
165 - */
166 - public function display_notices($type) {
167 - global $uwp_notices;
525 + $data = $_POST;
168 526
169 - if (is_array($uwp_notices)) {
170 - foreach ($uwp_notices as $notice) {
527 + if ( ! isset( $data['uwp_register_nonce'] ) ) {
528 + return;
529 + }
171 530
172 - // If the notification is type specific then only output on that type
173 - if(is_array($notice)){
174 - foreach($notice as $key => $val){
175 - if( $key == $type ){ echo $val; }
176 - }
177 - }else{
178 - if (!empty($notice)) {
179 - echo $notice;
180 - }
531 + global $uwp_notices;
532 +
533 + if ( isset( $data['uwp_register_hp'] ) && '' != $data['uwp_register_hp'] ) {
534 + wp_die( esc_html__( 'No spam please!', 'userswp' ) );
535 + }
536 +
537 + $form_id = 1;
538 +
539 + if ( ! empty( $data['uwp_register_form_id'] ) ) {
540 + $form_id = (int) $data['uwp_register_form_id'];
541 + }
542 +
543 + if ( ! isset( $data['uwp_register_nonce'] ) || ! wp_verify_nonce( $data['uwp_register_nonce'], 'uwp-register-nonce-' . $form_id ) ) {
544 + $message = aui()->alert(
545 + array(
546 + 'type' => 'error',
547 + 'content' => __( 'Security verification failed. Try again.', 'userswp' ),
548 + )
549 + );
550 + if ( wp_doing_ajax() ) {
551 + wp_send_json_error( array( 'message' => $message ) );
552 + } else {
553 + $uwp_notices[] = array( 'register' => $message );
554 +
555 + return;
556 + }
557 + }
558 +
559 + $hash = substr( hash( 'SHA256', AUTH_KEY . site_url() ), 0, 25 );
560 + if ( empty( $data['uwp_register_hash'] ) || $hash != $data['uwp_register_hash'] ) {
561 + $message = aui()->alert(
562 + array(
563 + 'type' => 'error',
564 + 'content' => __( 'Security hash failed. Try again.', 'userswp' ),
565 + )
566 + );
567 + if ( wp_doing_ajax() ) {
568 + wp_send_json_error( array( 'message' => $message ) );
569 + } else {
570 + $uwp_notices[] = array( 'register' => $message );
571 +
572 + return;
573 + }
574 + }
575 +
576 + if ( ! get_option( 'users_can_register' ) ) {
577 + $message = aui()->alert(
578 + array(
579 + 'type' => 'error',
580 + 'content' => __( 'User registration is currently not allowed. Please check settings of your site.', 'userswp' ),
581 + )
582 + );
583 + if ( wp_doing_ajax() ) {
584 + wp_send_json_error( array( 'message' => $message ) );
585 + } else {
586 + $uwp_notices[] = array( 'register' => $message );
587 +
588 + return;
589 + }
590 + }
591 +
592 + $files = $_FILES;
593 + $errors = new WP_Error();
594 + $file_obj = new UsersWP_Files();
595 +
596 + do_action( 'uwp_before_validate', 'register' );
597 +
598 + $result = uwp_validate_fields( $data, 'register' );
599 +
600 + $result = apply_filters( 'uwp_validate_result', $result, 'register', $data );
601 +
602 + if ( is_wp_error( $result ) ) {
603 + $message = aui()->alert(
604 + array(
605 + 'type' => 'error',
606 + 'content' => $result->get_error_message(),
607 + )
608 + );
609 + if ( wp_doing_ajax() ) {
610 + wp_send_json_error( array( 'message' => $message ) );
611 + } else {
612 + $uwp_notices[] = array( 'register' => $message );
613 +
614 + return;
615 + }
616 + }
617 +
618 + $uploads_result = $file_obj->validate_uploads( $files, 'register' );
619 +
620 + if ( is_wp_error( $uploads_result ) ) {
621 + $message = aui()->alert(
622 + array(
623 + 'type' => 'error',
624 + 'content' => $uploads_result->get_error_message(),
625 + )
626 + );
627 + if ( wp_doing_ajax() ) {
628 + wp_send_json_error( array( 'message' => $message ) );
629 + } else {
630 + $uwp_notices[] = array( 'register' => $message );
631 +
632 + return;
633 + }
634 + }
635 +
636 + do_action( 'uwp_after_validate', $result, 'register', $data );
637 +
638 + $result = array_merge( $result, $uploads_result );
639 +
640 + if ( isset( $result['password'] ) && ! empty( $result['password'] ) ) {
641 + $password = $result['password'];
642 + $generated_password = false;
643 + } else {
644 + $password = wp_generate_password();
645 + $this->generated_password = $password;
646 + $generated_password = true;
647 + }
648 +
649 + $first_name = '';
650 + if ( isset( $result['first_name'] ) && ! empty( $result['first_name'] ) ) {
651 + $first_name = $result['first_name'];
652 + }
653 +
654 + $last_name = '';
655 + if ( isset( $result['last_name'] ) && ! empty( $result['last_name'] ) ) {
656 + $last_name = $result['last_name'];
657 + }
658 +
659 + if ( isset( $result['display_name'] ) && ! empty( $result['display_name'] ) ) {
660 + $display_name = $result['display_name'];
661 + } elseif ( ! empty( $first_name ) || ! empty( $last_name ) ) {
662 + $display_name = $first_name . ' ' . $last_name;
663 + } else {
664 + $display_name = ! empty( $result['username'] ) ? $result['username'] : '';
665 + }
666 +
667 + $user_url = '';
668 + if ( isset( $result['user_url'] ) && ! empty( $result['user_url'] ) ) {
669 + $user_url = esc_url_raw( $result['user_url'] );
670 + }
671 +
672 + $user_login = ! empty( $result['username'] ) ? $result['username'] : '';
673 + $email = ! empty( $result['email'] ) ? sanitize_email( $result['email'] ) : '';
674 +
675 + if ( empty( $user_login ) ) {
676 + $user_login = sanitize_user( str_replace( ' ', '', $display_name ), true );
677 + if ( ! ( validate_username( $user_login ) && ! username_exists( $user_login ) ) ) {
678 + $new_user_login = strstr( $email, '@', true );
679 + if ( validate_username( $user_login ) && username_exists( $user_login ) ) {
680 + $user_login = sanitize_user( $new_user_login, true );
681 + }
682 + if ( validate_username( $user_login ) && username_exists( $user_login ) ) {
683 + $user_append_text = rand( 10, 1000 );
684 + $user_login = sanitize_user( $new_user_login . $user_append_text, true );
685 + }
686 +
687 + if ( ! ( validate_username( $user_login ) && ! username_exists( $user_login ) ) ) {
688 + $user_login = $email;
689 + }
690 + }
691 + } elseif ( ! validate_username( $user_login ) ) {
692 + $message = aui()->alert(
693 + array(
694 + 'type' => 'error',
695 + 'content' => __( 'Sorry, that username is not allowed.', 'userswp' ),
696 + )
697 + );
698 + if ( wp_doing_ajax() ) {
699 + wp_send_json_error( array( 'message' => $message ) );
700 + } else {
701 + $uwp_notices[] = array( 'register' => $message );
702 +
703 + return;
704 + }
705 + }
706 +
707 + $args = array(
708 + 'user_login' => sanitize_user( $user_login ),
709 + 'user_email' => sanitize_email( $email ),
710 + 'user_pass' => $password,
711 + 'display_name' => sanitize_text_field( $display_name ),
712 + 'first_name' => esc_attr( $first_name ),
713 + 'last_name' => esc_attr( $last_name ),
714 + 'user_url' => esc_url_raw( $user_url ),
715 + );
716 +
717 + // Set user role by form.
718 + $user_role = uwp_get_register_form_by( $form_id, 'user_role' );
719 +
720 + if ( ! empty( $user_role ) ) {
721 + $user_roles = uwp_get_user_roles();
722 + $chosen_role = strtolower( $user_role );
723 +
724 + if ( ! empty( $user_roles ) ) {
725 + $wp_roles = wp_roles();
726 +
727 + if ( $wp_roles->is_role( $chosen_role ) && in_array( $chosen_role, array_keys( $user_roles ) ) ) {
728 + $args['role'] = $chosen_role;
729 + }
730 + }
731 + }
732 +
733 + $user_id = wp_insert_user( $args );
734 +
735 + if ( is_wp_error( $user_id ) ) {
736 + $message = aui()->alert(
737 + array(
738 + 'type' => 'error',
739 + 'content' => $user_id->get_error_message(),
740 + )
741 + );
742 + if ( wp_doing_ajax() ) {
743 + wp_send_json_error( array( 'message' => $message ) );
744 + } else {
745 + $uwp_notices[] = array( 'register' => $message );
746 +
747 + return;
748 + }
749 + }
750 +
751 + $result = apply_filters( 'uwp_before_extra_fields_save', $result, 'register', $user_id );
752 +
753 + // Save user form id.
754 + if ( ! empty( $data['uwp_register_form_id'] ) ) {
755 + update_user_meta( $user_id, '_uwp_register_form_id', (int) $data['uwp_register_form_id'] );
756 + }
757 +
758 + $save_result = $this->save_user_extra_fields( $user_id, $result, 'register' );
759 +
760 + $save_result = apply_filters( 'uwp_after_extra_fields_save', $save_result, $result, 'register', $user_id );
761 +
762 + if ( is_wp_error( $save_result ) ) {
763 + $message = aui()->alert(
764 + array(
765 + 'type' => 'error',
766 + 'content' => $save_result->get_error_message(),
767 + )
768 + );
769 + if ( wp_doing_ajax() ) {
770 + wp_send_json_error( array( 'message' => $message ) );
771 + } else {
772 + $uwp_notices[] = array( 'register' => $message );
773 +
774 + return;
775 + }
776 + }
777 +
778 + if ( ! $save_result ) {
779 + $message = aui()->alert(
780 + array(
781 + 'type' => 'error',
782 + 'content' => __( 'Something went wrong. Please contact site admin.', 'userswp' ),
783 + )
784 + );
785 + if ( wp_doing_ajax() ) {
786 + wp_send_json_error( array( 'message' => $message ) );
787 + } else {
788 + $uwp_notices[] = array( 'register' => $message );
789 +
790 + return;
791 + }
792 + }
793 +
794 + //updating bio field after saving extra fields to reflect the points in mycred add on.
795 + if ( isset( $result['bio'] ) && ! empty( $result['bio'] ) ) {
796 + $args = array(
797 + 'ID' => $user_id,
798 + 'description' => $result['bio'],
799 + );
800 + wp_update_user( $args );
801 + }
802 +
803 + do_action( 'uwp_after_custom_fields_save', 'register', $data, $result, $user_id );
804 +
805 + // Unset post data to empty the form on submit
806 + $excluded_post_data = apply_filters( 'uwp_register_excluded_post_reset_fields', array( 'uwp_register_nonce' ) );
807 + foreach ( $data as $key => $value ) {
808 + if ( isset( $key ) && ! in_array( $key, $excluded_post_data ) ) {
809 + unset( $_POST[ $key ] );
810 + }
811 + }
812 +
813 + $reg_action = uwp_get_register_form_by( $form_id, 'reg_action' );
814 + if ( ! $reg_action ) {
815 + $reg_action = uwp_get_option( 'uwp_registration_action', false );
816 + }
817 +
818 + $form_fields = apply_filters( 'uwp_send_mail_form_fields', '', 'register', $user_id );
819 +
820 + if ( $reg_action == 'require_email_activation' && ! $generated_password ) {
821 +
822 + $user_data = get_userdata( $user_id );
823 + $activation_link = uwp_get_activation_link( $user_id );
824 +
825 + $message = __( 'To activate your account, visit the following address:', 'userswp' ) . "\r\n\r\n";
826 +
827 + $message .= "<a href='" . esc_url_raw( $activation_link ) . "' target='_blank'>" . esc_url_raw( $activation_link ) . '</a>' . "\r\n";
828 +
829 + $activate_message = '<p><b>' . __( 'Please activate your account :', 'userswp' ) . '</b></p><p>' . $message . '</p>';
830 +
831 + $activate_message = apply_filters( 'uwp_activation_mail_message', $activate_message, $user_id );
832 +
833 + $email_vars = array(
834 + 'user_id' => $user_id,
835 + 'login_details' => $activate_message,
836 + 'activation_link' => $activation_link,
837 + );
838 +
839 + UsersWP_Mails::send( $user_data->user_email, 'registration_activate', $email_vars );
840 +
841 + } elseif ( $reg_action != 'require_admin_review' ) {
842 +
843 + $user_data = get_userdata( $user_id );
844 +
845 + if ( isset( $this->generated_password ) && ! empty( $this->generated_password ) ) {
846 + if ( ! uwp_get_option( 'change_disable_password_nag' ) ) {
847 + update_user_meta( $user_id, 'default_password_nag', true ); //Set up the Password change nag.
848 + }
849 + $message_pass = $this->generated_password;
850 + $this->generated_password = false;
851 + } else {
852 + $message_pass = __( 'Password you entered during registration.', 'userswp' );
853 + }
854 +
855 + $message = '<p><b>' . __( 'Your login Information :', 'userswp' ) . '</b></p>
856 + <p>' . __( 'Username:', 'userswp' ) . ' ' . $user_data->user_login . '</p>
857 + <p>' . __( 'Password:', 'userswp' ) . ' ' . $message_pass . '</p>';
858 +
859 + $message = apply_filters( 'uwp_register_mail_message', $message, $user_id, $this->generated_password );
860 +
861 + $email_vars = array(
862 + 'user_id' => $user_id,
863 + 'login_details' => $message,
864 + 'form_fields' => $form_fields,
865 + );
866 +
867 + UsersWP_Mails::send( $user_data->user_email, 'registration_success', $email_vars );
868 + }
869 +
870 + $error_code = $errors->get_error_code();
871 + if ( ! empty( $error_code ) ) {
872 + $message = aui()->alert(
873 + array(
874 + 'type' => 'error',
875 + 'content' => $result->get_error_message(),
876 + )
877 + );
878 + if ( wp_doing_ajax() ) {
879 + wp_send_json_error( array( 'message' => $message ) );
880 + } else {
881 + $uwp_notices[] = array( 'register' => $message );
882 + return;
883 + }
884 + }
885 +
886 + if ( $reg_action != 'require_admin_review' ) {
887 +
888 + $user_data = get_userdata( $user_id );
889 + $extras = '<p><b>' . __( 'User Information :', 'userswp' ) . '</b></p>
890 + <p>' . __( 'First Name:', 'userswp' ) . ' ' . $user_data->first_name . '</p>
891 + <p>' . __( 'Last Name:', 'userswp' ) . ' ' . $user_data->last_name . '</p>
892 + <p>' . __( 'Username:', 'userswp' ) . ' ' . $user_data->user_login . '</p>
893 + <p>' . __( 'Email:', 'userswp' ) . ' ' . $user_data->user_email . '</p>';
894 +
895 + $extras = apply_filters( 'uwp_admin_mail_extras', $extras, 'register_admin', $user_id );
896 +
897 + $email_vars = array(
898 + 'user_id' => $user_id,
899 + 'extras' => $extras,
900 + 'form_fields' => $form_fields,
901 + );
902 +
903 + UsersWP_Mails::send( get_option( 'admin_email' ), 'registration_success', $email_vars, true );
904 +
905 + }
906 +
907 + if ( $reg_action == 'auto_approve_login' ) {
908 + $res = wp_signon(
909 + array(
910 + 'user_login' => $user_login,
911 + 'user_password' => $password,
912 + 'remember' => false,
913 + )
914 + );
915 +
916 + if ( is_wp_error( $res ) ) {
917 + $message = aui()->alert(
918 + array(
919 + 'type' => 'error',
920 + 'content' => $res->get_error_message(),
921 + )
922 + );
923 +
924 + if ( wp_doing_ajax() ) {
925 + wp_send_json_error( array( 'message' => $message ) );
926 + } else {
927 + $uwp_notices[] = array( 'register' => $message );
928 + }
929 + } else {
930 + $redirect_to = $this->get_register_redirect_url( $data, $user_id );
931 + do_action( 'uwp_after_process_register', $result, $user_id );
932 +
933 + if ( wp_doing_ajax() ) {
934 + $message = aui()->alert(
935 + array(
936 + 'type' => 'success',
937 + 'content' => __( 'Account registered successfully. Redirecting...', 'userswp' ),
938 + )
939 + );
940 + $response = array(
941 + 'message' => $message,
942 + 'redirect' => $redirect_to,
943 + );
944 + wp_send_json_success( $response );
945 + } else {
946 + wp_safe_redirect( $redirect_to );
947 + }
948 + exit();
949 + }
950 + } else {
951 + if ( $reg_action == 'require_email_activation' ) {
952 + $resend_link = uwp_get_register_page_url();
953 + $resend_link = add_query_arg(
954 + array(
955 + 'user_id' => $user_id,
956 + 'action' => 'uwp_resend',
957 + '_nonce' => wp_create_nonce( 'uwp_resend' ),
958 + ),
959 + $resend_link
960 + );
961 +
962 + $message = aui()->alert(
963 + array(
964 + 'type' => 'success',
965 + 'content' => sprintf( __( 'An email has been sent to your registered email address. Please click the activation link to proceed. <a href="%s">Resend</a>.', 'userswp' ), $resend_link ),
966 + )
967 + );
968 +
969 + } elseif ( $reg_action == 'require_admin_review' && defined( 'UWP_MOD_VERSION' ) ) {
970 +
971 + update_user_meta( $user_id, 'uwp_mod', '1' );
972 +
973 + do_action( 'uwp_require_admin_review', $user_id, $result );
974 +
975 + $message = aui()->alert(
976 + array(
977 + 'type' => 'success',
978 + 'content' => __( 'Your account is under moderation. We will email you once its approved.', 'userswp' ),
979 + )
980 + );
981 + } else {
982 +
983 + $login_page_url = wp_login_url();
984 +
985 + if ( $generated_password ) {
986 + $msg = sprintf( __( 'Account registered successfully. A password has been generated and mailed to your registered Email ID. Please login %1$shere%2$s.', 'userswp' ), '<a href="' . $login_page_url . '">', '</a>' );
987 + } else {
988 + $msg = sprintf( __( 'Account registered successfully. Please login %1$shere%2$s', 'userswp' ), '<a href="' . $login_page_url . '">', '</a>' );
989 + }
990 +
991 + $message = aui()->alert(
992 + array(
993 + 'type' => 'success',
994 + 'content' => $msg,
995 + )
996 + );
997 + }
998 +
999 + do_action( 'uwp_after_process_register', $result, $user_id );
1000 +
1001 + if ( wp_doing_ajax() ) {
1002 + wp_send_json_success( array( 'message' => $message ) );
1003 + } else {
1004 + $uwp_notices[] = array( 'register' => $message );
1005 + }
1006 + }
1007 +
1008 + if ( wp_doing_ajax() ) {
1009 + wp_send_json_error();
1010 + } // if we got this far there is a problem
1011 + }
1012 +
1013 + /**
1014 + * Saves UsersWP related user custom fields.
1015 + *
1016 + * @param int $user_id User ID.
1017 + * @param array $data Result array.
1018 + * @param string $type Form type.
1019 + *
1020 + * @return bool True when success. False when failure.
1021 + * @since 1.0.0
1022 + * @package userswp
1023 + *
1024 + */
1025 + public function save_user_extra_fields( $user_id, $data, $type ) {
1026 +
1027 + if ( empty( $user_id ) || empty( $data ) || empty( $type ) ) {
1028 + return false;
1029 + }
1030 +
1031 + // custom user fields not applicable for login and forgot
1032 + if ( $type == 'login' || $type == 'forgot' ) {
1033 + return true;
1034 + }
1035 +
1036 + if ( $type == 'account' || $type == 'register' ) {
1037 + if ( isset( $data['password'] ) ) {
1038 + unset( $data['password'] );
1039 + }
1040 + }
1041 +
1042 + if ( $type == 'register' ) {
1043 + if ( isset( $data['username'] ) ) {
1044 + unset( $data['username'] );
1045 + }
1046 + if ( isset( $data['email'] ) ) {
1047 + unset( $data['email'] );
1048 + }
1049 + }
1050 +
1051 + if ( empty( $data ) ) {
1052 + // no extra fields. so just return
1053 + return true;
1054 + } else {
1055 + foreach ( $data as $key => $value ) {
1056 + if ( 'uwp_language' == $key ) {
1057 + update_user_meta( $user_id, 'locale', $value );
1058 + }
1059 + uwp_update_usermeta( $user_id, $key, $value );
1060 + }
1061 +
1062 + return true;
1063 + }
1064 + }
1065 +
1066 + public function get_register_redirect_url( $data, $user ) {
1067 + if ( is_int( $user ) ) {
1068 + $user = get_userdata( $user );
1069 + }
1070 +
1071 + $redirect_page_id = $custom_url = '';
1072 + if ( isset( $data['uwp_register_form_id'] ) && ! empty( $data['uwp_register_form_id'] ) ) {
1073 + $form_id = (int) $data['uwp_register_form_id'];
1074 + $redirect_page_id = uwp_get_register_form_by( $form_id, 'redirect_to' );
1075 + $custom_url = uwp_get_register_form_by( $form_id, 'custom_url' );
1076 + }
1077 +
1078 + if ( ! $redirect_page_id ) {
1079 + $redirect_page_id = uwp_get_option( 'register_redirect_to', '' );
1080 + $custom_url = uwp_get_option( 'register_redirect_custom_url' );
1081 + }
1082 +
1083 + if ( isset( $_REQUEST['redirect_to'] ) && ! empty( $_REQUEST['redirect_to'] ) ) {
1084 + $redirect_to = esc_url_raw( $_REQUEST['redirect_to'] );
1085 + } elseif ( isset( $data['redirect_to'] ) && ! empty( $data['redirect_to'] ) ) {
1086 + $redirect_to = esc_url_raw( $data['redirect_to'] );
1087 + } elseif ( isset( $redirect_page_id ) && (int) $redirect_page_id > 0 ) {
1088 + if ( uwp_is_wpml() ) {
1089 + $wpml_page_id = uwp_wpml_object_id( $redirect_page_id, 'page', true, ICL_LANGUAGE_CODE );
1090 + if ( ! empty( $wpml_page_id ) ) {
1091 + $redirect_page_id = $wpml_page_id;
1092 + }
1093 + }
1094 + $redirect_to = get_permalink( $redirect_page_id );
1095 + } elseif ( isset( $redirect_page_id ) && (int) $redirect_page_id == - 1 && wp_get_referer() ) {
1096 + $redirect_to = esc_url( wp_get_referer() );
1097 + } elseif ( isset( $redirect_page_id ) && (int) $redirect_page_id == - 2 && $custom_url ) {
1098 + $redirect_to = $custom_url;
1099 + } else {
1100 + if ( $user && $user->has_cap( 'manage_options' ) ) {
1101 + $redirect_to = admin_url();
1102 + } else {
1103 + $redirect_to = home_url( '/' );
1104 + }
1105 +
1106 + $redirect_to = apply_filters( 'registration_redirect', $redirect_to );
1107 + }
1108 +
1109 + return apply_filters( 'uwp_register_redirect', $redirect_to, $redirect_page_id, $data );
1110 + }
1111 +
1112 + /**
1113 + * Processes login form submission.
1114 + *
1115 + * @since 1.0.0
1116 + * @package userswp
1117 + *
1118 + */
1119 + public function process_login() {
1120 +
1121 + $data = $_POST;
1122 +
1123 + if ( ! isset( $data['uwp_login_nonce'] ) ) {
1124 + return;
1125 + }
1126 +
1127 + if ( ! isset( $data['uwp_login_nonce'] ) || ! wp_verify_nonce( $data['uwp_login_nonce'], 'uwp-login-nonce' ) ) {
1128 + $message = aui()->alert(
1129 + array(
1130 + 'type' => 'error',
1131 + 'content' => __( 'Security verification failed. Try again.', 'userswp' ),
1132 + )
1133 + );
1134 + if ( wp_doing_ajax() ) {
1135 + wp_send_json_error( array( 'message' => $message ) );
1136 + } else {
1137 + return;
1138 + }
1139 + }
1140 +
1141 + global $uwp_notices;
1142 +
1143 + do_action( 'uwp_before_validate', 'login' );
1144 +
1145 + $result = uwp_validate_fields( $data, 'login' );
1146 +
1147 + $result = apply_filters( 'uwp_validate_result', $result, 'login', $data );
1148 +
1149 + if ( is_wp_error( $result ) ) {
1150 + $message = aui()->alert(
1151 + array(
1152 + 'type' => 'error',
1153 + 'content' => $result->get_error_message(),
1154 + )
1155 + );
1156 + if ( wp_doing_ajax() ) {
1157 + wp_send_json_error( array( 'message' => $message ) );
1158 + } else {
1159 + $uwp_notices[] = array( 'login' => $message );
1160 +
1161 + return;
1162 + }
1163 + }
1164 +
1165 + do_action( 'uwp_after_validate', $result, 'login', $data );
1166 +
1167 + if ( isset( $data['remember_me'] ) && $data['remember_me'] == 'forever' ) {
1168 + $remember_me = true;
1169 + } else {
1170 + $remember_me = false;
1171 + }
1172 +
1173 + remove_action( 'authenticate', 'gglcptch_login_check', 21 );
1174 +
1175 + global $wp2fa;
1176 + if ( wp_doing_ajax() && isset( $wp2fa ) && ! empty( $wp2fa ) ) {
1177 + remove_action( 'wp_login', array( $wp2fa->login, 'wp_login' ), 20 );
1178 + }
1179 + if ( wp_doing_ajax() && class_exists( '\WP2FA\Authenticator\Login' ) ) {
1180 + remove_action( 'wp_login', array( 'WP2FA\Authenticator\Login', 'wp_login' ), 20 );
1181 + }
1182 +
1183 + $user = wp_signon(
1184 + array(
1185 + 'user_login' => $result['username'],
1186 + 'user_password' => $result['password'],
1187 + 'remember' => $remember_me,
1188 + )
1189 + );
1190 +
1191 + add_action( 'authenticate', 'gglcptch_login_check', 21, 1 );
1192 + if ( wp_doing_ajax() && class_exists( '\WP2FA\Authenticator\Login' ) ) {
1193 + add_action( 'wp_login', array( 'WP2FA\Authenticator\Login', 'wp_login' ), 20, 2 );
1194 + }
1195 +
1196 + $wp2fa_available = ( isset( $wp2fa ) && ! empty( $wp2fa ) ) || class_exists( '\WP2FA\Authenticator\Login' );
1197 + if ( wp_doing_ajax() && ! is_wp_error( $user ) && $wp2fa_available ) {
1198 +
1199 + $two_fa = $this->check_2fa( $user );
1200 + if ( isset( $two_fa ) && ! empty( $two_fa ) ) {
1201 + if ( is_wp_error( $two_fa ) ) {
1202 + $message = aui()->alert(
1203 + array(
1204 + 'type' => 'error',
1205 + 'content' => $two_fa->get_error_message(),
1206 + )
1207 + );
1208 + wp_send_json_error( array( 'message' => $message ) );
1209 + } else {
1210 + wp_send_json_success(
1211 + array(
1212 + 'html' => $two_fa,
1213 + 'is_2fa' => true,
1214 + )
1215 + );
1216 + }
1217 + }
1218 + }
1219 +
1220 + if ( wp_doing_ajax() && is_wp_error( $user ) && $this->wordfence_2fa_available() ) {
1221 + $wfls_2fa = $this->check_wordfence_2fa( $user, $result );
1222 + if ( ! empty( $wfls_2fa ) ) {
1223 + wp_send_json_success(
1224 + array(
1225 + 'html' => $wfls_2fa,
1226 + 'is_2fa' => true,
1227 + )
1228 + );
1229 + }
1230 + }
1231 +
1232 + if ( is_wp_error( $user ) ) {
1233 + $message = aui()->alert(
1234 + array(
1235 + 'type' => 'error',
1236 + 'content' => $user->get_error_message(),
1237 + )
1238 + );
1239 + if ( wp_doing_ajax() ) {
1240 + wp_send_json_error( array( 'message' => $message ) );
1241 + } else {
1242 + $uwp_notices[] = array( 'login' => $message );
1243 +
1244 + return;
1245 + }
1246 + } else {
1247 + do_action( 'uwp_after_process_login', $data );
1248 + $message = aui()->alert(
1249 + array(
1250 + 'type' => 'success',
1251 + 'content' => __( 'Login successful. Redirecting...', 'userswp' ),
1252 + )
1253 + );
1254 + if ( wp_doing_ajax() ) {
1255 + $redirect_to = '';
1256 + if ( 1 == uwp_get_option( 'login_modal_enable_redirect' ) ) {
1257 + $redirect_to = $this->get_login_redirect_url( $data, $user );
181 1258 }
1259 + wp_send_json_success(
1260 + array(
1261 + 'message' => $message,
1262 + 'redirect' => $redirect_to,
1263 + )
1264 + );
1265 + } else {
1266 + $redirect_to = $this->get_login_redirect_url( $data, $user );
1267 + wp_safe_redirect( $redirect_to );
1268 + exit();
1269 + }
1270 +}
1271 + }
182 1272
183 - }
1273 + public function check_2fa( $user ) {
1274 + if ( 1 == uwp_get_option( 'disable_wp_2fa' ) ) {
1275 + return;
1276 + }
184 1277
185 - }
1278 + if ( ! $user ) {
1279 + $user = wp_get_current_user();
1280 + }
186 1281
187 - if ($type == 'change') {
188 - $user_id = get_current_user_id();
189 - $password_nag = get_user_option('default_password_nag', $user_id);
1282 + global $wp2fa;
1283 + $errors = new WP_Error();
190 1284
191 - if ($password_nag) {
192 - $change_page = uwp_get_page_id('change_page', false);
193 - $remove_nag_url = add_query_arg('uwp_remove_nag', 'yes', get_permalink($change_page));
1285 + if ( ! \WP2FA\Admin\Helpers\User_Helper::is_user_using_two_factor( $user->ID ) ) {
1286 + return;
1287 + }
1288 + // Invalidate the current login session to prevent from being re-used.
1289 + \WP2FA\Authenticator\Login::destroy_current_session_for_user( $user );
194 1290
195 - if (isset($_GET['uwp_remove_nag']) && $_GET['uwp_remove_nag'] == 'yes') {
196 - delete_user_meta( $user_id, 'default_password_nag' );
197 - $message = sprintf(__('We have removed the system generated password warning for you. From this point forward you can continue to access our site as usual. To go to home page, <a href="%s">click here</a>.', 'userswp'), home_url('/'));
198 - echo '<div class="uwp-alert-success text-center">';
199 - echo $message;
200 - echo '</div>';
201 - } else {
202 - $message = sprintf(__('<strong>Warning</strong>: It seems like you are using a system generated password. Please change the password in this page. If this is not a problem for you, you can remove this warning by <a href="%s">clicking here</a>.', 'userswp'), $remove_nag_url);
203 - echo '<div class="uwp-alert-warning text-center">';
204 - echo $message;
205 - echo '</div>';
206 - }
207 - }
208 - }
209 - }
1291 + // Also clear the cookies which are no longer valid.
1292 + wp_clear_auth_cookie();
210 1293
211 - /**
212 - * Processes register form submission.
213 - *
214 - * @since 1.0.0
215 - * @package userswp
216 - *
217 - * @param array $data Submitted $_POST data
218 - * @param array $files Submitted $_FILES data
219 - *
220 - * @return bool|WP_Error|string
221 - */
222 - public function process_register($data = array(), $files = array()) {
1294 + $login_nonce = \WP2FA\Authenticator\Login::create_login_nonce( $user->ID );
1295 + if ( ! $login_nonce ) {
1296 + $errors->add( 'failed_login_nonce', __( 'Failed to create a login nonce.', 'userswp' ) );
223 1297
224 - $errors = new WP_Error();
225 - $file_obj = new UsersWP_Files();
1298 + return $errors;
1299 + }
226 1300
227 - if( ! isset( $data['uwp_register_nonce'] ) || ! wp_verify_nonce( $data['uwp_register_nonce'], 'uwp-register-nonce' ) ) {
228 - return false;
229 - }
1301 + $provider = $this->get_wp2fa_provider_for_user( $user );
1302 + if ( empty( $provider ) ) {
1303 + return;
1304 + }
230 1305
231 - if (!get_option('users_can_register')) {
232 - $errors->add('register_disabled', __('<strong>ERROR</strong>: User registration is currently not allowed.', 'userswp'));
233 - return $errors;
234 - }
1306 + ob_start();
1307 + ?>
235 1308
236 - $reg_terms_page_id = uwp_get_option('register_terms_page', '');
237 - $reg_terms_page_id = apply_filters('uwp_reg_terms_page_id', $reg_terms_page_id);
238 - if (!empty($reg_terms_page_id)) {
239 - if (!isset($data['agree_terms']) || $data['agree_terms'] != 'yes') {
240 - $errors->add('accept_tos', __('<strong>ERROR</strong>: You must accept our terms and conditions.', 'userswp'));
241 - return $errors;
242 - }
243 - }
1309 + <div class="uwp-2fa-methods-wrap">
1310 + <form name="validate_2fa_form" id="validate_2fa_form" class="validate_2fa_form" action="" method="post"
1311 + autocomplete="off">
1312 + <input type="hidden" name="provider" id="provider" value="<?php echo esc_attr( $provider ); ?>"/>
1313 + <input type="hidden" name="uwp-auth-id" id="uwp-auth-id" value="<?php echo esc_attr( $user->ID ); ?>"/>
1314 + <input type="hidden" name="wp-auth-nonce" id="wp-auth-nonce"
1315 + value="<?php echo esc_attr( $login_nonce['key'] ); ?>"/>
1316 + <?php
244 1317
245 - do_action('uwp_before_validate', 'register');
1318 + // Check to see what provider is set and give the relevant authentication page.
1319 + if ( 'totp' === $provider ) {
1320 + ?>
1321 + <p><?php esc_html_e( 'Please enter the authentication code from your 2FA authentication app below to login:', 'userswp' ); ?></p>
1322 + <?php
246 1323
247 - $result = uwp_validate_fields($data, 'register');
248 -
249 - $result = apply_filters('uwp_validate_result', $result, 'register', $data);
1324 + echo aui()->input(
1325 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1326 + 'type' => 'tel',
1327 + 'id' => 'authcode',
1328 + 'name' => 'authcode',
1329 + 'placeholder' => esc_attr__( 'Authentication Code', 'userswp' ),
1330 + 'value' => '',
1331 + 'label' => esc_html__( 'Authentication Code', 'userswp' ),
1332 + )
1333 + );
250 1334
251 - if (is_wp_error($result)) {
252 - return $result;
253 - }
1335 + echo aui()->button(
1336 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1337 + 'type' => 'submit',
1338 + 'class' => 'btn btn-primary btn-block text-uppercase uwp-2fa-submit',
1339 + 'name' => 'submit',
1340 + 'icon' => '',
1341 + 'content' => esc_html__( 'Log In', 'userswp' ),
1342 + )
1343 + );
254 1344
255 - $uploads_result = $file_obj->uwp_validate_uploads($files, 'register');
1345 + } elseif ( 'email' === $provider ) {
1346 + $has_token = \WP2FA\Authenticator\Authentication::user_has_token( $user->ID );
1347 + if ( empty( $has_token ) || ! $has_token ) {
1348 + \WP2FA\Admin\Setup_Wizard::send_authentication_setup_email( $user->ID );
1349 + }
1350 + ?>
1351 + <p><?php esc_html_e( 'Please enter the 2FA verification code sent to your email address to login:', 'userswp' ); ?></p>
1352 + <?php
1353 + echo aui()->input(
1354 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1355 + 'type' => 'tel',
1356 + 'id' => 'authcode',
1357 + 'name' => 'authcode',
1358 + 'placeholder' => esc_attr__( 'Verification Code', 'userswp' ),
1359 + 'value' => '',
1360 + 'label' => esc_html__( 'Verification Code', 'userswp' ),
1361 + 'extra_attributes' => array(
1362 + 'size' => 20,
1363 + 'pattern' => '[0-9]*',
1364 + ),
1365 + )
1366 + );
256 1367
257 - if (is_wp_error($uploads_result)) {
258 - return $uploads_result;
259 - }
1368 + echo aui()->button(
1369 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1370 + 'type' => 'submit',
1371 + 'class' => 'btn btn-primary text-uppercase uwp-2fa-submit',
1372 + 'name' => 'submit',
1373 + 'icon' => '',
1374 + 'content' => esc_html__( 'Log In', 'userswp' ),
1375 + )
1376 + );
260 1377
261 - do_action('uwp_after_validate', 'register');
1378 + echo aui()->button(
1379 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1380 + 'type' => 'button',
1381 + 'class' => 'btn btn-secondary text-uppercase uwp-2fa-email-resend',
1382 + 'name' => 'wp-2fa-email-code-resend',
1383 + 'icon' => '',
1384 + 'content' => esc_html__( 'Resend Code', 'userswp' ),
1385 + )
1386 + );
262 1387
263 - $result = array_merge( $result, $uploads_result );
1388 + }
1389 + ?>
1390 + </form>
1391 + </div>
264 1392
265 - $error_code = $errors->get_error_code();
266 - if (!empty($error_code)) {
267 - return $errors;
268 - }
1393 + <?php
1394 + $codes_remaining = $this->get_wp2fa_backup_codes_remaining( $user );
1395 + if ( isset( $codes_remaining ) && $codes_remaining > 0 ) {
1396 + ?>
1397 + <div class="uwp-2fa-methods-wrap" style="display:none;">
1398 + <form name="validate_2fa_backup_codes_form" id="validate_2fa_backup_codes_form"
1399 + class="validate_2fa_backup_codes_form" action="" method="post" autocomplete="off">
1400 + <input type="hidden" name="provider" id="provider" value="backup_codes"/>
1401 + <input type="hidden" name="uwp-auth-id" id="uwp-auth-id"
1402 + value="<?php echo esc_attr( $user->ID ); ?>"/>
1403 + <input type="hidden" name="wp-auth-nonce" id="wp-auth-nonce"
1404 + value="<?php echo esc_attr( $login_nonce['key'] ); ?>"/>
1405 + <div class="uwp-backup-fields">
1406 + <?php
1407 + echo aui()->input(
1408 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1409 + 'type' => 'tel',
1410 + 'id' => 'authcode',
1411 + 'name' => 'wp-2fa-backup-code',
1412 + 'placeholder' => esc_attr__( 'Enter backup code', 'userswp' ),
1413 + 'value' => '',
1414 + 'label' => esc_html__( 'Backup Code', 'userswp' ),
1415 + 'extra_attributes' => array(
1416 + 'size' => 20,
1417 + 'pattern' => '[0-9]*',
1418 + ),
1419 + )
1420 + );
269 1421
270 - if (isset($result['password']) && !empty($result['password'])) {
271 - $password = $result['password'];
272 - $generated_password = false;
273 - } else {
274 - $password = wp_generate_password();
275 - $this->generated_password = $password;
276 - $generated_password = true;
277 - }
1422 + echo aui()->button(
1423 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1424 + 'type' => 'submit',
1425 + 'class' => 'btn btn-primary btn-block text-uppercase uwp-2fa-submit',
1426 + 'name' => 'submit',
1427 + 'icon' => '',
1428 + 'content' => esc_html__( 'Log In', 'userswp' ),
1429 + )
1430 + );
1431 + ?>
1432 + </div>
1433 + </form>
1434 + </div>
1435 + <a href="#" class="uwp-switch-2fa-methods text-center d-block"><?php esc_html_e( 'Or, use a backup code.', 'userswp' ); ?></a>
1436 + <script type="text/javascript">
1437 + jQuery('.uwp-switch-2fa-methods').on('click',
1438 + function (e) {
1439 + e.preventDefault();
1440 + jQuery('.uwp-auth-modal .modal-content .modal-error').html('');
1441 + jQuery('.uwp-2fa-methods-wrap').toggle();
1442 + return false;
1443 + }
1444 + );
1445 + </script>
1446 + <?php
1447 + }
278 1448
279 - $first_name = "";
280 - if (isset($result['uwp_account_first_name']) && !empty($result['uwp_account_first_name'])) {
281 - $first_name = $result['uwp_account_first_name'];
282 - }
1449 + return ob_get_clean();
1450 + }
283 1451
284 - $last_name = "";
285 - if (isset($result['uwp_account_last_name']) && !empty($result['uwp_account_last_name'])) {
286 - $last_name = $result['uwp_account_last_name'];
287 - }
1452 + /**
1453 + * Checks if the Wordfence Login Security module (2FA) is available.
1454 + *
1455 + * @since 1.2.5
1456 + * @package userswp
1457 + *
1458 + * @return bool
1459 + */
1460 + public function wordfence_2fa_available() {
1461 + return class_exists( '\WordfenceLS\Controller_Users' ) && class_exists( '\WordfenceLS\Controller_TOTP' );
1462 + }
288 1463
289 - if (isset($result['uwp_account_display_name']) && !empty($result['uwp_account_display_name'])) {
290 - $display_name = $result['uwp_account_display_name'];
291 - } else {
292 - if (!empty($first_name) || !empty($last_name)) {
293 - $display_name = $first_name . ' ' . $last_name;
294 - } else {
295 - $display_name = $result['uwp_account_username'];
296 - }
297 - }
1464 + /**
1465 + * Checks whether Wordfence's 2FA requires a verification code for the
1466 + * failed login attempt and, if so, returns the markup for the code entry form.
1467 + *
1468 + * @since 1.2.5
1469 + * @package userswp
1470 + *
1471 + * @param WP_Error $error The error returned by wp_signon().
1472 + * @param array $result The validated login fields (username/password).
1473 + *
1474 + * @return string|void The 2FA form markup, or nothing if not applicable.
1475 + */
1476 + public function check_wordfence_2fa( $error, $result ) {
1477 + if ( 1 == uwp_get_option( 'disable_wordfence_2fa' ) ) {
1478 + return;
1479 + }
298 1480
299 - $description = "";
300 - if (isset($result['uwp_account_bio']) && !empty($result['uwp_account_bio'])) {
301 - $description = $result['uwp_account_bio'];
302 - }
1481 + if ( ! $this->wordfence_2fa_available() ) {
1482 + return;
1483 + }
303 1484
1485 + if ( ! is_wp_error( $error ) || 'wfls_twofactor_required' !== $error->get_error_code() ) {
1486 + return;
1487 + }
304 1488
305 - $args = array(
306 - 'user_login' => $result['uwp_account_username'],
307 - 'user_email' => $result['uwp_account_email'],
308 - 'user_pass' => $password,
309 - 'display_name' => $display_name,
310 - 'first_name' => $first_name,
311 - 'last_name' => $last_name,
312 - 'description' => $description
313 - );
1489 + $username = ! empty( $result['username'] ) ? $result['username'] : '';
1490 + if ( empty( $username ) ) {
1491 + return;
1492 + }
314 1493
315 - $user_id = wp_insert_user( $args );
1494 + $user = is_email( $username ) ? get_user_by( 'email', $username ) : get_user_by( 'login', $username );
1495 + if ( ! $user ) {
1496 + return;
1497 + }
316 1498
317 - if (!$user_id) {
318 - $errors->add('registerfail', sprintf(__('<strong>Error</strong>: Something went wrong.', 'userswp'), get_option('admin_email')));
319 - return $errors;
320 - }
1499 + if ( ! \WordfenceLS\Controller_Users::shared()->has_2fa_active( $user ) ) {
1500 + return;
1501 + }
321 1502
322 - $result = apply_filters('uwp_before_extra_fields_save', $result, 'register', $user_id);
1503 + if ( \WordfenceLS\Controller_Users::shared()->has_remembered_2fa( $user ) ) {
1504 + return;
1505 + }
323 1506
324 - $save_result = $this->uwp_save_user_extra_fields($user_id, $result, 'register');
1507 + $login_nonce = wp_create_nonce( 'uwp-wfls-2fa-' . $user->ID );
325 1508
326 - $save_result = apply_filters('uwp_after_extra_fields_save', $save_result, $result, 'register', $user_id);
1509 + ob_start();
1510 + ?>
327 1511
328 - if (is_wp_error($save_result)) {
329 - return $save_result;
330 - }
1512 + <div class="uwp-2fa-methods-wrap">
1513 + <form name="validate_2fa_form" id="validate_2fa_form" class="validate_2fa_form" action="" method="post"
1514 + autocomplete="off">
1515 + <input type="hidden" name="provider" id="provider" value="wordfence"/>
1516 + <input type="hidden" name="uwp-auth-id" id="uwp-auth-id" value="<?php echo esc_attr( $user->ID ); ?>"/>
1517 + <input type="hidden" name="wp-auth-nonce" id="wp-auth-nonce"
1518 + value="<?php echo esc_attr( $login_nonce ); ?>"/>
331 1519
332 - if (!$save_result) {
333 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong. Please contact site admin.', 'userswp'));
334 - }
1520 + <p><?php esc_html_e( 'Please enter the authentication code from your two-factor authentication app, or a recovery code, to login:', 'userswp' ); ?></p>
335 1521
336 - $error_code = $errors->get_error_code();
337 - if (!empty($error_code)) {
338 - return $errors;
339 - }
1522 + <?php
1523 + echo aui()->input(
1524 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1525 + 'type' => 'text',
1526 + 'id' => 'authcode',
1527 + 'name' => 'authcode',
1528 + 'placeholder' => esc_attr__( 'Authentication Code', 'userswp' ),
1529 + 'value' => '',
1530 + 'label' => esc_html__( 'Authentication Code', 'userswp' ),
1531 + 'extra_attributes' => array(
1532 + 'autocomplete' => 'one-time-code',
1533 + ),
1534 + )
1535 + );
340 1536
341 - do_action('uwp_after_custom_fields_save', 'register', $data, $result, $user_id);
1537 + echo aui()->button(
1538 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1539 + 'type' => 'submit',
1540 + 'class' => 'btn btn-primary btn-block text-uppercase uwp-2fa-submit',
1541 + 'name' => 'submit',
1542 + 'icon' => '',
1543 + 'content' => esc_html__( 'Log In', 'userswp' ),
1544 + )
1545 + );
1546 + ?>
1547 + </form>
1548 + </div>
342 1549
343 - $reg_action = uwp_get_option('uwp_registration_action', false);
1550 + <?php
1551 + return ob_get_clean();
1552 + }
344 1553
345 - if ($reg_action == 'require_email_activation' && !$generated_password) {
1554 + public function get_wp2fa_provider_for_user( $user ) {
1555 + if ( class_exists( '\WP2FA\Authenticator\Login' ) && method_exists( '\WP2FA\Authenticator\Login', 'get_available_providers_for_user' ) ) {
1556 + $provider = \WP2FA\Authenticator\Login::get_available_providers_for_user( $user );
1557 + if ( is_array( $provider ) ) {
1558 + $provider = key( $provider );
1559 + }
346 1560
347 - $email = new UsersWP_Mails();
348 - $send_result = $email->send( 'activate', $user_id );
1561 + return $provider;
1562 + }
349 1563
350 - if (!$send_result) {
351 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong when sending email. Please contact site admin.', 'userswp'));
352 - }
353 - } else {
354 - $email = new UsersWP_Mails();
355 - $send_result = $email->send( 'register', $user_id );
1564 + if ( class_exists( '\WP2FA\Admin\Helpers\User_Helper' ) && method_exists( '\WP2FA\Admin\Helpers\User_Helper', 'get_enabled_method_for_user' ) ) {
1565 + return \WP2FA\Admin\Helpers\User_Helper::get_enabled_method_for_user( $user );
1566 + }
356 1567
357 - if (!$send_result) {
358 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong when sending email. Please contact site admin.', 'userswp'));
359 - }
360 - }
1568 + return '';
1569 + }
361 1570
362 - if ($reg_action != 'require_admin_review') {
363 - $register_admin_notify = uwp_get_option('register_admin_notify', '');
364 - if ($register_admin_notify == '1') {
365 - $admin_register_send_result = $email->send_admin_email('register_admin', $user_id);
366 - if (is_wp_error($admin_register_send_result)) {
367 - return $admin_register_send_result;
368 - }
369 - }
1571 + public function get_wp2fa_backup_codes_remaining( $user ) {
1572 + if ( class_exists( '\WP2FA\Methods\Backup_Codes' ) && method_exists( '\WP2FA\Methods\Backup_Codes', 'codes_remaining_for_user' ) ) {
1573 + return \WP2FA\Methods\Backup_Codes::codes_remaining_for_user( $user );
1574 + }
370 1575
371 - }
1576 + if ( class_exists( '\WP2FA\Authenticator\Backup_Codes' ) && method_exists( '\WP2FA\Authenticator\Backup_Codes', 'codes_remaining_for_user' ) ) {
1577 + return \WP2FA\Authenticator\Backup_Codes::codes_remaining_for_user( $user );
1578 + }
372 1579
1580 + return 0;
1581 + }
373 1582
374 - $error_code = $errors->get_error_code();
375 - if (!empty($error_code)) {
376 - return $errors;
377 - }
1583 + public function validate_wp2fa_totp_authentication( $user ) {
1584 + if ( class_exists( '\WP2FA\Methods\TOTP' ) && method_exists( '\WP2FA\Methods\TOTP', 'validate_totp_authentication' ) ) {
1585 + return \WP2FA\Methods\TOTP::validate_totp_authentication( $user );
1586 + }
378 1587
379 - if ($reg_action == 'auto_approve_login') {
380 - $res = wp_signon(
1588 + if ( class_exists( '\WP2FA\Authenticator\Login' ) && method_exists( '\WP2FA\Authenticator\Login', 'validate_totp_authentication' ) ) {
1589 + return \WP2FA\Authenticator\Login::validate_totp_authentication( $user );
1590 + }
1591 +
1592 + return false;
1593 + }
1594 +
1595 + public function validate_wp2fa_email_authentication( $user ) {
1596 + if ( class_exists( '\WP2FA\Authenticator\Login' ) && method_exists( '\WP2FA\Authenticator\Login', 'validate_email_authentication' ) ) {
1597 + return \WP2FA\Authenticator\Login::validate_email_authentication( $user );
1598 + }
1599 +
1600 + if ( class_exists( '\WP2FA\Authenticator\Authentication' ) && method_exists( '\WP2FA\Authenticator\Authentication', 'validate_token' ) && isset( $_REQUEST['authcode'] ) ) {
1601 + return \WP2FA\Authenticator\Authentication::validate_token( $user, sanitize_text_field( wp_unslash( $_REQUEST['authcode'] ) ) );
1602 + }
1603 +
1604 + return false;
1605 + }
1606 +
1607 + public function validate_wp2fa_backup_codes( $user ) {
1608 + if ( class_exists( '\WP2FA\Methods\Backup_Codes' ) && method_exists( '\WP2FA\Methods\Backup_Codes', 'validate_backup_codes' ) ) {
1609 + return \WP2FA\Methods\Backup_Codes::validate_backup_codes( $user );
1610 + }
1611 +
1612 + if ( class_exists( '\WP2FA\Authenticator\Backup_Codes' ) && method_exists( '\WP2FA\Authenticator\Backup_Codes', 'validate_backup_codes' ) ) {
1613 + return \WP2FA\Authenticator\Backup_Codes::validate_backup_codes( $user );
1614 + }
1615 +
1616 + return false;
1617 + }
1618 +
1619 + /**
1620 + * Validates the Wordfence 2FA code submitted from the uwp-2fa form and,
1621 + * if valid, completes the login by setting the auth cookie.
1622 + *
1623 + * @since 1.2.5
1624 + * @package userswp
1625 + *
1626 + * @param WP_User $user The user attempting to complete 2FA login.
1627 + *
1628 + * @return void
1629 + */
1630 + public function process_login_wordfence_2fa( $user ) {
1631 + if ( ! $this->wordfence_2fa_available() ) {
1632 + $message = aui()->alert(
1633 + array(
1634 + 'type' => 'error',
1635 + 'content' => __( 'Invalid request! Please try again.', 'userswp' ),
1636 + )
1637 + );
1638 +
1639 + wp_send_json_error( array( 'message' => $message ) );
1640 + }
1641 +
1642 + $nonce = ( isset( $_POST['wp-auth-nonce'] ) ) ? sanitize_textarea_field( wp_unslash( $_POST['wp-auth-nonce'] ) ) : '';
1643 +
1644 + if ( ! wp_verify_nonce( $nonce, 'uwp-wfls-2fa-' . $user->ID ) ) {
1645 + $message = aui()->alert(
1646 + array(
1647 + 'type' => 'error',
1648 + 'content' => __( 'Invalid request! Please try again.', 'userswp' ),
1649 + )
1650 + );
1651 +
1652 + wp_send_json_error( array( 'message' => $message ) );
1653 + }
1654 +
1655 + $code = isset( $_POST['authcode'] ) ? sanitize_text_field( wp_unslash( $_POST['authcode'] ) ) : '';
1656 +
1657 + if ( empty( $code ) || true !== \WordfenceLS\Controller_TOTP::shared()->validate_2fa( $user, $code ) ) {
1658 + do_action( 'wp_login_failed', $user->user_login );
1659 +
1660 + $message = aui()->alert(
1661 + array(
1662 + 'type' => 'error',
1663 + 'content' => __( 'Invalid verification code.', 'userswp' ),
1664 + )
1665 + );
1666 +
1667 + wp_send_json_error( array( 'message' => $message ) );
1668 + }
1669 +
1670 + $remember = ( isset( $_REQUEST['rememberme'] ) ) ? filter_var( $_REQUEST['rememberme'], FILTER_VALIDATE_BOOLEAN ) : false;
1671 +
1672 + // Complete the login the same way wp_signon() would have, now that 2FA has been verified.
1673 + wp_set_auth_cookie( $user->ID, $remember );
1674 + wp_set_current_user( $user->ID );
1675 +
1676 + do_action( 'wp_login', $user->user_login, $user );
1677 +
1678 + $message = aui()->alert(
1679 + array(
1680 + 'type' => 'success',
1681 + 'content' => __( 'Validation successful. Redirecting...', 'userswp' ),
1682 + )
1683 + );
1684 +
1685 + wp_send_json_success( array( 'message' => $message ) );
1686 + }
1687 +
1688 + public function process_login_2fa() {
1689 + global $wp2fa;
1690 +
1691 + if ( ! isset( $_POST['uwp-auth-id'], $_POST['wp-auth-nonce'] ) ) {
1692 + return;
1693 + }
1694 +
1695 + $auth_id = (int) $_POST['uwp-auth-id'];
1696 + $user = get_userdata( $auth_id );
1697 +
1698 + if ( ! $user ) {
1699 + $message = aui()->alert(
1700 + array(
1701 + 'type' => 'error',
1702 + 'content' => __( 'Invalid user data. Please try again.', 'userswp' ),
1703 + )
1704 + );
1705 +
1706 + wp_send_json_error( array( 'message' => $message ) );
1707 + }
1708 +
1709 + if ( isset( $_POST['provider'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
1710 + $provider = sanitize_textarea_field( wp_unslash( $_POST['provider'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
1711 + } else {
1712 + $provider = '';
1713 + }
1714 +
1715 + if ( 'wordfence' === $provider ) {
1716 + $this->process_login_wordfence_2fa( $user );
1717 +
1718 + return;
1719 + }
1720 +
1721 + $nonce = ( isset( $_POST['wp-auth-nonce'] ) ) ? sanitize_textarea_field( wp_unslash( $_POST['wp-auth-nonce'] ) ) : '';
1722 +
1723 + if ( true !== \WP2FA\Authenticator\Login::verify_login_nonce( $user->ID, $nonce ) ) {
1724 + $message = aui()->alert(
1725 + array(
1726 + 'type' => 'error',
1727 + 'content' => __( 'Invalid request! Please try again.', 'userswp' ),
1728 + )
1729 + );
1730 +
1731 + wp_send_json_error( array( 'message' => $message ) );
1732 + }
1733 +
1734 + $error = '';
1735 +
1736 + try {
1737 + $is_enabled = \WP2FA\Admin\Controllers\Settings::is_provider_enabled_for_role( \WP2FA\Admin\Helpers\User_Helper::get_user_role( $user ), $provider );
1738 +
1739 + if ( ! $is_enabled ) {
1740 + $error = __( 'Invalid 2FA provider for user.', 'userswp' );
1741 + }
1742 + } catch ( \Exception $e ) {
1743 + $error = $e->getMessage();
1744 + }
1745 +
1746 + if ( $error ) {
1747 + do_action( 'wp_login_failed', $user->user_login );
1748 +
1749 + $message = aui()->alert(
1750 + array(
1751 + 'type' => 'error',
1752 + 'content' => $error
1753 + )
1754 + );
1755 +
1756 + wp_send_json_error( array( 'message' => $message ) );
1757 + }
1758 +
1759 + // If this is an email login, or if the user failed validation previously, lets send the code to the user.
1760 + if ( 'email' === $provider && true !== \WP2FA\Authenticator\Login::pre_process_email_authentication( $user ) ) {
1761 +
1762 + }
1763 +
1764 + // Validate TOTP.
1765 + if ( 'totp' === $provider && true !== $this->validate_wp2fa_totp_authentication( $user ) ) {
1766 + do_action( 'wp_login_failed', $user->user_login );
1767 +
1768 + $message = aui()->alert(
1769 + array(
1770 + 'type' => 'error',
1771 + 'content' => __( 'Invalid verification code.', 'userswp' ),
1772 + )
1773 + );
1774 +
1775 + wp_send_json_error( array( 'message' => $message ) );
1776 + }
1777 +
1778 + // Validate Email.
1779 + if ( 'email' === $provider && true !== $this->validate_wp2fa_email_authentication( $user ) ) {
1780 + do_action( 'wp_login_failed', $user->user_login );
1781 +
1782 + if ( isset( $_REQUEST['wp-2fa-email-code-resend'] ) && 1 == $_REQUEST['wp-2fa-email-code-resend'] ) {
1783 + $message = aui()->alert(
1784 + array(
1785 + 'type' => 'info',
1786 + 'content' => __( 'A new code has been sent.', 'userswp' ),
1787 + )
1788 + );
1789 +
1790 + wp_send_json_error( array( 'message' => $message ) );
1791 + } else {
1792 + $message = aui()->alert(
1793 + array(
1794 + 'type' => 'error',
1795 + 'content' => __( 'Invalid verification code.', 'userswp' ),
1796 + )
1797 + );
1798 +
1799 + wp_send_json_error( array( 'message' => $message ) );
1800 + }
1801 + }
1802 +
1803 + // Backup Codes.
1804 + if ( 'backup_codes' === $provider && true !== $this->validate_wp2fa_backup_codes( $user ) ) {
1805 + do_action( 'wp_login_failed', $user->user_login );
1806 +
1807 + $message = aui()->alert(
1808 + array(
1809 + 'type' => 'error',
1810 + 'content' => __( 'Invalid backup code.', 'userswp' ),
1811 + )
1812 + );
1813 +
1814 + wp_send_json_error( array( 'message' => $message ) );
1815 + }
1816 +
1817 + \WP2FA\Authenticator\Login::delete_login_nonce( $user->ID );
1818 +
1819 + $rememberme = false;
1820 + $remember = ( isset( $_REQUEST['rememberme'] ) ) ? filter_var( $_REQUEST['rememberme'], FILTER_VALIDATE_BOOLEAN ) : '';
1821 +
1822 + if ( ! empty( $remember ) ) {
1823 + $rememberme = true;
1824 + }
1825 +
1826 + wp_set_auth_cookie( $user->ID, $rememberme );
1827 +
1828 + do_action( 'two_factor_user_authenticated', $user );
1829 +
1830 + if ( defined( 'WP_2FA_PREFIX' ) ) {
1831 + do_action( WP_2FA_PREFIX . 'user_authenticated', $user );
1832 + }
1833 +
1834 + $message = aui()->alert(
1835 + array(
1836 + 'type' => 'success',
1837 + 'content' => __( 'Validation successful. Redirecting...', 'userswp' ),
1838 + )
1839 + );
1840 +
1841 + wp_send_json_success( array( 'message' => $message ) );
1842 + }
1843 +
1844 + public function get_login_redirect_url( $data, $user ) {
1845 + if ( is_int( $user ) ) {
1846 + $user = get_userdata( $user );
1847 + }
1848 +
1849 + $redirect_page_id = uwp_get_option( 'login_redirect_to', - 1 );
1850 + $custom_url = uwp_get_option( 'login_redirect_custom_url' );
1851 +
1852 + if ( $user && isset( $user->roles[0] ) ) {
1853 + $user_role = $user->roles[0];
1854 + $redirect_page_id = uwp_get_option( 'login_redirect_to_' . $user_role, $redirect_page_id );
1855 + $custom_url = uwp_get_option( 'login_redirect_custom_url_' . $user_role );
1856 + }
1857 +
1858 + if ( isset( $_REQUEST['redirect_to'] ) && ! empty( $_REQUEST['redirect_to'] ) ) {
1859 + $redirect_to = esc_url_raw( $_REQUEST['redirect_to'] );
1860 + } elseif ( isset( $data['redirect_to'] ) && ! empty( $data['redirect_to'] ) ) {
1861 + $redirect_to = esc_url_raw( $data['redirect_to'] );
1862 + } elseif ( isset( $redirect_page_id ) && (int) $redirect_page_id > 0 ) {
1863 + if ( uwp_is_wpml() ) {
1864 + $wpml_page_id = uwp_wpml_object_id( $redirect_page_id, 'page', true, ICL_LANGUAGE_CODE );
1865 + if ( ! empty( $wpml_page_id ) ) {
1866 + $redirect_page_id = $wpml_page_id;
1867 + }
1868 + }
1869 + $redirect_to = get_permalink( $redirect_page_id );
1870 + } elseif ( isset( $redirect_page_id ) && (int) $redirect_page_id == - 1 && wp_get_referer() ) {
1871 + $redirect_to = esc_url( wp_get_referer() );
1872 + } elseif ( isset( $redirect_page_id ) && (int) $redirect_page_id == - 2 && ! empty( $custom_url ) ) {
1873 + $redirect_to = $custom_url;
1874 + } else {
1875 + $redirect_to = home_url( '/' );
1876 + $redirect_to = apply_filters( 'login_redirect', $redirect_to, '', $user );
1877 + }
1878 +
1879 + return apply_filters( 'uwp_login_redirect', $redirect_to, $redirect_page_id, $data, $user );
1880 + }
1881 +
1882 + /**
1883 + * Processes forgot password form submission.
1884 + *
1885 + * @since 1.0.0
1886 + * @package userswp
1887 + *
1888 + */
1889 + public function process_forgot() {
1890 +
1891 + $data = $_POST;
1892 +
1893 + if ( ! isset( $data['uwp_forgot_nonce'] ) ) {
1894 + return;
1895 + }
1896 +
1897 + if ( ! isset( $data['uwp_forgot_nonce'] ) || ! wp_verify_nonce( $data['uwp_forgot_nonce'], 'uwp-forgot-nonce' ) ) {
1898 + $message = aui()->alert(
381 1899 array(
382 - 'user_login' => $result['uwp_account_username'],
383 - 'user_password' => $password,
384 - 'remember' => false
1900 + 'type' => 'error',
1901 + 'content' => __( 'Security verification failed. Try again.', 'userswp' ),
385 1902 )
1903 + );
1904 + if ( wp_doing_ajax() ) {
1905 + wp_send_json_error( $message );
1906 + } else {
1907 + return;
1908 + }
1909 + }
1910 +
1911 + global $uwp_notices;
1912 +
1913 + do_action( 'uwp_before_validate', 'forgot' );
1914 +
1915 + $result = uwp_validate_fields( $data, 'forgot' );
1916 +
1917 + $result = apply_filters( 'uwp_validate_result', $result, 'forgot', $data );
1918 +
1919 + if ( is_wp_error( $result ) ) {
1920 + $message = aui()->alert(
1921 + array(
1922 + 'type' => 'error',
1923 + 'content' => $result->get_error_message(),
1924 + )
1925 + );
1926 + if ( wp_doing_ajax() ) {
1927 + wp_send_json_error( $message );
1928 + } else {
1929 + $uwp_notices[] = array( 'forgot' => $message );
1930 +
1931 + return;
1932 + }
1933 + }
1934 +
1935 + do_action( 'uwp_after_validate', $result, 'forgot', $data );
1936 +
1937 + $login_or_email = trim( $data['email'] );
1938 + $user_data = is_email( $login_or_email )
1939 + ? get_user_by( 'email', $login_or_email )
1940 + : get_user_by( 'login', $login_or_email );
1941 +
1942 + // if no user we fake it and bail
1943 + if ( ! $user_data ) {
1944 + $args = apply_filters(
1945 + 'uwp_forgot_error_message',
1946 + array(
1947 + 'type' => 'error',
1948 + 'content' => __( 'Invalid username/email or user doesn\'t exist.', 'userswp' ),
1949 + )
386 1950 );
387 1951
388 - if (is_wp_error($res)) {
389 - $errors->add('invalid_userorpass', __('<strong>Error</strong>: Invalid username or Password.', 'userswp'));
390 - return $errors;
391 - } else {
392 - $reg_redirect_page_id = uwp_get_option('register_redirect_to', '');
393 - if(isset( $_REQUEST['redirect_to'] )) {
394 - $reg_redirect_to = esc_url($_REQUEST['redirect_to']);
395 - } elseif (empty($reg_redirect_page_id)) {
396 - $reg_redirect_to = home_url('/');
397 - } else {
398 - $reg_redirect_to = get_permalink($reg_redirect_page_id);
399 - }
400 - $redirect = apply_filters('uwp_register_redirect', $reg_redirect_to);
401 - wp_redirect($redirect);
402 - exit();
403 - }
404 - } else {
405 - if ($reg_action == 'require_email_activation') {
406 - global $wp;
407 - $resend_link = uwp_current_page_url();
408 - $resend_link = add_query_arg(
1952 + $message = aui()->alert( $args );
1953 + if ( wp_doing_ajax() ) {
1954 + wp_send_json_success( $message );
1955 + } else {
1956 + $uwp_notices[] = array( 'forgot' => $message );
1957 +
1958 + return;
1959 + }
1960 + }
1961 +
1962 + // make sure user account is active before account reset
1963 + $mod_value = get_user_meta( $user_data->ID, 'uwp_mod', true );
1964 + if ( $mod_value == 'email_unconfirmed' ) {
1965 + $resend_link = uwp_get_forgot_page_url();
1966 + $resend_link = add_query_arg(
1967 + array(
1968 + 'user_id' => $user_data->ID,
1969 + 'action' => 'uwp_resend',
1970 + '_nonce' => wp_create_nonce('uwp_resend'),
1971 + ),
1972 + $resend_link
1973 + );
1974 + $message = aui()->alert(
1975 + array(
1976 + 'type' => 'error',
1977 + 'content' => sprintf(__('Your account is not activated yet. Please activate your account first. <a href="%s">Resend</a>.', 'userswp'), $resend_link),
1978 + )
1979 + );
1980 + if ( wp_doing_ajax() ) {
1981 + wp_send_json_error( $message );
1982 + } else {
1983 + $uwp_notices[] = array( 'forgot' => $message );
1984 + return;
1985 + }
1986 + }
1987 +
1988 + $user_data = get_userdata( $user_data->ID );
1989 +
1990 + $allow = apply_filters( 'allow_password_reset', true, $user_data->ID );
1991 +
1992 + if ( ! $allow ) {
1993 + return false;
1994 + } elseif ( is_wp_error( $allow ) ) {
1995 + return false;
1996 + }
1997 +
1998 + $as_password = apply_filters( 'uwp_forgot_message_as_password', false );
1999 +
2000 + $reset_link = '';
2001 +
2002 + if ( $as_password ) {
2003 + $new_pass = wp_generate_password( 12, false );
2004 + wp_set_password( $new_pass, $user_data->ID );
2005 + if ( ! uwp_get_option( 'change_disable_password_nag' ) ) {
2006 + update_user_meta( $user_data->ID, 'default_password_nag', true ); //Set up the Password change nag.
2007 + }
2008 + $message = '<p><b>' . __( 'Your login Information :', 'userswp' ) . '</b></p>';
2009 + $message .= '<p>' . sprintf( __( 'Username: %s', 'userswp' ), $user_data->user_login ) . '</p>';
2010 + $message .= '<p>' . sprintf( __( 'Password: %s', 'userswp' ), $new_pass ) . '</p>';
2011 +
2012 + } else {
2013 + // Use WordPress core to generate, hash (wp_fast_hash in WP 6.8+), and store the reset key.
2014 + // This ensures compatibility with check_password_reset_key() on all WP versions.
2015 + $key = get_password_reset_key( $user_data );
2016 +
2017 + if ( is_wp_error( $key ) ) {
2018 + if ( wp_doing_ajax() ) {
2019 + wp_send_json_error( $key->get_error_message() );
2020 + } else {
2021 + $uwp_notices[] = array( 'forgot' => aui()->alert( array( 'type' => 'error', 'content' => $key->get_error_message() ) ) );
2022 + return;
2023 + }
2024 + }
2025 +
2026 + $message = '<p>' . __( 'You have requested to reset your password for the following account:', 'userswp' ) . '</p>';
2027 + $message .= home_url( '/' ) . '</p>';
2028 + $message .= '<p>' . sprintf( __( 'Username: %s', 'userswp' ), $user_data->user_login ) . '</p>';
2029 + $message .= '<p>' . __( 'If this was by mistake, just ignore this email and nothing will happen.', 'userswp' ) . '</p>';
2030 + $message .= '<p>' . __( 'To reset your password, click the following link and follow the instructions.', 'userswp' ) . '</p>';
2031 + $reset_page = uwp_get_page_id( 'reset_page', false );
2032 + if ( $reset_page ) {
2033 + $reset_link = add_query_arg(
409 2034 array(
410 - 'user_id' => $user_id,
411 - 'action' => 'uwp_resend',
412 - '_nonce' => wp_create_nonce('uwp_resend'),
2035 + 'key' => $key,
2036 + 'login' => rawurlencode( $user_data->user_login ),
413 2037 ),
414 - $resend_link
2038 + get_permalink( $reset_page )
415 2039 );
416 - return sprintf(__('An email has been sent to your registered email address. Please click the activation link to proceed. %sResend%s.', 'userswp'), '<a href="'.$resend_link.'"">', '</a>');
417 - } elseif ($reg_action == 'require_admin_review' && defined('UWP_MOD_VERSION')) {
418 - update_user_meta( $user_id, 'uwp_mod', '1' );
2040 + $message .= "<a href='" . $reset_link . "' target='_blank'>" . $reset_link . '</a>' . "\r\n";
2041 + } else {
2042 + $reset_link = home_url( "reset?key=$key&login=" . rawurlencode( $user_data->user_login ), 'login' );
2043 + $message .= "<a href='" . $reset_link . "' target='_blank'>" . $reset_link . '</a>' . "\r\n";
2044 + }
2045 + $message = apply_filters( 'uwp_forgot_password_message', $message, $user_data, $reset_link );
2046 + }
419 2047
420 - $email = new UsersWP_Mails();
421 - $send_result = $email->send( 'mod_pending', $user_id );
422 - $user_data = get_user_by('id', $user_id);
423 - $send_result = apply_filters('uwp_forms_check_for_send_mail_errors', $send_result, $user_data, $errors);
424 - if (is_wp_error($send_result)) {
425 - return $send_result;
426 - }
2048 + $message = apply_filters( 'uwp_forgot_mail_message', $message, $user_data->ID );
427 2049
428 - $admin_send_result = $email->send_admin_email('mod_admin', $user_id);
429 - if (is_wp_error($admin_send_result)) {
430 - return $admin_send_result;
431 - }
2050 + $email_vars = array(
2051 + 'user_id' => $user_data->ID,
2052 + 'login_details' => $message,
2053 + 'reset_link' => $reset_link,
2054 + );
432 2055
433 - return __('Your account is under moderation. We will email you once its approved.', 'userswp');
434 - } else {
2056 + UsersWP_Mails::send( $user_data->user_email, 'forgot_password', $email_vars );
435 2057
436 - $login_page_url = wp_login_url();
2058 + do_action( 'uwp_after_process_forgot', $data );
437 2059
438 - if ($generated_password) {
439 - return sprintf(__('Account registered successfully. A password has been generated and mailed to your registered Email ID. Please login %shere%s.', 'userswp'), '<a href="'.$login_page_url.'">', '</a>');
440 - } else {
441 - return sprintf(__('Account registered successfully. Please login %shere%s', 'userswp'), '<a href="'.$login_page_url.'">', '</a>');
442 - }
443 - }
444 - }
2060 + $message = aui()->alert(
2061 + array(
2062 + 'type' => 'success',
2063 + 'content' => apply_filters( 'uwp_change_password_success_message', __( 'Please check your email.', 'userswp' ), $data ),
2064 + )
2065 + );
2066 + if ( wp_doing_ajax() ) {
2067 + wp_send_json_success( $message );
2068 + } else {
2069 + $uwp_notices[] = array( 'forgot' => $message );
2070 + }
2071 + }
445 2072
2073 + /**
2074 + * Processes change password form submission.
2075 + *
2076 + * @since 1.0.0
2077 + * @package userswp
2078 + *
2079 + */
2080 + public function process_change() {
446 2081
447 - }
2082 + $data = $_POST;
448 2083
449 - /**
450 - * Processes login form submission.
451 - *
452 - * @since 1.0.0
453 - * @package userswp
454 - *
455 - * @param array $data Submitted $_POST data
456 - *
457 - * @return bool|WP_Error|string
458 - */
459 - public function process_login($data) {
2084 + if ( ! isset( $data['uwp_change_nonce'] ) || ! wp_verify_nonce( $data['uwp_change_nonce'], 'uwp-change-nonce' ) ) {
2085 + return;
2086 + }
460 2087
461 - $errors = new WP_Error();
2088 + global $uwp_notices;
462 2089
463 - if( ! isset( $data['uwp_login_nonce'] ) || ! wp_verify_nonce( $data['uwp_login_nonce'], 'uwp-login-nonce' ) ) {
464 - return false;
465 - }
2090 + if ( is_uwp_account_page() ) {
2091 + $notice_type = 'account';
2092 + } else {
2093 + $notice_type = 'change';
2094 + }
466 2095
467 - do_action('uwp_before_validate', 'login');
2096 + do_action( 'uwp_before_validate', 'change' );
468 2097
469 - $result = uwp_validate_fields($data, 'login');
2098 + $result = uwp_validate_fields( $data, 'change' );
470 2099
471 - $result = apply_filters('uwp_validate_result', $result, 'login', $data);
2100 + $result = apply_filters( 'uwp_validate_result', $result, 'change', $data );
472 2101
473 - if (is_wp_error($result)) {
474 - return $result;
475 - }
2102 + if ( is_wp_error( $result ) ) {
2103 + $message = aui()->alert(
2104 + array(
2105 + 'type' => 'error',
2106 + 'content' => $result->get_error_message(),
2107 + )
2108 + );
2109 + $uwp_notices[] = array( $notice_type => $message );
476 2110
477 - do_action('uwp_after_validate', 'login');
2111 + return;
2112 + }
478 2113
479 - if (isset($data['remember_me']) && $data['remember_me'] == 'forever') {
480 - $remember_me = true;
481 - } else {
482 - $remember_me = false;
483 - }
2114 + do_action( 'uwp_after_validate', $result, 'change', $data );
484 2115
485 - remove_action( 'authenticate', 'gglcptch_login_check', 21, 1 );
2116 + $user_data = get_user_by( 'id', get_current_user_id() );
486 2117
487 - $res = wp_signon(
2118 + if ( ! $user_data ) {
2119 + $message = aui()->alert(
2120 + array(
2121 + 'type' => 'error',
2122 + 'content' => $user_data->get_error_message(),
2123 + )
2124 + );
2125 + $uwp_notices[] = array( $notice_type => $message );
2126 +
2127 + return;
2128 + }
2129 +
2130 + $email_vars = array(
2131 + 'user_id' => $user_data->ID,
2132 + );
2133 +
2134 + UsersWP_Mails::send( $user_data->user_email, 'change_password', $email_vars );
2135 +
2136 + wp_set_password( $result['password'], $user_data->ID );
2137 +
2138 + $password_nag = get_user_option( 'default_password_nag', $user_data->ID );
2139 + if ( $password_nag ) {
2140 + delete_user_meta( $user_data->ID, 'default_password_nag' );
2141 + }
2142 +
2143 + delete_user_meta( $user_data->ID, 'is_uwp_social_login_no_password' );
2144 +
2145 + $message = aui()->alert(
488 2146 array(
489 - 'user_login' => $result['uwp_login_username'],
490 - 'user_password' => $result['password'],
491 - 'remember' => $remember_me
2147 + 'type' => 'success',
2148 + 'content' => apply_filters( 'uwp_change_password_success_message', __( 'Password changed successfully.', 'userswp' ), $data ),
492 2149 )
493 - );
2150 + );
494 2151
495 - add_action( 'authenticate', 'gglcptch_login_check', 21, 1 );
2152 + $uwp_notices[] = array( $notice_type => $message );
496 2153
497 - if (is_wp_error($res)) {
498 - $errors->add('invalid_userorpass', __('<strong>Error</strong>: Invalid username or Password.', 'userswp'));
499 - return $errors;
500 - } else {
501 - $redirect_page_id = uwp_get_option('login_redirect_to', -1);
502 - if (isset($_REQUEST['redirect_to']) && !empty($_REQUEST['redirect_to'])) {
503 - $redirect_to = esc_url($_REQUEST['redirect_to']);
504 - } elseif (isset($data['redirect_to']) && !empty($data['redirect_to'])) {
505 - $redirect_to = esc_url($data['redirect_to']);
506 - } elseif (isset($redirect_page_id) && (int)$redirect_page_id > 0) {
507 - $redirect_to = get_permalink($redirect_page_id);
508 - } else {
509 - if ( current_user_can('manage_options') ) {
510 - $redirect_to = admin_url();
511 - } else {
512 - $redirect_to = home_url('/');
513 - }
514 - }
2154 + do_action( 'uwp_after_process_change', $data );
515 2155
516 - $redirect_to = apply_filters('uwp_login_redirect', $redirect_to);
517 - wp_redirect($redirect_to);
518 - exit();
519 - }
520 - }
2156 + wp_logout();
2157 + exit();
2158 + }
521 2159
522 - /**
523 - * Processes forgot password form submission.
524 - *
525 - * @since 1.0.0
526 - * @package userswp
527 - *
528 - * @param array $data Submitted $_POST data
529 - *
530 - * @return bool|WP_Error|string
531 - */
532 - public function process_forgot($data) {
2160 + /**
2161 + * Processes reset password form submission.
2162 + *
2163 + * @since 1.0.0
2164 + * @package userswp
2165 + *
2166 + */
2167 + public function process_reset() {
533 2168
534 - $errors = new WP_Error();
2169 + $data = $_POST;
535 2170
536 - if( ! isset( $data['uwp_forgot_nonce'] ) || ! wp_verify_nonce( $data['uwp_forgot_nonce'], 'uwp-forgot-nonce' ) ) {
537 - return false;
538 - }
2171 + if ( isset( $data['uwp_reset_hp'] ) && '' != $data['uwp_reset_hp'] ) {
2172 + wp_die( esc_html__( 'No spam please!', 'userswp' ) );
2173 + }
539 2174
540 - do_action('uwp_before_validate', 'forgot');
2175 + if ( ! isset( $data['uwp_reset_nonce'] ) || ! wp_verify_nonce( $data['uwp_reset_nonce'], 'uwp-reset-nonce' ) ) {
2176 + return;
2177 + }
541 2178
542 - $result = uwp_validate_fields($data, 'forgot');
2179 + global $uwp_notices;
543 2180
544 - $result = apply_filters('uwp_validate_result', $result, 'forgot', $data);
2181 + do_action( 'uwp_before_validate', 'reset' );
545 2182
546 - if (is_wp_error($result)) {
547 - return $result;
548 - }
2183 + $result = uwp_validate_fields( $data, 'reset' );
549 2184
550 - do_action('uwp_after_validate', 'forgot');
2185 + $result = apply_filters( 'uwp_validate_result', $result, 'reset', $data );
551 2186
2187 + if ( is_wp_error( $result ) ) {
2188 + $message = aui()->alert(
2189 + array(
2190 + 'type' => 'error',
2191 + 'content' => $result->get_error_message(),
2192 + )
2193 + );
2194 + $uwp_notices[] = array( 'reset' => $message );
552 2195
553 - $user_data = get_user_by('email', $data['uwp_forgot_email']);
2196 + return;
2197 + }
554 2198
555 - // make sure user account is active before account reset
556 - $mod_value = get_user_meta( $user_data->ID, 'uwp_mod', true );
557 - if ($mod_value == 'email_unconfirmed') {
558 - $errors->add('activate_account', __('<strong>Error</strong>: Your account is not activated yet. Please activate your account first.', 'userswp'));
559 - }
2199 + do_action( 'uwp_after_validate', $result, 'reset', $data );
560 2200
561 - $error_code = $errors->get_error_code();
562 - if (!empty($error_code)) {
563 - return $errors;
564 - }
565 -
566 - $email = new UsersWP_Mails();
567 - $send_result = $email->send( 'forgot', $user_data->ID );
568 -
569 - $send_result = apply_filters('uwp_forms_check_for_send_mail_errors', $send_result, $user_data, $errors);
570 - if (is_wp_error($send_result)) {
571 - return $send_result;
572 - }
2201 + $login = sanitize_text_field( $data['uwp_reset_username'] );
2202 + $key = sanitize_text_field( $data['uwp_reset_key'] );
573 2203
574 - return true;
575 - }
2204 + $user = get_user_by( 'login', $login );
2205 + if ( ! $user ) {
2206 + $message = aui()->alert(
2207 + array(
2208 + 'type' => 'error',
2209 + 'content' => __( 'Invalid username.', 'userswp' ),
2210 + )
2211 + );
2212 + $uwp_notices[] = array( 'reset' => $message );
576 2213
577 - /**
578 - * Processes change password form submission.
579 - *
580 - * @since 1.0.0
581 - * @package userswp
582 - *
583 - * @param array $data Submitted $_POST data
584 - *
585 - * @return bool|WP_Error|string
586 - */
587 - public function process_change($data) {
2214 + return;
2215 + }
588 2216
589 - $errors = new WP_Error();
2217 + clean_user_cache( $user );
590 2218
591 - if( ! isset( $data['uwp_change_nonce'] ) || ! wp_verify_nonce( $data['uwp_change_nonce'], 'uwp-change-nonce' ) ) {
592 - return false;
593 - }
2219 + $user_data = check_password_reset_key( $key, $login );
594 2220
595 - do_action('uwp_before_validate', 'change');
2221 + if ( is_wp_error( $user_data ) ) {
2222 + $error = apply_filters( 'uwp_reset_password_error_message', $user_data->get_error_message(), $user_data );
2223 + $message = aui()->alert(
2224 + array(
2225 + 'type' => 'error',
2226 + 'content' => $error,
2227 + )
2228 + );
2229 + $uwp_notices[] = array( 'reset' => $message );
596 2230
597 - $result = uwp_validate_fields($data, 'change');
2231 + return;
2232 + }
598 2233
599 - $result = apply_filters('uwp_validate_result', $result, 'change', $data);
2234 + $email_vars = array(
2235 + 'user_id' => $user_data->ID,
2236 + );
600 2237
601 - if (is_wp_error($result)) {
602 - return $result;
603 - }
2238 + UsersWP_Mails::send( $user_data->user_email, 'reset_password', $email_vars );
604 2239
605 - do_action('uwp_after_validate', 'change');
2240 + wp_set_password( $data['password'], $user_data->ID );
606 2241
607 - $user_data = get_user_by('id', get_current_user_id());
2242 + $login_page_url = uwp_get_login_page_url();
2243 + $message = sprintf( __( 'Password updated successfully. Please <a href="%s">login</a> with your new password.', 'userswp' ), $login_page_url );
2244 + $message = apply_filters( 'uwp_reset_password_success_message', $message, $data );
2245 + $message = aui()->alert(
2246 + array(
2247 + 'type' => 'success',
2248 + 'content' => $message,
2249 + )
2250 + );
2251 + $uwp_notices[] = array( 'reset' => $message );
608 2252
609 - if (is_wp_error($user_data)) {
610 - return $user_data;
611 - }
2253 + do_action( 'uwp_after_process_reset', $data );
2254 + }
612 2255
613 - $email = new UsersWP_Mails();
614 - $send_result = $email->send( 'change', $user_data->ID );
2256 + /**
2257 + * Processes account form submission.
2258 + *
2259 + * @since 1.0.0
2260 + * @package userswp
2261 + *
2262 + */
2263 + public function process_account() {
615 2264
616 - $send_result = apply_filters('uwp_forms_check_for_send_mail_errors', $send_result, $user_data, $errors);
617 - if (is_wp_error($send_result)) {
618 - return $send_result;
619 - }
2265 + $data = wp_unslash( $_POST );
2266 + $files = $_FILES;
620 2267
621 - wp_set_password( $data['uwp_change_password'], $user_data->ID );
622 - wp_set_auth_cookie( $user_data->ID, false);
2268 + if ( ! isset( $data['uwp_account_nonce'] ) || ! wp_verify_nonce( $data['uwp_account_nonce'], 'uwp-account-nonce' ) ) {
2269 + return;
2270 + }
623 2271
624 - return true;
625 - }
2272 + if ( ! is_user_logged_in() ) {
2273 + return;
2274 + }
626 2275
627 - /**
628 - * Processes reset password form submission.
629 - *
630 - * @since 1.0.0
631 - * @package userswp
632 - *
633 - * @param array $data Submitted $_POST data
634 - *
635 - * @return bool|WP_Error|string
636 - */
637 - public function process_reset($data) {
2276 + global $uwp_notices;
2277 + $file_obj = new UsersWP_Files();
638 2278
639 - $errors = new WP_Error();
2279 + do_action( 'uwp_before_validate', 'account' );
640 2280
641 - if( ! isset( $data['uwp_reset_nonce'] ) || ! wp_verify_nonce( $data['uwp_reset_nonce'], 'uwp-reset-nonce' ) ) {
642 - return false;
643 - }
2281 + $result = uwp_validate_fields( $data, 'account' );
644 2282
645 - do_action('uwp_before_validate', 'reset');
2283 + $result = apply_filters( 'uwp_validate_result', $result, 'account', $data );
646 2284
647 - $result = uwp_validate_fields($data, 'reset');
2285 + if ( is_wp_error( $result ) ) {
2286 + $message = aui()->alert(
2287 + array(
2288 + 'type' => 'error',
2289 + 'content' => $result->get_error_message(),
2290 + )
2291 + );
2292 + $uwp_notices[] = array( 'account' => $message );
648 2293
649 - $result = apply_filters('uwp_validate_result', $result, 'reset', $data);
2294 + return;
2295 + }
650 2296
651 - if (is_wp_error($result)) {
652 - return $result;
653 - }
2297 + $uploads_result = $file_obj->validate_uploads( $files, 'account' );
654 2298
655 - do_action('uwp_after_validate', 'reset');
2299 + if ( is_wp_error( $uploads_result ) ) {
2300 + $message = aui()->alert(
2301 + array(
2302 + 'type' => 'error',
2303 + 'content' => $uploads_result->get_error_message(),
2304 + )
2305 + );
2306 + $uwp_notices[] = array( 'account' => $message );
656 2307
657 - $login = $data['uwp_reset_username'];
658 - $key = $data['uwp_reset_key'];
659 - $user_data = check_password_reset_key( $key, $login );
2308 + return;
2309 + }
660 2310
661 - if (is_wp_error($user_data)) {
662 - return $user_data;
663 - }
2311 + do_action( 'uwp_after_validate', $result, 'account', $data );
664 2312
665 - $email = new UsersWP_Mails();
666 - $send_result = $email->send( 'reset', $user_data->ID );
2313 + //unset if value is empty for files
2314 + foreach ( $uploads_result as $upload_file_key => $upload_file_value ) {
2315 + if ( empty( $upload_file_value ) ) {
2316 + unset( $uploads_result[ $upload_file_key ] );
2317 + }
2318 + }
667 2319
668 - $send_result = apply_filters('uwp_forms_check_for_send_mail_errors', $send_result, $user_data, $errors);
669 - if (is_wp_error($send_result)) {
670 - return $send_result;
671 - }
2320 + global $wpdb;
2321 + $file_field_names = $wpdb->get_col(
2322 + $wpdb->prepare(
2323 + "SELECT htmlvar_name FROM " . uwp_get_table_prefix() . "uwp_form_fields WHERE form_type = %s AND field_type IN ('file','image')",
2324 + 'account'
2325 + )
2326 + );
2327 + foreach ( $file_field_names as $file_field_name ) {
2328 + if ( isset( $result[ $file_field_name ] ) && ! isset( $uploads_result[ $file_field_name ] ) ) {
2329 + unset( $result[ $file_field_name ] );
2330 + }
2331 + }
672 2332
673 - wp_set_password( $data['uwp_reset_password'], $user_data->ID );
2333 + $result = array_merge( $result, $uploads_result );
674 2334
675 - return true;
676 - }
2335 + $args = array(
2336 + 'ID' => get_current_user_id(),
2337 + );
677 2338
678 - /**
679 - * Modifies the mail extras based on the notification type.
680 - *
681 - * @since 1.0.0
682 - * @package userswp
683 - * @subpackage userswp/includes
684 - * @param string $extras Unmodified mail extras.
685 - * @param string $type Notification type.
686 - * @return string Modified mail extras.
687 - */
688 - public function init_mail_extras($extras, $type, $user_id) {
689 - switch ($type) {
690 - case "activate":
691 - $extras = $this->generate_activate_message($user_id);
692 - break;
693 - case "register":
694 - $extras = $this->generate_register_message($user_id);
695 - break;
696 - case "forgot":
697 - $extras = $this->generate_forgot_message($user_id);
698 - }
699 - return $extras;
700 - }
2339 + if ( isset( $result['first_name'] ) && isset( $result['last_name'] ) ) {
2340 + $args['display_name'] = $result['first_name'] . ' ' . $result['last_name'];
2341 + }
701 2342
702 - /**
703 - * Modifies the admin mail extras based on the notification type.
704 - *
705 - * @since 1.0.0
706 - * @package userswp
707 - * @subpackage userswp/includes
708 - * @param string $extras Unmodified mail extras.
709 - * @param string $type Notification type.
710 - * @return string Modified mail extras.
711 - */
712 - public function init_admin_mail_extras($extras, $type, $user_id) {
713 - switch ($type) {
714 - case "register_admin":
715 - $user_data = get_userdata($user_id);
716 - $extras = __('<p><b>' . __('User Information :', 'userswp') . '</b></p>
717 - <p>' . __('First Name:', 'userswp') . ' ' . $user_data->first_name . '</p>
718 - <p>' . __('Last Name:', 'userswp') . ' ' . $user_data->last_name . '</p>
719 - <p>' . __('Username:', 'userswp') . ' ' . $user_data->user_login . '</p>
720 - <p>' . __('Email:', 'userswp') . ' ' . $user_data->user_email . '</p>');
721 - break;
722 - }
723 - return $extras;
724 - }
2343 + if ( isset( $result['first_name'] ) ) {
2344 + $args['first_name'] = $result['first_name'];
2345 + }
725 2346
726 - /**
727 - * Generates activate email message.
728 - *
729 - * @since 1.0.0
730 - * @package userswp
731 - *
732 - * @param int $user_id User ID.
733 - *
734 - * @return bool|string Message.
735 - */
736 - public function generate_activate_message($user_id) {
2347 + if ( isset( $result['last_name'] ) ) {
2348 + $args['last_name'] = $result['last_name'];
2349 + }
737 2350
738 - $user_data = get_userdata($user_id);
739 - global $wpdb;
740 - $key = wp_generate_password( 20, false );
741 - do_action( 'uwp_activation_key', $user_data->user_login, $key );
2351 + if ( isset( $result['user_url'] ) ) {
2352 + $args['user_url'] = $result['user_url'];
2353 + }
742 2354
743 - global $wp_hasher;
744 - if ( empty( $wp_hasher ) ) {
745 - require_once ABSPATH . 'wp-includes/class-phpass.php';
746 - $wp_hasher = new PasswordHash( 8, true );
747 - }
748 - $hashed = $wp_hasher->HashPassword( $key );
749 - $wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_data->user_login ) );
750 - update_user_meta( $user_id, 'uwp_mod', 'email_unconfirmed' );
751 - $message = __('To activate your account, visit the following address:', 'userswp') . "\r\n\r\n";
752 - $act_url = add_query_arg(
753 - array(
754 - 'uwp_activate' => 'yes',
755 - 'key' => $key,
756 - 'login' => $user_data->user_login
757 - ),
758 - site_url()
759 - );
2355 + if ( isset( $result['display_name'] ) && ! empty( $result['display_name'] ) ) {
2356 + $args['display_name'] = $result['display_name'];
2357 + }
760 2358
761 - $message .= "<a href='".$act_url."' target='_blank'>".$act_url."</a>" . "\r\n";
2359 + if ( isset( $result['password'] ) ) {
2360 + $args['user_pass'] = $result['password'];
2361 + }
762 2362
763 - $activate_message = __('<p><b>' . __('Please activate your account :', 'userswp') . '</b></p>
764 - <p>' . $message . '</p>');
2363 + $user_id = wp_update_user( $args );
765 2364
766 - return apply_filters('uwp_activation_mail_message', $activate_message, $user_id);
2365 + if ( is_wp_error( $user_id ) ) {
2366 + $message = aui()->alert(
2367 + array(
2368 + 'type' => 'error',
2369 + 'content' => sprintf( __( '%s', 'userswp' ), $user_id->get_error_message() ),
2370 + )
2371 + );
2372 + $uwp_notices[] = array( 'account' => $message );
767 2373
768 - }
2374 + return;
2375 + }
769 2376
770 - /**
771 - * Generates register email message.
772 - *
773 - * @since 1.0.0
774 - * @package userswp
775 - *
776 - * @param int $user_id User ID.
777 - *
778 - * @return bool|string Message.
779 - */
780 - public function generate_register_message($user_id) {
2377 + $res = $this->save_user_extra_fields( $user_id, $result, 'account' );
781 2378
782 - $user_data = get_userdata($user_id);
783 - if(isset($this->generated_password) && !empty($this->generated_password)) {
784 - if(!uwp_get_option('change_disable_password_nag')) {
785 - update_user_meta($user_id, 'default_password_nag', true); //Set up the Password change nag.
786 - }
787 - $message_pass = $this->generated_password;
788 - $this->generated_password = false;
789 - } else {
790 - $message_pass = __("Password you entered", 'userswp');
791 - }
792 - $message = __('<p><b>' . __('Your login Information :', 'userswp') . '</b></p>
793 - <p>' . __('Username:', 'userswp') . ' ' . $user_data->user_login . '</p>
794 - <p>' . __('Password:', 'userswp') . ' ' . $message_pass . '</p>');
2379 + if ( ! $res ) {
2380 + $message = aui()->alert(
2381 + array(
2382 + 'type' => 'error',
2383 + 'content' => __( 'Something went wrong. Please contact site admin.', 'userswp' ),
2384 + )
2385 + );
2386 + $uwp_notices[] = array( 'account' => $message );
795 2387
796 - return apply_filters('uwp_register_mail_message', $message, $user_id, $this->generated_password);
2388 + return;
2389 + }
797 2390
798 - }
799 -
800 - /**
801 - * Generates forgot password email message.
802 - *
803 - * @since 1.0.0
804 - * @package userswp
805 - *
806 - * @param int $user_id User ID.
807 - *
808 - * @return bool|string Message.
809 - */
810 - public function generate_forgot_message($user_id) {
2391 + //updating bio field after saving extra fields to reflect the points in mycred add on.
2392 + if ( isset( $result['bio'] ) && ! empty( $result['bio'] ) ) {
2393 + $args = array(
2394 + 'ID' => $user_id,
2395 + 'description' => $result['bio'],
2396 + );
2397 + wp_update_user( $args );
2398 + }
811 2399
812 - $user_data = get_userdata($user_id);
813 - global $wpdb, $wp_hasher;
2400 + $user_data = get_userdata( $user_id );
814 2401
815 - $allow = apply_filters('allow_password_reset', true, $user_data->ID);
816 - if ( ! $allow )
817 - return false;
818 - else if ( is_wp_error($allow) )
819 - return false;
2402 + $form_fields = apply_filters( 'uwp_send_mail_form_fields', '', 'account', $user_id );
820 2403
821 - $as_password = apply_filters('uwp_forgot_message_as_password', false);
2404 + if ( isset( $result['email'] ) && $user_data->user_email !== trim( $result['email'] ) ) {
822 2405
823 - if ($as_password) {
824 - $new_pass = wp_generate_password(12, false);
825 - wp_set_password($new_pass, $user_data->ID);
826 - if(!uwp_get_option('change_disable_password_nag')) {
827 - update_user_meta($user_data->ID, 'default_password_nag', true); //Set up the Password change nag.
828 - }
829 - $message = '<p><b>' . __('Your login Information :', 'userswp') . '</b></p>';
830 - $message .= '<p>' . sprintf(__('Username: %s', 'userswp'), $user_data->user_login) . "</p>";
831 - $message .= '<p>' . sprintf(__('Password: %s', 'userswp'), $new_pass) . "</p>";
2406 + if ( email_exists( trim( $result['email'] ) ) ) {
2407 + $message = aui()->alert(
2408 + array(
2409 + 'type' => 'error',
2410 + 'content' => __( 'This email is already registered, please choose another one.', 'userswp' ),
2411 + )
2412 + );
832 2413
833 - } else {
834 - $key = wp_generate_password( 20, false );
835 - do_action( 'retrieve_password_key', $user_data->user_login, $key );
2414 + $uwp_notices[] = array( 'account' => $message );
2415 + return;
836 2416
837 - if ( empty( $wp_hasher ) ) {
838 - require_once ABSPATH . 'wp-includes/class-phpass.php';
839 - $wp_hasher = new PasswordHash( 8, true );
840 - }
841 - $hashed = $wp_hasher->HashPassword( $key );
842 - $wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_data->user_login ) );
843 - $message = '<p>' .__('You have requested to reset your password for the following account:', 'userswp') . "</p>";
844 - $message .= home_url( '/' ) . "</p>";
845 - $message .= '<p>' .sprintf(__('Username: %s', 'userswp'), $user_data->user_login) . "</p>";
846 - $message .= '<p>' .__('If this was by mistake, just ignore this email and nothing will happen.', 'userswp') . "</p>";
847 - $message .= '<p>' .__('To reset your password, click the following link and follow the instructions.', 'userswp') . "</p>";
848 - $message = apply_filters('uwp_forgot_password_message', $message, $user_data);
849 - $reset_page = uwp_get_page_id('reset_page', false);
850 - if ($reset_page) {
851 - $reset_link = add_query_arg( array(
852 - 'key' => $key,
853 - 'login' => rawurlencode($user_data->user_login),
854 - ), get_permalink($reset_page) );
855 - $message .= "<a href='".$reset_link."' target='_blank'>".$reset_link."</a>" . "\r\n";
856 - } else {
857 - $message .= site_url("reset?key=$key&login=" . rawurlencode($user_data->user_login), 'login') . "\r\n";
858 - }
859 - }
2417 + }
860 2418
2419 + $hash = md5( $result['email'] . time() . wp_rand() );
2420 + $new_admin_email = array(
2421 + 'hash' => $hash,
2422 + 'newemail' => $result['email'],
2423 + );
861 2424
862 - return $message;
2425 + update_user_meta( get_current_user_id(), 'uwp_update_email_hash', $new_admin_email );
863 2426
864 - }
2427 + $new_email_link = add_query_arg(
2428 + array(
2429 + 'uwp_new_email' => 'yes',
2430 + 'key' => $hash,
2431 + 'login' => $user_data->user_login,
2432 + ),
2433 + uwp_get_account_page_url()
2434 + );
865 2435
866 - /**
867 - * Processes account form submission.
868 - *
869 - * @since 1.0.0
870 - * @package userswp
871 - *
872 - * @param array $data Submitted $_POST data
873 - * @param array $files Submitted $_FILES data
874 - *
875 - * @return bool|WP_Error|string
876 - */
877 - public function process_account($data = array(), $files = array()) {
2436 + $email_vars = array(
2437 + 'user_id' => $user_id,
2438 + 'new_email' => $result['email'],
2439 + 'new_email_link' => esc_url( $new_email_link ),
2440 + );
878 2441
879 - $file_obj = new UsersWP_Files();
880 -
881 - $current_user_id = get_current_user_id();
882 - if (!$current_user_id) {
883 - return false;
884 - }
2442 + UsersWP_Mails::send( $result['email'], 'account_new_email_activation', $email_vars );
885 2443
886 - $errors = new WP_Error();
2444 + $message = apply_filters( 'uwp_account_pending_new_email_activation_message', __( 'Account updated successfully. The new address will become active once you confirm via activation link sent to your new email.', 'userswp' ), $data );
2445 + $message = aui()->alert(
2446 + array(
2447 + 'type' => 'success',
2448 + 'content' => $message,
2449 + )
2450 + );
887 2451
888 - if( ! isset( $data['uwp_account_nonce'] ) || ! wp_verify_nonce( $data['uwp_account_nonce'], 'uwp-account-nonce' ) ) {
889 - return false;
890 - }
2452 + $uwp_notices[] = array( 'account' => $message );
891 2453
892 - do_action('uwp_before_validate', 'account');
2454 + } else {
2455 + $email_vars = array(
2456 + 'user_id' => $user_id,
2457 + 'form_fields' => $form_fields,
2458 + );
893 2459
894 - $result = uwp_validate_fields($data, 'account');
2460 + UsersWP_Mails::send( $user_data->user_email, 'account_update', $email_vars );
895 2461
896 - $result = apply_filters('uwp_validate_result', $result, 'account', $data);
2462 + $message = apply_filters( 'uwp_account_update_success_message', __( 'Account updated successfully.', 'userswp' ), $data );
2463 + $message = aui()->alert(
2464 + array(
2465 + 'type' => 'success',
2466 + 'content' => $message,
2467 + )
2468 + );
897 2469
898 - if (is_wp_error($result)) {
899 - return $result;
2470 + $uwp_notices[] = array( 'account' => $message );
900 2471 }
901 2472
902 - $uploads_result = $file_obj->uwp_validate_uploads($files, 'account');
2473 + do_action( 'uwp_after_process_account', $data, $user_id );
2474 + }
903 2475
904 - if (is_wp_error($uploads_result)) {
905 - return $uploads_result;
906 - }
2476 + /**
2477 + * Modifies the forms field in email based on the form type.
2478 + *
2479 + * @param string $form_fields Form fields.
2480 + * @param string $type Form type.
2481 + * @param int $user_id User ID.
2482 + *
2483 + * @return string Modified mail field.
2484 + * @package userswp
2485 + * @subpackage userswp/includes
2486 + *
2487 + */
2488 + public function init_mail_form_fields( $form_fields, $type, $user_id ) {
2489 + switch ( $type ) {
2490 + case 'register':
2491 + $form_id = get_user_meta( $user_id, '_uwp_register_form_id', true );
2492 + $fields = get_register_form_fields( $form_id );
2493 + $user_data = get_userdata( $user_id );
2494 + if ( ! empty( $fields ) && is_array( $fields ) ) {
2495 + $form_fields = '<p><b>' . __( 'User Information:', 'userswp' ) . '</b></p>';
2496 + $excluded = uwp_get_excluded_fields();
2497 + foreach ( $fields as $key => $field ) {
2498 + if ( $field->is_active != '1' || in_array( $field->htmlvar_name, $excluded ) ) {
2499 + continue;
2500 + }
2501 + if ( $field->htmlvar_name == 'email' && isset( $user_data->user_email ) ) {
2502 + $field_value = $user_data->user_email;
2503 + } elseif ( $field->htmlvar_name == 'display_name' && isset( $user_data->user_login ) ) {
2504 + $field_value = $user_data->user_login;
2505 + } elseif ( $field->htmlvar_name == 'bio' ) {
2506 + $field_value = get_user_meta( $user_id, 'description', true );
2507 + } else {
2508 + $field_value = uwp_get_usermeta( $user_id, $field->htmlvar_name );
2509 + }
907 2510
908 - do_action('uwp_after_validate', 'account');
2511 + if ( is_array( $field_value ) && count( $field_value ) > 0 ) {
2512 + $field_value = uwp_maybe_serialize( $field->htmlvar_name, $field_value );
2513 + }
909 2514
910 - //unset if value is empty for files
911 - foreach ($uploads_result as $upload_file_key => $upload_file_value) {
912 - if (empty($upload_file_value)) {
913 - unset($uploads_result[$upload_file_key]);
914 - }
915 - }
2515 + if ( isset( $field->site_title ) && ! empty( $field_value ) ) {
2516 + $form_fields .= '<p><b>' . __( wp_unslash( $field->site_title ), 'userswp' ) . '</b>:&nbsp;' . $field_value . '</p>';
2517 + }
2518 + }
2519 + }
2520 + break;
2521 + case 'account':
2522 + $fields = get_account_form_fields();
2523 + $user_data = get_userdata( $user_id );
2524 + if ( ! empty( $fields ) && is_array( $fields ) ) {
2525 + $form_fields = '<p><b>' . __( 'User Information:', 'userswp' ) . '</b></p>';
2526 + foreach ( $fields as $key => $field ) {
2527 + if ( $field->is_active != '1' ) {
2528 + continue;
2529 + }
2530 + if ( $field->htmlvar_name == 'email' && isset( $user_data->user_email ) ) {
2531 + $field_value = $user_data->user_email;
2532 + } elseif ( $field->htmlvar_name == 'display_name' && isset( $user_data->user_login ) ) {
2533 + $field_value = $user_data->user_login;
2534 + } elseif ( $field->htmlvar_name == 'bio' ) {
2535 + $field_value = get_user_meta( $user_id, 'description', true );
2536 + } else {
2537 + $field_value = uwp_get_usermeta( $user_id, $field->htmlvar_name );
2538 + }
916 2539
917 - $result = array_merge( $result, $uploads_result );
2540 + if ( is_array( $field_value ) && count( $field_value ) > 0 ) {
2541 + $field_value = uwp_maybe_serialize( $field->htmlvar_name, $field_value );
2542 + }
918 2543
2544 + if ( isset( $field->site_title ) && ! empty( $field_value ) ) {
2545 + $form_fields .= '<p><b>' . __( wp_unslash( $field->site_title ), 'userswp' ) . '</b>:&nbsp;' . $field_value . '</p>';
2546 + }
2547 + }
2548 + }
2549 + break;
2550 + }
919 2551
920 - $args = array(
921 - 'ID' => $current_user_id
922 - );
2552 + return apply_filters( 'uwp_mail_form_fields', $form_fields, $type, $user_id );
2553 + }
923 2554
924 - if (isset($result['uwp_account_email'])) {
925 - $args['user_email'] = $result['uwp_account_email'];
926 - }
2555 + /**
2556 + *
2557 + *
2558 + * @return void
2559 + * @since 1.0.12 Unlink file.
2560 + * @package userswp
2561 + * @since 1.0.0
2562 + */
2563 + public function upload_file_remove() {
2564 + global $wpdb;
927 2565
928 - if (isset($result['uwp_account_first_name']) && isset($result['uwp_account_last_name'])) {
929 - $args['display_name'] = $result['uwp_account_first_name'] . ' ' . $result['uwp_account_last_name'];
930 - }
2566 + check_ajax_referer( 'uwp_basic_nonce', 'security' );
931 2567
932 - if (isset($result['uwp_account_first_name'])) {
933 - $args['first_name'] = $result['uwp_account_first_name'];
934 - }
2568 + // Check user logged in.
2569 + if ( ! is_user_logged_in() ) {
2570 + $message = aui()->alert( array( 'type' => 'error', 'content' => __( 'Access denied!', 'userswp' ) ) );
2571 + wp_send_json_error( array( 'message' => $message ) );
2572 + }
935 2573
936 - if (isset($result['uwp_account_last_name'])) {
937 - $args['last_name'] = $result['uwp_account_last_name'];
938 - }
2574 + $user_id = ! empty( $_POST['uid'] ) ? absint( $_POST['uid'] ) : 0;
2575 + $htmlvar = ! empty( $_POST['htmlvar'] ) ? sanitize_key( $_POST['htmlvar'] ) : '';
939 2576
940 - if (isset($result['uwp_account_bio'])) {
941 - $args['description'] = $result['uwp_account_bio'];
942 - }
2577 + if ( empty( $user_id ) || empty( $htmlvar ) ) {
2578 + $message = aui()->alert( array( 'type' => 'error', 'content' => __( 'Invalid data!', 'userswp' ) ) );
2579 + wp_send_json_error( array( 'message' => $message ) );
2580 + }
943 2581
944 - if (isset($result['uwp_account_display_name']) && !empty($result['uwp_account_display_name'])) {
945 - $args['display_name'] = $result['uwp_account_display_name'];
946 - }
2582 + // Validate the user / admin.
2583 + if ( ! ( $user_id == (int) get_current_user_id() || current_user_can( 'manage_options' ) ) ) {
2584 + $message = aui()->alert( array( 'type' => 'error', 'content' => __( 'Invalid access!', 'userswp' ) ) );
2585 + wp_send_json_error( array( 'message' => $message ) );
2586 + }
947 2587
948 - if (isset($result['password'])) {
949 - $args['user_pass'] = $result['password'];
950 - }
2588 + if ( $htmlvar == 'banner_thumb' ) {
2589 + $field_key = 'banner';
2590 + $type = 'banner';
2591 + } else if ( $htmlvar == 'avatar_thumb' ) {
2592 + $field_key = 'avatar';
2593 + $type = 'avatar';
2594 + } else {
2595 + $field_key = $htmlvar;
2596 + $type = '';
2597 + }
951 2598
952 - $user_id = wp_update_user( $args );
2599 + $field = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . uwp_get_table_prefix() . "uwp_form_fields WHERE htmlvar_name = %s LIMIT 1", $field_key ) );
953 2600
954 - if (!$user_id) {
955 - $errors->add('registerfail', sprintf(__('<strong>Error</strong>: Something went wrong.', 'userswp'), get_option('admin_email')));
956 - return $errors;
957 - }
2601 + // Check field exists.
2602 + if ( empty( $field ) ) {
2603 + $message = aui()->alert( array( 'type' => 'error', 'content' => __( 'Invalid field!', 'userswp' ) ) );
2604 + wp_send_json_error( array( 'message' => $message ) );
2605 + }
958 2606
959 - $res = $this->uwp_save_user_extra_fields($user_id, $result, 'account');
2607 + // Validate field access.
2608 + if ( ! empty( $field->for_admin_use ) && ! current_user_can( 'manage_options' ) ) {
2609 + $message = aui()->alert( array( 'type' => 'error', 'content' => __( 'You are not allowed to perform this action!', 'userswp' ) ) );
2610 + wp_send_json_error( array( 'message' => $message ) );
2611 + }
960 2612
961 - if (!$res) {
962 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong. Please contact site admin.', 'userswp'));
963 - }
2613 + if ( ! in_array( $field->field_type, array( 'file', 'image' ) ) ) {
2614 + $message = aui()->alert( array( 'type' => 'error', 'content' => __( 'Invalid field type!', 'userswp' ) ) );
2615 + wp_send_json_error( array( 'message' => $message ) );
2616 + }
964 2617
965 - $error_code = $errors->get_error_code();
966 - if (!empty($error_code)) {
967 - return $errors;
968 - }
2618 + $value = uwp_get_usermeta( $user_id, $htmlvar );
969 2619
2620 + uwp_update_usermeta( $user_id, $htmlvar, '' );
970 2621
971 - if (uwp_get_option('enable_account_update_notification') == '1') {
972 - $user_data = get_user_by('id', $user_id);
2622 + if ( $value && validate_file( $value ) === 0 ) {
2623 + $uploads = wp_upload_dir();
2624 + $upload_path = $uploads['basedir'];
973 2625
974 - $email = new UsersWP_Mails();
975 - $send_result = $email->send( 'account', $user_data->ID );
2626 + if ( strpos( $value, 'http://' ) === 0 || strpos( $value, 'https://' ) === 0 ) {
2627 + // Get the relative url.
2628 + $value = uwp_get_file_relative_url( $value );
2629 + }
976 2630
977 - $send_result = apply_filters('uwp_forms_check_for_send_mail_errors', $send_result, $user_data, $errors);
978 - if (is_wp_error($send_result)) {
979 - return $send_result;
980 - }
981 -
982 - }
983 -
984 - return true;
2631 + $unlink_file = untrailingslashit( $upload_path ) . '/' . trim( $value, '/\\' );
985 2632
986 - }
2633 + // Canonicalize and enforce containment inside the uploads directory before deleting.
2634 + $real_upload_path = realpath( $upload_path );
2635 + $real_unlink_file = realpath( $unlink_file );
987 2636
988 - /**
989 - * Processes avatar and banner uploads form submission.
990 - *
991 - * @since 1.0.0
992 - * @package userswp
993 - *
994 - * @param array $data Submitted $_POST data
995 - * @param array $files Submitted $_FILES data
996 - *
997 - * @return bool|WP_Error|string File url to crop.
998 - */
999 - public function process_upload_submit($data = array(), $files = array(), $type = 'avatar') {
2637 + if ( $real_upload_path && $real_unlink_file && is_file( $real_unlink_file )
2638 + && strpos( $real_unlink_file, $real_upload_path . DIRECTORY_SEPARATOR ) === 0 ) {
2639 + wp_delete_file( $real_unlink_file );
1000 2640
1001 - $file_obj = new UsersWP_Files();
1002 -
1003 - $current_user_id = get_current_user_id();
1004 - if (!$current_user_id) {
1005 - return false;
1006 - }
2641 + // For avatar/banner, also remove the original (non-thumb) file.
2642 + if ( $type ) {
2643 + $unlink_ori_file = str_replace( '_uwp_' . $type . '_thumb' . '.', '.', $real_unlink_file );
2644 + $real_unlink_ori_file = realpath( $unlink_ori_file );
1007 2645
1008 - if( ! isset( $data['uwp_upload_nonce'] ) || ! wp_verify_nonce( $data['uwp_upload_nonce'], 'uwp-upload-nonce' ) ) {
1009 - return false;
1010 - }
2646 + if ( $real_unlink_ori_file && is_file( $real_unlink_ori_file )
2647 + && strpos( $real_unlink_ori_file, $real_upload_path . DIRECTORY_SEPARATOR ) === 0 ) {
2648 + wp_delete_file( $real_unlink_ori_file );
2649 + }
2650 + }
2651 + }
2652 + }
1011 2653
1012 - do_action('uwp_before_validate', $type);
2654 + wp_send_json_success();
1013 2655
1014 - $result = $file_obj->uwp_validate_uploads($files, $type);
2656 + wp_die();
2657 + }
1015 2658
1016 - $result = apply_filters('uwp_validate_result', $result, $type, $data);
2659 + /**
2660 + * Form field template for datepicker field type.
2661 + *
2662 + * @param string $html Form field html
2663 + * @param object $field Field info.
2664 + * @param string $value Form field default value.
2665 + * @param string $form_type Form type
2666 + *
2667 + * @return string Modified form field html.
2668 + * @package userswp
2669 + *
2670 + * @since 1.0.0
2671 + */
2672 + public function form_input_datepicker( $html, $field, $value, $form_type ) {
1017 2673
1018 - if (is_wp_error($result)) {
1019 - return $result;
1020 - }
2674 + // Check if there is a field specific filter.
2675 + if ( has_filter( "uwp_form_input_html_datepicker_{$field->htmlvar_name}" ) ) {
2676 + $html = apply_filters( "uwp_form_input_html_datepicker_{$field->htmlvar_name}", $html, $field, $value, $form_type );
2677 + }
1021 2678
1022 - $profile_url = uwp_build_profile_tab_url($current_user_id);
2679 + // If no html then we run the standard output.
2680 + if ( empty( $html ) ) {
1023 2681
1024 - $url = add_query_arg(
1025 - array(
1026 - 'uwp_crop' => $result['uwp_'.$type.'_file'],
1027 - 'type' => $type
1028 - ),
1029 - $profile_url);
2682 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
2683 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
2684 + $bs_sr_only = $design_style ? 'sr-only' : '';
2685 + $bs_form_control = $design_style ? 'form-control' : '';
2686 + $extra_attributes = array();
2687 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
2688 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
1030 2689
1031 - return $url;
2690 + ob_start(); // Start buffering;
1032 2691
1033 - }
2692 + $extra_fields = unserialize( $field->extra_fields );
1034 2693
1035 - /**
1036 - * Processes avatar and banner uploads image crop.
1037 - *
1038 - * @since 1.0.0
1039 - * @since 1.0.12 New param $unlink_prev_img introduced.
1040 - * @package userswp
1041 - *
1042 - * @param array $data Submitted $_POST data
1043 - * @param string $type Image type. Default 'avatar'.
1044 - * @param bool $unlink_prev_img True to remove previous image. Default false;
1045 - *
1046 - * @return bool|WP_Error|string Profile url.
1047 - */
1048 - public function process_image_crop($data = array(), $type = 'avatar', $unlink_prev_img = false) {
1049 -
1050 - if (!is_user_logged_in()) {
1051 - return false;
1052 - }
2694 + if ( $extra_fields['date_format'] == '' ) {
2695 + $extra_fields['date_format'] = 'yy-mm-dd';
2696 + }
1053 2697
1054 - // If is current user's profile (profile.php)
1055 - if ( is_admin() && defined('IS_PROFILE_PAGE') && IS_PROFILE_PAGE ) {
1056 - $user_id = get_current_user_id();
1057 - // If is another user's profile page
1058 - } elseif (is_admin() && ! empty($_GET['user_id']) && is_numeric($_GET['user_id']) ) {
1059 - $user_id = $_GET['user_id'];
1060 - // Otherwise something is wrong.
1061 - } else {
1062 - $user_id = get_current_user_id();
1063 - }
1064 - $image_url = $data['uwp_crop'];
1065 -
1066 - $errors = new WP_Error();
1067 - if (empty($image_url)) {
1068 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong. Please contact site admin.', 'userswp'));
1069 - }
2698 + $date_format = $extra_fields['date_format'];
2699 + $jquery_date_format = $date_format;
1070 2700
1071 - $error_code = $errors->get_error_code();
1072 - if (!empty($error_code)) {
1073 - return $errors;
1074 - }
1075 -
1076 - if ($image_url) {
1077 - if ($type == 'avatar') {
1078 - $full_width = apply_filters('uwp_avatar_image_width', 150);
1079 - } else {
1080 - $full_width = apply_filters('uwp_banner_image_width', uwp_get_option('profile_banner_width', 1000));
1081 - }
2701 + // check if we need to change the format or not
2702 + $date_format_len = strlen( str_replace( ' ', '', $date_format ) );
2703 + if ( $date_format_len > 5 ) {// if greater then 5 then it's the old style format.
1082 2704
1083 - $image_url = esc_url($image_url);
1084 - add_filter( 'upload_dir', 'uwp_handle_multisite_profile_image', 10, 1 );
1085 - $uploads = wp_upload_dir();
1086 - remove_filter( 'upload_dir', 'uwp_handle_multisite_profile_image' );
1087 - $upload_url = $uploads['baseurl'];
1088 - $upload_path = $uploads['basedir'];
1089 - $image_url = str_replace($upload_url, $upload_path, $image_url);
1090 - $ext = pathinfo($image_url, PATHINFO_EXTENSION); // to get extension
1091 - $name =pathinfo($image_url, PATHINFO_FILENAME); //file name without extension
1092 - $thumb_image_name = $name.'_uwp_'.$type.'_thumb'.'.'.$ext;
1093 - $thumb_image_location = str_replace($name.'.'.$ext, $thumb_image_name, $image_url);
1094 - //Get the new coordinates to crop the image.
1095 - $x = $data["x"];
1096 - $y = $data["y"];
1097 - $w = $data["w"];
1098 - $h = $data["h"];
1099 - //Scale the image based on cropped width setting
1100 - $scale = $full_width/$w;
1101 - //$scale = 1; // no scaling
1102 - $cropped = uwp_resizeThumbnailImage($thumb_image_location, $image_url,$x, $y, $w, $h,$scale);
1103 - $cropped = str_replace($upload_path, $upload_url, $cropped);
2705 + $search = array( 'dd', 'd', 'DD', 'mm', 'm', 'MM', 'yy' ); //jQuery UI datepicker format
2706 + $replace = array( 'd', 'j', 'l', 'm', 'n', 'F', 'Y' );//PHP date format
1104 2707
1105 - // Remove previous avatar/banner
1106 - $unlink_img = '';
1107 - if ($unlink_prev_img) {
1108 - if ($type == 'avatar') {
1109 - $previous_img = uwp_get_usermeta($user_id, 'uwp_account_avatar_thumb');
1110 - } else if ($type == 'banner') {
1111 - $previous_img = uwp_get_usermeta($user_id, 'uwp_account_banner_thumb');
1112 - } else {
1113 - $previous_img = '';
1114 - }
1115 -
1116 - if ($previous_img) {
1117 - $unlink_img = untrailingslashit($upload_path) . '/' . ltrim($previous_img, '/');
1118 - }
2708 + $date_format = str_replace( $search, $replace, $date_format );
2709 + } else {
2710 + $jquery_date_format = uwp_date_format_php_to_jqueryui( $jquery_date_format );
1119 2711 }
1120 2712
1121 - // remove the uploads path for easy migrations
1122 - $cropped = str_replace($upload_url, '', $cropped);
1123 - if ($type == 'avatar') {
1124 - uwp_update_usermeta($user_id, 'uwp_account_avatar_thumb', $cropped);
1125 - } else {
1126 - uwp_update_usermeta($user_id, 'uwp_account_banner_thumb', $cropped);
1127 - }
1128 -
1129 - if ($unlink_img && $unlink_img != $thumb_image_location && is_file($unlink_img) && file_exists($unlink_img)) {
1130 - @unlink($unlink_img);
1131 - $unlink_ori_img = str_replace('_uwp_'.$type.'_thumb'.'.', '.', $unlink_img);
1132 - if (is_file($unlink_ori_img) && file_exists($unlink_ori_img)) {
1133 - @unlink($unlink_ori_img);
2713 + if ( ! empty( $value ) && ! is_string( $value ) ) {
2714 + $value = date( 'Y-m-d', $value );
2715 + }
2716 +
2717 + if ( $value == '0000-00-00' ) {
2718 + $value = '';
2719 + }//if date not set, then mark it empty
2720 + $value = uwp_date( $value, 'Y-m-d', $date_format );
2721 + $site_title = uwp_get_form_label( $field );
2722 +
2723 + // bootstrap
2724 + if ( $design_style ) {
2725 + // flatpickr attributes
2726 + $extra_attributes['data-alt-input'] = 'true';
2727 + $extra_attributes['data-alt-format'] = $date_format;
2728 + $extra_attributes['data-date-format'] = 'Y-m-d';
2729 +
2730 + if ( 'dob' == $field->htmlvar_name ) {
2731 + $extra_attributes['data-max-date'] = 'today';
1134 2732 }
2733 +
2734 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
2735 +
2736 + echo aui()->input( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2737 + array(
2738 + 'id' => esc_attr( $field->htmlvar_name ),
2739 + 'name' => esc_attr( $field->htmlvar_name ),
2740 + 'required' => ! empty( $field->is_required ) ? true : false,
2741 + 'label' => wp_kses_post( $site_title . $required ),
2742 + 'label_show' => true,
2743 + 'label_type' => 'hidden',
2744 + 'type' => 'datepicker',
2745 + 'title' => esc_html( $site_title ),
2746 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
2747 + 'class' => '',
2748 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
2749 + 'value' => esc_attr( $value ),
2750 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
2751 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
2752 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
2753 + 'extra_attributes' => $extra_attributes, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2754 + )
2755 + );
2756 + } else {
2757 + ?>
2758 + <script type="text/javascript">
2759 +
2760 + jQuery(function () {
2761 + jQuery("#<?php echo esc_attr( $field->htmlvar_name ); ?>").datepicker({
2762 + changeMonth: true, changeYear: true
2763 + <?php
2764 + if ( $field->htmlvar_name == 'dob' ) {
2765 + echo ", yearRange: '1900:+0'";
2766 + } else {
2767 + echo ", yearRange: '1900:2050'";
2768 + }
2769 + ?>
2770 + <?php echo apply_filters( "uwp_datepicker_extra_{$field->htmlvar_name}", '' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>});
2771 +
2772 + jQuery("#<?php echo esc_attr( $field->htmlvar_name ); ?>").datepicker("option", "dateFormat", '<?php echo esc_attr( $jquery_date_format ); ?>');
2773 +
2774 + <?php if ( ! empty( $value ) ) { ?>
2775 + var parsedDate = jQuery.datepicker.parseDate('yy-mm-dd', '<?php echo esc_attr( $value ); ?>');
2776 + jQuery("#<?php echo esc_attr( $field->htmlvar_name ); ?>").datepicker("setDate", parsedDate);
2777 + <?php } ?>
2778 +
2779 + });
2780 +
2781 + </script>
2782 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
2783 + class="
2784 + <?php
2785 + if ( $field->is_required ) {
2786 + echo 'required_field';
2787 + }
2788 + ?>
2789 + clearfix uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
2790 +
2791 + <?php
2792 +
2793 + if ( ! is_admin() ) {
2794 + ?>
2795 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
2796 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
2797 + <?php
2798 + if ( $field->is_required ) {
2799 + echo '<span>*</span>';
2800 + }
2801 + ?>
2802 + </label>
2803 + <?php } ?>
2804 +
2805 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
2806 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
2807 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
2808 + title="<?php echo esc_attr( $site_title ); ?>"
2809 + type="text"
2810 + <?php
2811 + if ( $field->is_required == 1 ) {
2812 + echo 'required="required"';
2813 + }
2814 + ?>
2815 + value="<?php echo esc_attr( $value ); ?>"
2816 + class="uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"/>
2817 +
2818 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
2819 + <?php if ( $field->is_required ) { ?>
2820 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
2821 + <?php } ?>
2822 + </div>
2823 +
2824 + <?php
1135 2825 }
1136 - }
1137 2826
1138 - if (is_admin()) {
1139 - if ($user_id == get_current_user_id()) {
1140 - $profile_url = admin_url( 'profile.php' );
1141 - } else {
1142 - $profile_url = admin_url( 'user-edit.php?user_id='.$user_id );
1143 - }
1144 - } else {
1145 - $profile_url = uwp_build_profile_tab_url($user_id);
1146 - }
1147 - return $profile_url;
2827 + $html = ob_get_clean();
2828 + }
1148 2829
1149 - }
2830 + return $html;
2831 + }
1150 2832
1151 - /**
1152 - * Saves UsersWP related user custom fields.
1153 - *
1154 - * @since 1.0.0
1155 - * @package userswp
1156 - *
1157 - * @param int $user_id User ID.
1158 - * @param array $data Result array.
1159 - * @param string $type Form type.
1160 - *
1161 - * @return bool True when success. False when failure.
1162 - */
1163 - public function uwp_save_user_extra_fields($user_id, $data, $type) {
2833 + /**
2834 + * Form field template for time field type.
2835 + *
2836 + * @param string $html Form field html
2837 + * @param object $field Field info.
2838 + * @param string $value Form field default value.
2839 + * @param string $form_type Form type
2840 + *
2841 + * @return string Modified form field html.
2842 + * @package userswp
2843 + *
2844 + * @since 1.0.0
2845 + */
2846 + public function form_input_time( $html, $field, $value, $form_type ) {
1164 2847
1165 - if (empty($user_id) || empty($data) || empty($type)) {
1166 - return false;
1167 - }
2848 + if ( has_filter( "uwp_form_input_html_time_{$field->htmlvar_name}" ) ) {
1168 2849
1169 - // custom user fields not applicable for login and forgot
1170 - if ($type == 'login' || $type == 'forgot') {
1171 - return true;
1172 - }
1173 -
2850 + $html = apply_filters( "uwp_form_input_html_time_{$field->htmlvar_name}", $html, $field, $value, $form_type );
2851 + }
1174 2852
1175 - if ($type == 'account' || $type == 'register') {
1176 - if (isset($data['password'])) {
1177 - unset($data['password']);
1178 - }
1179 - }
2853 + // If no html then we run the standard output.
2854 + if ( empty( $html ) ) {
1180 2855
1181 - if ($type == 'register') {
1182 - if (isset($data['uwp_account_username'])) {
1183 - unset($data['uwp_account_username']);
1184 - }
1185 - if (isset($data['uwp_account_email'])) {
1186 - unset($data['uwp_account_email']);
1187 - }
1188 - if (isset($data['uwp_account_display_name'])) {
1189 - unset($data['uwp_account_display_name']);
1190 - }
1191 - if (isset($data['uwp_account_first_name'])) {
1192 - unset($data['uwp_account_first_name']);
1193 - }
1194 - if (isset($data['uwp_account_last_name'])) {
1195 - unset($data['uwp_account_last_name']);
1196 - }
1197 - if (isset($data['uwp_account_bio'])) {
1198 - unset($data['uwp_account_bio']);
1199 - }
1200 - }
2856 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
2857 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
2858 + $bs_sr_only = $design_style ? 'sr-only' : '';
2859 + $bs_form_control = $design_style ? 'form-control bg-white' : '';
2860 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
2861 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
1201 2862
1202 - if (empty($data)) {
1203 - // no extra fields. so just return
1204 - return true;
1205 - } else {
1206 - foreach($data as $key => $value) {
1207 - uwp_update_usermeta($user_id, $key, $value);
1208 - }
1209 - return true;
1210 - }
1211 - }
2863 + ob_start(); // Start buffering;
1212 2864
1213 - /**
1214 - * Logs the error message.
1215 - *
1216 - * @since 1.0.0
1217 - * @package userswp
1218 - *
1219 - * @param array|object|string $log Error message.
1220 - *
1221 - * @return void
1222 - */
1223 - public static function uwp_error_log($log){
2865 + if ( $value != '' ) {
2866 + $value = date( 'H:i', strtotime( $value ) );
2867 + }
1224 2868
1225 - $should_log = apply_filters( 'uwp_log_errors', WP_DEBUG);
1226 - if ( true === $should_log ) {
1227 - if ( is_array( $log ) || is_object( $log ) ) {
1228 - error_log( print_r( $log, true ) );
1229 - } else {
1230 - error_log( $log );
1231 - }
1232 - }
1233 - }
2869 + // flatpickr attributes
2870 + $extra_attributes['data-enable-time'] = 'true';
2871 + $extra_attributes['data-no-calendar'] = 'true';
2872 + $extra_attributes['data-date-format'] = 'H:i';
2873 + $site_title = uwp_get_form_label( $field );
2874 + $label_type = is_admin() ? '' : 'top';
1234 2875
1235 - /**
1236 - *
1237 - *
1238 - * @since 1.0.0
1239 - * @since 1.0.12 Unlink file.
1240 - * @package userswp
1241 - * @return void
1242 - */
1243 - public function uwp_upload_file_remove() {
2876 + if ( $design_style ) {
2877 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
1244 2878
1245 - $htmlvar = strip_tags(esc_sql($_POST['htmlvar']));
1246 - $user_id = (int) strip_tags(esc_sql($_POST['uid']));
1247 - $permission = false;
1248 - if ($user_id == get_current_user_id()) {
1249 - $permission = true;
1250 - } else {
1251 - if (current_user_can('manage_options')) {
1252 - $permission = true;
1253 - }
1254 - }
1255 - if ($permission) {
1256 - // Remove file
1257 - if ($htmlvar == "uwp_account_banner_thumb") {
1258 - $file = uwp_get_usermeta($user_id, 'uwp_account_banner_thumb');
1259 - $type = 'banner';
1260 - } elseif ($htmlvar == "uwp_account_avatar_thumb") {
1261 - $file = uwp_get_usermeta($user_id, 'uwp_account_avatar_thumb');
1262 - $type = 'avatar';
2879 + echo aui()->input( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2880 + array(
2881 + 'id' => esc_attr( $field->htmlvar_name ),
2882 + 'name' => esc_attr( $field->htmlvar_name ),
2883 + 'required' => ! empty( $field->is_required ) ? true : false,
2884 + 'label' => wp_kses_post( $site_title . $required ),
2885 + 'label_show' => true,
2886 + 'label_type' => esc_attr( $label_type ),
2887 + 'type' => 'timepicker',
2888 + 'title' => esc_html( $site_title ),
2889 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
2890 + 'class' => '',
2891 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
2892 + 'value' => esc_attr( $value ),
2893 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
2894 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
2895 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
2896 + 'extra_attributes' => $extra_attributes, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2897 + 'input_group_right' => '<div class="input-group-text px-2 bg-transparent border-0x" onclick="jQuery(this).parent().parent().find(\'input\').val(\'\');"><i class="fas fa-times uwp-search-input-label-clear text-muted c-pointer" title="' . esc_attr__( 'Clear field', 'userswp' ) . '" ></i></div>',
2898 + )
2899 + );
1263 2900 } else {
1264 - $file = '';
1265 - $type = '';
2901 + ?>
2902 + <script type="text/javascript">
2903 + jQuery(document).ready(function () {
2904 + jQuery('#<?php echo esc_attr( $field->htmlvar_name ); ?>').timepicker({
2905 + showPeriod: true,
2906 + showLeadingZero: true
2907 + });
2908 + });
2909 + </script>
2910 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
2911 + class="
2912 + <?php
2913 + if ( $field->is_required ) {
2914 + echo 'required_field';
2915 + }
2916 + ?>
2917 + clearfix uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
2918 +
2919 + <?php
2920 + $site_title = uwp_get_form_label( $field );
2921 + if ( ! is_admin() ) {
2922 + ?>
2923 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
2924 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
2925 + <?php
2926 + if ( $field->is_required ) {
2927 + echo '<span>*</span>';
2928 + }
2929 + ?>
2930 + </label>
2931 + <?php } ?>
2932 +
2933 + <input readonly="readonly" name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
2934 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
2935 + value="<?php echo esc_attr( $value ); ?>"
2936 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
2937 + type="text"
2938 + class="uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"/>
2939 +
2940 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
2941 + <?php if ( $field->is_required ) { ?>
2942 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
2943 + <?php } ?>
2944 + </div>
2945 + <?php
1266 2946 }
2947 + $html = ob_get_clean();
2948 + }
1267 2949
1268 - uwp_update_usermeta($user_id, $htmlvar, '');
2950 + return $html;
2951 + }
1269 2952
1270 - if ($file) {
1271 - $uploads = wp_upload_dir();
1272 - $upload_path = $uploads['basedir'];
1273 - $unlink_file = untrailingslashit($upload_path) . '/' . ltrim($file, '/');
2953 + /**
2954 + * Form field template for select field type.
2955 + *
2956 + * @param string $html Form field html
2957 + * @param object $field Field info.
2958 + * @param string $value Form field default value.
2959 + * @param string $form_type Form type
2960 + *
2961 + * @return string Modified form field html.
2962 + * @package userswp
2963 + *
2964 + * @since 1.0.0
2965 + */
2966 + public function form_input_select( $html, $field, $value, $form_type ) {
1274 2967
1275 - if (is_file($unlink_file) && file_exists($unlink_file)) {
1276 - @unlink($unlink_file);
1277 - $unlink_ori_file = str_replace('_uwp_'.$type.'_thumb'.'.', '.', $unlink_file);
1278 - if (is_file($unlink_ori_file) && file_exists($unlink_ori_file)) {
1279 - @unlink($unlink_ori_file);
2968 + // Check if there is a field specific filter.
2969 + if ( has_filter( "uwp_form_input_html_select_{$field->htmlvar_name}" ) ) {
2970 + $html = apply_filters( "uwp_form_input_html_select_{$field->htmlvar_name}", $html, $field, $value, $form_type );
2971 + }
2972 +
2973 + // Check if there is a field type specific filter.
2974 + if ( has_filter( "uwp_form_input_html_select_{$field->field_type_key}" ) ) {
2975 + $html = apply_filters( "uwp_form_input_html_select_{$field->field_type_key}", $html, $field, $value, $form_type );
2976 + }
2977 +
2978 + // If no html then we run the standard output.
2979 + if ( empty( $html ) ) {
2980 +
2981 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
2982 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
2983 + $bs_sr_only = $design_style ? 'sr-only' : '';
2984 + $bs_form_control = $design_style ? 'form-control' : '';
2985 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
2986 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
2987 +
2988 + ob_start(); // Start buffering;
2989 + $option_values_arr = uwp_string_values_to_options( $field->option_values, true );
2990 + $site_title = uwp_get_form_label( $field );
2991 +
2992 + // bootstrap
2993 + if ( $design_style ) {
2994 +
2995 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
2996 +
2997 + echo aui()->select(
2998 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2999 + 'id' => esc_attr( $field->htmlvar_name ),
3000 + 'name' => esc_attr( $field->htmlvar_name ),
3001 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
3002 + 'title' => esc_html( $site_title ),
3003 + 'value' => esc_attr( $value ),
3004 + 'required' => (bool) $field->is_required,
3005 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
3006 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
3007 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
3008 + 'label' => wp_kses_post( $site_title . $required ),
3009 + 'options' => $option_values_arr, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3010 + 'select2' => true,
3011 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3012 + )
3013 + );
3014 + } else {
3015 + ?>
3016 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3017 + class="
3018 + <?php
3019 + if ( $field->is_required ) {
3020 + echo 'required_field';
1280 3021 }
1281 - }
3022 + ?>
3023 + uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
3024 +
3025 + <?php
3026 + if ( ! is_admin() ) {
3027 + ?>
3028 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3029 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3030 + <?php
3031 + if ( $field->is_required ) {
3032 + echo '<span>*</span>';
3033 + }
3034 + ?>
3035 + </label>
3036 + <?php } ?>
3037 +
3038 + <?php
3039 +
3040 + $select_options = '';
3041 + if ( ! empty( $option_values_arr ) ) {
3042 + foreach ( $option_values_arr as $option_row ) {
3043 + if ( isset( $option_row['optgroup'] ) && ( $option_row['optgroup'] == 'start' || $option_row['optgroup'] == 'end' ) ) {
3044 + $option_label = isset( $option_row['label'] ) ? $option_row['label'] : '';
3045 +
3046 + $select_options .= $option_row['optgroup'] == 'start' ? '<optgroup label="' . esc_attr( $option_label ) . '">' : '</optgroup>';
3047 + } else {
3048 + $option_label = isset( $option_row['label'] ) ? $option_row['label'] : '';
3049 + $option_value = isset( $option_row['value'] ) ? $option_row['value'] : '';
3050 + $selected = $option_value == $value ? 'selected="selected"' : '';
3051 +
3052 + $select_options .= '<option value="' . esc_attr( $option_value ) . '" ' . $selected . '>' . $option_label . '</option>';
3053 + }
3054 + }
3055 + }
3056 + ?>
3057 + <select name="<?php echo esc_attr( $field->htmlvar_name ); ?>" id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3058 + class="uwp_textfield aui-select2 <?php echo esc_attr( $bs_form_control ); ?>"
3059 + title="<?php echo esc_attr( $site_title ); ?>"
3060 + data-placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
3061 + ><?php echo $select_options; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
3062 + </select>
3063 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3064 + <?php if ( $field->is_required ) { ?>
3065 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3066 + <?php } ?>
3067 + </div>
3068 +
3069 + <?php
1282 3070 }
1283 - }
1284 - die();
1285 - }
1286 -
1287 -
1288 - /**
1289 - * Form field template for datepicker field type.
1290 - *
1291 - * @since 1.0.0
1292 - * @package userswp
1293 - *
1294 - * @param string $html Form field html
1295 - * @param object $field Field info.
1296 - * @param string $value Form field default value.
1297 - * @param string $form_type Form type
1298 - *
1299 - * @return string Modified form field html.
1300 - */
1301 - public function uwp_form_input_datepicker($html, $field, $value, $form_type){
3071 + $html = ob_get_clean();
3072 + }
1302 3073
1303 - // Check if there is a field specific filter.
1304 - if(has_filter("uwp_form_input_html_datepicker_{$field->htmlvar_name}")){
1305 - $html = apply_filters("uwp_form_input_html_datepicker_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1306 - }
3074 + return $html;
3075 + }
1307 3076
1308 - // If no html then we run the standard output.
1309 - if(empty($html)) {
3077 + /**
3078 + * Form field template for multiselect field type.
3079 + *
3080 + * @param string $html Form field html
3081 + * @param object $field Field info.
3082 + * @param string $value Form field default value.
3083 + * @param string $form_type Form type
3084 + *
3085 + * @return string Modified form field html.
3086 + * @package userswp
3087 + *
3088 + * @since 1.0.0
3089 + */
3090 + public function form_input_multiselect( $html, $field, $value, $form_type ) {
1310 3091
1311 - ob_start(); // Start buffering;
3092 + // Check if there is a field specific filter.
3093 + if ( has_filter( "uwp_form_input_html_multiselect_{$field->htmlvar_name}" ) ) {
3094 + $html = apply_filters( "uwp_form_input_html_multiselect_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3095 + }
1312 3096
1313 - $extra_fields = unserialize($field->extra_fields);
3097 + if ( empty( $html ) ) {
1314 3098
1315 - if ($extra_fields['date_format'] == '')
1316 - $extra_fields['date_format'] = 'yy-mm-dd';
3099 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3100 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
3101 + $bs_sr_only = $design_style ? 'sr-only' : '';
3102 + $bs_form_control = $design_style ? 'form-control' : '';
3103 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
3104 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
1317 3105
1318 - $date_format = $extra_fields['date_format'];
1319 - $jquery_date_format = $date_format;
3106 + ob_start(); // Start buffering;
1320 3107
1321 - if (!empty($value) && !is_string($value)) {
1322 - $value = date('Y-m-d', $value);
1323 - }
3108 + $multi_display = 'select';
3109 + if ( ! empty( $field->extra_fields ) ) {
3110 + $multi_display = unserialize( $field->extra_fields );
3111 + }
1324 3112
3113 + $option_values_arr = uwp_string_values_to_options( $field->option_values, true );
3114 + $site_title = uwp_get_form_label( $field );
3115 + $value = is_array( $value ) ? $value : esc_attr( $value );
1325 3116
1326 - // check if we need to change the format or not
1327 - $date_format_len = strlen(str_replace(' ', '', $date_format));
1328 - if($date_format_len>5){// if greater then 5 then it's the old style format.
3117 + // bootstrap
3118 + if ( $design_style ) {
1329 3119
1330 - $search = array('dd','d','DD','mm','m','MM','yy'); //jQuery UI datepicker format
1331 - $replace = array('d','j','l','m','n','F','Y');//PHP date format
3120 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
1332 3121
1333 - $date_format = str_replace($search, $replace, $date_format);
1334 - }else{
1335 - $jquery_date_format = uwp_date_format_php_to_jqueryui( $jquery_date_format );
1336 - }
1337 - if($value=='0000-00-00'){$value='';}//if date not set, then mark it empty
1338 - $value = uwp_date($value, 'Y-m-d', $date_format);
1339 - ?>
1340 - <script type="text/javascript">
3122 + echo aui()->select(
3123 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3124 + 'id' => esc_attr( $field->htmlvar_name ),
3125 + 'name' => esc_attr( $field->htmlvar_name ),
3126 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
3127 + 'title' => esc_html( $site_title ),
3128 + 'value' => $value,
3129 + 'required' => (bool) $field->is_required,
3130 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
3131 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
3132 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
3133 + 'label' => wp_kses_post( $site_title . $required ),
3134 + 'options' => $option_values_arr, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3135 + 'select2' => true,
3136 + 'multiple' => true,
3137 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3138 + )
3139 + );
3140 + } else {
3141 + ?>
3142 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3143 + class="
3144 + <?php
3145 + if ( $field->is_required ) {
3146 + echo 'required_field';
3147 + }
3148 + ?>
3149 + uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
1341 3150
1342 - jQuery(function () {
3151 + <?php
3152 + if ( ! is_admin() ) {
3153 + ?>
3154 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3155 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3156 + <?php
3157 + if ( $field->is_required ) {
3158 + echo '<span>*</span>';
3159 + }
3160 + ?>
3161 + </label>
3162 + <?php } ?>
1343 3163
1344 - jQuery("#<?php echo $field->htmlvar_name;?>").datepicker({changeMonth: true, changeYear: true
1345 - <?php if($field->htmlvar_name == 'uwp_account_dob'){ echo ", yearRange: '1900:+0'"; } else { echo ", yearRange: '1900:2050'"; }?>
1346 - <?php echo apply_filters("uwp_datepicker_extra_{$field->htmlvar_name}",'');?>});
3164 + <input type="hidden" name="<?php echo esc_attr( $field->htmlvar_name ); ?>" value=""/>
3165 + <?php if ( $multi_display == 'select' ) { ?>
3166 + <div class="uwp_multiselect_list">
3167 + <select name="<?php echo esc_attr( $field->htmlvar_name ); ?>[]"
3168 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3169 + title="<?php echo esc_attr( $site_title ); ?>"
3170 + data-placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
3171 + class="aui-select2 <?php echo esc_attr( $bs_form_control ); ?>"
3172 + >
3173 + <?php
3174 + } else {
3175 + ?>
3176 + <ul class="uwp_multi_choice">
3177 + <?php
3178 + }
1347 3179
1348 - jQuery("#<?php echo $field->htmlvar_name;?>").datepicker("option", "dateFormat", '<?php echo $jquery_date_format;?>');
3180 + $option_values_arr = uwp_string_values_to_options( $field->option_values, true );
3181 + $select_options = '';
3182 + if ( ! empty( $option_values_arr ) ) {
3183 + foreach ( $option_values_arr as $option_row ) {
3184 + if ( isset( $option_row['optgroup'] ) && ( $option_row['optgroup'] == 'start' || $option_row['optgroup'] == 'end' ) ) {
3185 + $option_label = isset( $option_row['label'] ) ? $option_row['label'] : '';
1349 3186
1350 - <?php if(!empty($value)){?>
1351 - var parsedDate = jQuery.datepicker.parseDate('yy-mm-dd', '<?php echo $value;?>');
1352 - jQuery("#<?php echo $field->htmlvar_name;?>").datepicker("setDate", parsedDate);
1353 - <?php } ?>
3187 + if ( $multi_display == 'select' ) {
3188 + $select_options .= $option_row['optgroup'] == 'start' ? '<optgroup label="' . esc_attr( $option_label ) . '">' : '</optgroup>';
3189 + } else {
3190 + $select_options .= $option_row['optgroup'] == 'start' ? '<li>' . $option_label . '</li>' : '';
3191 + }
3192 + } else {
3193 + $option_label = isset( $option_row['label'] ) ? $option_row['label'] : '';
3194 + $option_value = isset( $option_row['value'] ) ? $option_row['value'] : '';
3195 + $selected = $option_value == $value ? 'selected="selected"' : '';
3196 + $checked = '';
1354 3197
1355 - });
3198 + if ( ( ! is_array( $value ) && trim( $value ) != '' ) || ( is_array( $value ) && ! empty( $value ) ) ) {
3199 + if ( ! is_array( $value ) ) {
3200 + $value_array = explode( ',', $value );
3201 + } else {
3202 + $value_array = $value;
3203 + }
1356 3204
1357 - </script>
1358 - <div id="<?php echo $field->htmlvar_name;?>_row"
1359 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_row clearfix uwp_clear uwp-fieldset-details">
3205 + if ( is_array( $value_array ) ) {
3206 + if ( in_array( $option_value, $value_array ) ) {
3207 + $selected = 'selected="selected"';
3208 + $checked = 'checked="checked"';
3209 + }
3210 + }
3211 + }
1360 3212
3213 + if ( $multi_display == 'select' ) {
3214 + $select_options .= '<option value="' . esc_attr( $option_value ) . '" ' . $selected . '>' . $option_label . '</option>';
3215 + } else {
3216 + $select_options .= '<li><input name="' . $field->name . '[]" ' . $checked . ' value="' . esc_attr( $option_value ) . '" class="uwp-' . $multi_display . '" type="' . $multi_display . '" />&nbsp;' . $option_label . ' </li>';
3217 + }
3218 + }
3219 + }
3220 + }
3221 + echo $select_options; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3222 +
3223 + if ( $multi_display == 'select' ) {
3224 +
3225 + ?>
3226 + </select></div>
3227 + <?php } else { ?>
3228 + </ul>
3229 + <?php } ?>
3230 + <?php if ( $field->is_required ) { ?>
3231 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3232 + <?php } ?>
3233 + </div>
3234 + <?php
3235 + }
3236 + $html = ob_get_clean();
3237 + }
3238 +
3239 + return $html;
3240 + }
3241 +
3242 + /**
3243 + * Form field template for file field type.
3244 + *
3245 + * @param string $html Form field html
3246 + * @param object $field Field info.
3247 + * @param string $value Form field default value.
3248 + * @param string $form_type Form type
3249 + *
3250 + * @return string Modified form field html.
3251 + * @package userswp
3252 + *
3253 + * @since 1.0.0
3254 + */
3255 + public function form_input_file( $html, $field, $value, $form_type ) {
3256 +
3257 + $file_obj = new UsersWP_Files();
3258 +
3259 + // Check if there is a field specific filter.
3260 + if ( has_filter( "uwp_form_input_html_file_{$field->htmlvar_name}" ) ) {
3261 + $html = apply_filters( "uwp_form_input_html_file_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3262 + }
3263 +
3264 + // If no html then we run the standard output.
3265 + if ( empty( $html ) ) {
3266 +
3267 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3268 + $wrap_class = isset( $field->css_class ) ? $field->css_class : '';
3269 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
3270 + $bs_sr_only = $design_style ? 'sr-only' : '';
3271 + $bs_form_control = $design_style ? 'form-control' : '';
3272 +
3273 + ob_start(); // Start buffering;
3274 +
3275 + ?>
3276 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3277 + class="
1361 3278 <?php
1362 - $site_title = uwp_get_form_label($field);
1363 - if (!is_admin()) { ?>
1364 - <label>
1365 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1366 - <?php if ($field->is_required) echo '<span>*</span>';?>
1367 - </label>
1368 - <?php } ?>
3279 + if ( $field->is_required ) {
3280 + echo 'required_field';
3281 + }
3282 + ?>
3283 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group . $wrap_class ); ?>">
1369 3284
1370 - <input name="<?php echo $field->htmlvar_name;?>"
1371 - id="<?php echo $field->htmlvar_name;?>"
1372 - placeholder="<?php echo $site_title; ?>"
1373 - title="<?php echo $site_title; ?>"
1374 - type="text"
1375 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
1376 - value="<?php echo esc_attr($value);?>" class="uwp_textfield"/>
3285 + <?php
3286 + $site_title = uwp_get_form_label( $field );
3287 + if ( ! is_admin() && ! wp_doing_ajax() ) {
3288 + ?>
3289 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3290 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3291 + <?php
3292 + if ( $field->is_required ) {
3293 + echo ' <span class="text-danger">*</span>';
3294 + }
3295 + ?>
3296 + </label>
3297 + <?php } ?>
1377 3298
1378 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1379 - <?php if ($field->is_required) { ?>
1380 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1381 - <?php } ?>
1382 - </div>
3299 + <?php echo $file_obj->file_upload_preview( $field, $value ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
3300 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3301 + class="<?php echo esc_attr( $field->css_class ); ?> <?php echo esc_attr( $bs_form_control ); ?>"
3302 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
3303 + title="<?php echo esc_attr( $site_title ); ?>"
3304 + <?php
3305 + if ( $field->is_required == 1 ) {
3306 + echo 'data-is-required="1"';
3307 + }
3308 + if ( $field->is_required == 1 && ! $value ) {
3309 + echo 'required="required"';
3310 + }
3311 + ?>
3312 + type="<?php echo esc_attr( $field->field_type ); ?>">
3313 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3314 + <?php if ( $field->is_required ) { ?>
3315 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3316 + <?php } ?>
3317 + </div>
1383 3318
1384 - <?php
1385 - $html = ob_get_clean();
1386 - }
3319 + <?php
3320 + $html = ob_get_clean();
3321 + }
1387 3322
1388 - return $html;
1389 - }
3323 + return $html;
3324 + }
1390 3325
1391 - /**
1392 - * Form field template for time field type.
1393 - *
1394 - * @since 1.0.0
1395 - * @package userswp
1396 - *
1397 - * @param string $html Form field html
1398 - * @param object $field Field info.
1399 - * @param string $value Form field default value.
1400 - * @param string $form_type Form type
1401 - *
1402 - * @return string Modified form field html.
1403 - */
1404 - public function uwp_form_input_time($html, $field, $value, $form_type){
3326 + /**
3327 + * Form field template for checkbox field type.
3328 + *
3329 + * @param string $html Form field html
3330 + * @param object $field Field info.
3331 + * @param string $value Form field default value.
3332 + * @param string $form_type Form type
3333 + *
3334 + * @return string Modified form field html.
3335 + * @package userswp
3336 + *
3337 + * @since 1.0.0
3338 + */
3339 + public function form_input_checkbox( $html, $field, $value, $form_type ) {
1405 3340
1406 - if(has_filter("uwp_form_input_html_time_{$field->htmlvar_name}")){
3341 + // Check if there is a field specific filter.
3342 + if ( has_filter( "uwp_form_input_html_checkbox_{$field->htmlvar_name}" ) ) {
3343 + $html = apply_filters( "uwp_form_input_html_checkbox_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3344 + }
1407 3345
1408 - $html = apply_filters("uwp_form_input_html_time_{$field->htmlvar_name}",$html, $field, $value, $form_type);
1409 - }
3346 + // If no html then we run the standard output.
3347 + if ( empty( $html ) ) {
1410 3348
1411 - // If no html then we run the standard output.
1412 - if(empty($html)) {
3349 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3350 + $bs_form_group = $design_style ? 'form-group mb-3 form-check' : '';
3351 + $bs_sr_only = $design_style ? 'form-check-label' : '';
3352 + $bs_form_control = $design_style ? 'form-check-input' : '';
1413 3353
1414 - ob_start(); // Start buffering;
3354 + ob_start(); // Start buffering;
3355 + $site_title = uwp_get_form_label( $field );
1415 3356
1416 - if ($value != '')
1417 - $value = date('H:i', strtotime($value));
1418 - ?>
1419 - <script type="text/javascript">
1420 - jQuery(document).ready(function () {
3357 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3358 + $id = wp_doing_ajax() ? $field->htmlvar_name . '_ajax' : $field->htmlvar_name;
1421 3359
1422 - jQuery('#<?php echo $field->htmlvar_name;?>').timepicker({
1423 - showPeriod: true,
1424 - showLeadingZero: true
1425 - });
1426 - });
1427 - </script>
1428 - <div id="<?php echo $field->htmlvar_name;?>_row"
1429 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_row clearfix uwp_clear uwp-fieldset-details">
3360 + $checked = $value == '1' ? true : false;
1430 3361
1431 - <?php
1432 - $site_title = uwp_get_form_label($field);
1433 - if (!is_admin()) { ?>
1434 - <label>
1435 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1436 - <?php if ($field->is_required) echo '<span>*</span>';?>
1437 - </label>
1438 - <?php } ?>
3362 + // bootstrap
3363 + if ( $design_style ) {
3364 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
1439 3365
1440 - <input readonly="readonly" name="<?php echo $field->htmlvar_name;?>"
1441 - id="<?php echo $field->htmlvar_name;?>"
1442 - value="<?php echo esc_attr($value);?>"
1443 - placeholder="<?php echo $site_title; ?>"
1444 - type="text"
1445 - class="uwp_textfield"/>
3366 + echo '<input type="hidden" name="' . esc_attr( $field->htmlvar_name ) . '" id="checkbox_' . esc_attr( $id ) . '" value="0"/>';
1446 3367
1447 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1448 - <?php if ($field->is_required) { ?>
1449 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1450 - <?php } ?>
1451 - </div>
1452 - <?php
1453 - $html = ob_get_clean();
1454 - }
3368 + echo aui()->input( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3369 + array(
3370 + 'id' => esc_attr( $id ),
3371 + 'name' => esc_attr( $field->htmlvar_name ),
3372 + 'type' => 'checkbox',
3373 + 'value' => '1',
3374 + 'title' => esc_html( $site_title ),
3375 + 'label' => wp_kses_post( $site_title . $required ),
3376 + 'label_show' => true,
3377 + 'required' => ! empty( $field->is_required ) ? true : false,
3378 + 'checked' => (bool) $checked,
3379 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3380 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
3381 + 'validation_text' => ! empty( $field->is_required ) ? esc_attr__( stripslashes( $field->required_msg ), 'userswp' ) : '',
3382 + )
3383 + );
1455 3384
1456 - return $html;
1457 - }
3385 + } else {
3386 + ?>
3387 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3388 + class="
3389 + <?php
3390 + if ( $field->is_required ) {
3391 + echo 'required_field';
3392 + }
3393 + ?>
3394 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
3395 + <?php if ( ! empty( $design_style ) ) { ?>
3396 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3397 + <?php } ?>
3398 + <input type="hidden" name="<?php echo esc_attr( $field->htmlvar_name ); ?>" value="0"/>
3399 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3400 + class="<?php echo esc_attr( $field->css_class ); ?> <?php echo esc_attr( $bs_form_control ); ?>"
3401 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
3402 + title="<?php echo esc_attr( $site_title ); ?>"
3403 + <?php
3404 + if ( $field->is_required == 1 ) {
3405 + echo 'required="required"';
3406 + }
3407 + ?>
3408 + <?php
3409 + if ( $value == '1' ) {
3410 + echo 'checked="checked"';
3411 + }
3412 + ?>
3413 + type="<?php echo esc_attr( $field->field_type ); ?>"
3414 + value="1">
3415 + <?php
3416 + echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;';
3417 + ?>
3418 + <?php if ( ! empty( $design_style ) ) { ?>
3419 + </label>
3420 + <?php } ?>
3421 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3422 + <?php if ( $field->is_required ) { ?>
3423 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3424 + <?php } ?>
3425 + </div>
1458 3426
1459 - /**
1460 - * Form field template for select field type.
1461 - *
1462 - * @since 1.0.0
1463 - * @package userswp
1464 - *
1465 - * @param string $html Form field html
1466 - * @param object $field Field info.
1467 - * @param string $value Form field default value.
1468 - * @param string $form_type Form type
1469 - *
1470 - * @return string Modified form field html.
1471 - */
1472 - public function uwp_form_input_select($html, $field, $value, $form_type){
3427 + <?php
1473 3428
1474 - // Check if there is a field specific filter.
1475 - if(has_filter("uwp_form_input_html_select_{$field->htmlvar_name}")){
1476 - $html = apply_filters("uwp_form_input_html_select_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1477 - }
3429 + }
1478 3430
1479 - // Check if there is a field type specific filter.
1480 - if(has_filter("uwp_form_input_html_select_{$field->field_type_key}")){
1481 - $html = apply_filters("uwp_form_input_html_select_{$field->field_type_key}", $html, $field, $value, $form_type);
1482 - }
3431 + $html = ob_get_clean();
1483 3432
1484 - // If no html then we run the standard output.
1485 - if(empty($html)) {
3433 + }
1486 3434
1487 - ob_start(); // Start buffering;
3435 + return $html;
3436 + }
1488 3437
1489 - ?>
1490 - <div id="<?php echo $field->htmlvar_name;?>_row"
1491 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_row uwp_clear">
3438 + /**
3439 + * Form field template for radio field type.
3440 + *
3441 + * @param string $html Form field html
3442 + * @param object $field Field info.
3443 + * @param string $value Form field default value.
3444 + * @param string $form_type Form type
3445 + *
3446 + * @return string Modified form field html.
3447 + * @package userswp
3448 + *
3449 + * @since 1.0.0
3450 + */
3451 + public function form_input_radio( $html, $field, $value, $form_type ) {
1492 3452
1493 - <?php
1494 - $site_title = uwp_get_form_label($field);
1495 - if (!is_admin()) { ?>
1496 - <label>
1497 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1498 - <?php if ($field->is_required) echo '<span>*</span>';?>
1499 - </label>
1500 - <?php } ?>
3453 + // Check if there is a field specific filter.
3454 + if ( has_filter( "uwp_form_input_html_radio_{$field->htmlvar_name}" ) ) {
3455 + $html = apply_filters( "uwp_form_input_html_radio_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3456 + }
1501 3457
1502 - <?php
1503 - $option_values_arr = uwp_string_values_to_options($field->option_values, true);
1504 - $select_options = '';
1505 - if (!empty($option_values_arr)) {
1506 - foreach ($option_values_arr as $option_row) {
1507 - if (isset($option_row['optgroup']) && ($option_row['optgroup'] == 'start' || $option_row['optgroup'] == 'end')) {
1508 - $option_label = isset($option_row['label']) ? $option_row['label'] : '';
3458 + // If no html then we run the standard output.
3459 + if ( empty( $html ) ) {
1509 3460
1510 - $select_options .= $option_row['optgroup'] == 'start' ? '<optgroup label="' . esc_attr($option_label) . '">' : '</optgroup>';
1511 - } else {
1512 - $option_label = isset($option_row['label']) ? $option_row['label'] : '';
1513 - $option_value = isset($option_row['value']) ? $option_row['value'] : '';
1514 - $selected = $option_value == $value ? 'selected="selected"' : '';
3461 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3462 + $bs_form_group = $design_style ? 'form-group mb-3 form-check-inline' : '';
3463 + $bs_sr_only = $design_style ? 'sr-only' : '';
3464 + $bs_label_class = $design_style ? 'form-check-label' : '';
3465 + $bs_form_control = $design_style ? 'form-check-input' : '';
1515 3466
1516 - $select_options .= '<option value="' . esc_attr($option_value) . '" ' . $selected . '>' . $option_label . '</option>';
1517 - }
3467 + ob_start(); // Start buffering;
3468 +
3469 + if ( $design_style ) {
3470 +
3471 + $option_values_deep = uwp_string_values_to_options( $field->option_values, true );
3472 + $option_values = array();
3473 + if ( ! empty( $option_values_deep ) ) {
3474 + foreach ( $option_values_deep as $option ) {
3475 + $option_values[ $option['value'] ] = $option['label'];
3476 + }
3477 + }
3478 +
3479 + $site_title = uwp_get_form_label( $field );
3480 +
3481 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
3482 +
3483 + echo aui()->radio( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3484 + array(
3485 + 'id' => esc_attr( $field->htmlvar_name ),
3486 + 'name' => esc_attr( $field->htmlvar_name ),
3487 + 'type' => 'radio',
3488 + 'title' => esc_html( $site_title ),
3489 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
3490 + 'label_type' => 'top',
3491 + 'class' => '',
3492 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3493 + 'value' => esc_attr( $value ),
3494 + 'options' => $option_values, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3495 + )
3496 + );
3497 +
3498 + } else {
3499 +
3500 + ?>
3501 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3502 + class="
3503 + <?php
3504 + if ( $field->is_required ) {
3505 + echo 'required_field';
3506 + }
3507 + ?>
3508 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
3509 +
3510 + <?php
3511 + $site_title = uwp_get_form_label( $field );
3512 + if ( ! is_admin() ) {
3513 + ?>
3514 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3515 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3516 + <?php
3517 + if ( $field->is_required ) {
3518 + echo '<span>*</span>';
3519 + }
3520 + ?>
3521 + </label>
3522 + <?php } ?>
3523 +
3524 + <?php
3525 + if ( $field->option_values ) {
3526 + $option_values = uwp_string_values_to_options( $field->option_values, true );
3527 +
3528 + if ( ! empty( $option_values ) ) {
3529 + $count = 0;
3530 + foreach ( $option_values as $option_value ) {
3531 + if ( empty( $option_value['optgroup'] ) ) {
3532 + ++$count;
3533 + if ( $count == 1 ) {
3534 + $class = 'uwp-radio-first';
3535 + } else {
3536 + $class = '';
3537 + }
3538 + ?>
3539 + <?php if ( ! empty( $design_style ) ) { ?>
3540 + <label class="<?php echo esc_attr( $bs_label_class ); ?>">
3541 + <?php } else { ?>
3542 + <span class="uwp-radios <?php echo esc_attr( $class ); ?>">
3543 + <?php } ?>
3544 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3545 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3546 + title="<?php echo esc_attr( $option_value['label'] ); ?>"
3547 + <?php checked( $value, $option_value['value'] ); ?>
3548 + <?php
3549 + if ( $field->is_required == 1 ) {
3550 + echo 'required="required"';
3551 + }
3552 + ?>
3553 + value="<?php echo esc_attr( $option_value['value'] ); ?>"
3554 + class="uwp-radio <?php echo esc_attr( $bs_form_control ); ?>" type="radio"/>
3555 + <?php echo esc_html( $option_value['label'] ); ?>
3556 + <?php if ( ! empty( $design_style ) ) { ?>
3557 + </label>
3558 + <?php } else { ?>
3559 + </span>
3560 + <?php
3561 + }
3562 + }
3563 + }
3564 + }
3565 + }
3566 + ?>
3567 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3568 + <?php if ( $field->is_required ) { ?>
3569 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3570 + <?php } ?>
3571 + </div>
3572 + <?php
3573 + }
3574 +
3575 + $html = ob_get_clean();
3576 + }
3577 +
3578 + return $html;
3579 + }
3580 +
3581 + /**
3582 + * Form field template for text field type.
3583 + *
3584 + * @param string $html Form field html
3585 + * @param object $field Field info.
3586 + * @param string $value Form field default value.
3587 + * @param string $form_type Form type
3588 + *
3589 + * @return string Modified form field html.
3590 + * @package userswp
3591 + *
3592 + * @since 1.0.0
3593 + */
3594 + public function form_input_text( $html, $field, $value, $form_type ) {
3595 +
3596 + // Check if there is a custom field specific filter.
3597 + if ( has_filter( "uwp_form_input_text_{$field->htmlvar_name}" ) ) {
3598 + $html = apply_filters( "uwp_form_input_text_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3599 + }
3600 +
3601 + // If no html then we run the standard output.
3602 + if ( empty( $html ) ) {
3603 +
3604 + ob_start(); // Start buffering;
3605 +
3606 + $type = 'text';
3607 + $step = false;
3608 + //number and float validation $validation_pattern
3609 + if ( isset( $field->data_type ) && $field->data_type == 'INT' ) {
3610 + $type = 'number';
3611 + } elseif ( isset( $field->data_type ) && $field->data_type == 'FLOAT' ) {
3612 + $dp = $field->decimal_point;
3613 + switch ( $dp ) {
3614 + case '1':
3615 + $step = '0.1';
3616 + break;
3617 + case '2':
3618 + $step = '0.01';
3619 + break;
3620 + case '3':
3621 + $step = '0.001';
3622 + break;
3623 + case '4':
3624 + $step = '0.0001';
3625 + break;
3626 + case '5':
3627 + $step = '0.00001';
3628 + break;
3629 + case '6':
3630 + $step = '0.000001';
3631 + break;
3632 + case '7':
3633 + $step = '0.0000001';
3634 + break;
3635 + case '8':
3636 + $step = '0.00000001';
3637 + break;
3638 + case '9':
3639 + $step = '0.000000001';
3640 + break;
3641 + case '10':
3642 + $step = '0.0000000001';
3643 + break;
3644 + default:
3645 + $step = '0.01';
3646 + break;
3647 + }
3648 + $type = 'number';
3649 + }
3650 +
3651 + $site_title = uwp_get_form_label( $field );
3652 + $placeholder = uwp_get_field_placeholder( $field );
3653 + $manual_label = apply_filters( 'uwp_login_username_label_manual', true );
3654 + if ( $manual_label
3655 + && isset( $field->form_type )
3656 + && $field->form_type == 'login'
3657 + && $field->htmlvar_name == 'username' ) {
3658 + $site_title = __( 'Username or Email', 'userswp' );
3659 + $required = ! empty( $field->is_required ) ? ' *' : '';
3660 + $placeholder = $site_title . $required;
3661 + $placeholder = apply_filters( 'uwp_get_field_placeholder', stripslashes( $placeholder ), $field );
3662 + }
3663 +
3664 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3665 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
3666 + $bs_sr_only = $design_style ? 'sr-only' : '';
3667 + $bs_form_control = $design_style ? 'form-control' : '';
3668 +
3669 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
3670 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
3671 +
3672 + // bootstrap
3673 + if ( $design_style ) {
3674 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
3675 +
3676 + echo aui()->input(
3677 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3678 + 'type' => esc_attr( $type ),
3679 + 'id' => esc_attr( $field->htmlvar_name ),
3680 + 'name' => esc_attr( $field->htmlvar_name ),
3681 + 'placeholder' => esc_attr( $placeholder ),
3682 + 'title' => esc_html( $site_title ),
3683 + 'value' => esc_attr( wp_unslash( $value ) ),
3684 + 'required' => (bool) $field->is_required,
3685 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
3686 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
3687 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
3688 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
3689 + 'step' => esc_attr( $step ),
3690 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3691 + )
3692 + );
3693 + } else {
3694 + ?>
3695 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row" class="
3696 + <?php
3697 + if ( $field->is_required ) {
3698 + echo 'required_field';
3699 + }
3700 + ?>
3701 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
3702 + <?php
3703 +
3704 + if ( ! is_admin() ) {
3705 + ?>
3706 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3707 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3708 + <?php
3709 + if ( $field->is_required ) {
3710 + echo '<span>*</span>';
3711 + }
3712 + ?>
3713 + </label>
3714 + <?php
1518 3715 }
1519 - }
1520 - ?>
1521 - <select name="<?php echo $field->htmlvar_name;?>" id="<?php echo $field->htmlvar_name;?>"
1522 - class="uwp_textfield"
1523 - title="<?php echo $site_title; ?>"
1524 - data-placeholder="<?php echo __('Choose', 'userswp') . ' ' . $site_title . '&hellip;';?>"
1525 - ><?php echo $select_options;?>
1526 - </select>
1527 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1528 - <?php if ($field->is_required) { ?>
1529 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1530 - <?php } ?>
1531 - </div>
3716 + ?>
1532 3717
1533 - <?php
1534 - $html = ob_get_clean();
1535 - }
3718 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3719 + class="<?php echo esc_attr( $field->css_class ); ?> uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"
3720 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3721 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
3722 + value="<?php echo esc_attr( stripslashes( $value ) ); ?>"
3723 + title="<?php echo esc_attr( $site_title ); ?>"
3724 + oninvalid="this.setCustomValidity('<?php esc_attr_e( stripslashes( $field->required_msg ), 'userswp' ); ?>')"
3725 + oninput="setCustomValidity('')"
3726 + <?php
3727 + if ( $field->is_required == 1 ) {
3728 + echo 'required="required"';
3729 + }
3730 + ?>
3731 + <?php
3732 + if ( $field->for_admin_use == 1 ) {
3733 + echo 'readonly="readonly"';
3734 + }
3735 + ?>
3736 + type="<?php echo esc_attr( $type ); ?>"
3737 + <?php
3738 + if ( $step ) {
3739 + echo 'step="' . esc_attr( $step ) . '"';
3740 + }
3741 + ?>
3742 + />
3743 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3744 + <?php if ( $field->is_required ) { ?>
3745 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3746 + <?php } ?>
3747 + </div>
1536 3748
1537 - return $html;
1538 - }
1539 3749
1540 - /**
1541 - * Form field template for multiselect field type.
1542 - *
1543 - * @since 1.0.0
1544 - * @package userswp
1545 - *
1546 - * @param string $html Form field html
1547 - * @param object $field Field info.
1548 - * @param string $value Form field default value.
1549 - * @param string $form_type Form type
1550 - *
1551 - * @return string Modified form field html.
1552 - */
1553 - public function uwp_form_input_multiselect($html, $field, $value, $form_type){
3750 + <?php
3751 + }
3752 + $html = ob_get_clean();
3753 + }
1554 3754
1555 - // Check if there is a field specific filter.
1556 - if(has_filter("uwp_form_input_html_multiselect_{$field->htmlvar_name}")){
1557 - $html = apply_filters("uwp_form_input_html_multiselect_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1558 - }
3755 + return $html;
3756 + }
1559 3757
3758 + /**
3759 + * Form field template for textarea field type.
3760 + *
3761 + * @param string $html Form field html
3762 + * @param object $field Field info.
3763 + * @param string $value Form field default value.
3764 + * @param string $form_type Form type
3765 + *
3766 + * @return string Modified form field html.
3767 + * @package userswp
3768 + *
3769 + * @since 1.0.0
3770 + */
3771 + public function form_input_textarea( $html, $field, $value, $form_type ) {
1560 3772
1561 - if(empty($html)) {
3773 + // Check if there is a field specific filter.
3774 + if ( has_filter( "uwp_form_input_textarea_{$field->htmlvar_name}" ) ) {
3775 + $html = apply_filters( "uwp_form_input_textarea_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3776 + }
1562 3777
1563 - ob_start(); // Start buffering;
3778 + // If no html then we run the standard output.
3779 + if ( empty( $html ) ) {
1564 3780
1565 - $multi_display = 'select';
1566 - if (!empty($field->extra_fields)) {
1567 - $multi_display = unserialize($field->extra_fields);
1568 - }
1569 - ?>
1570 - <div id="<?php echo $field->htmlvar_name;?>_row"
1571 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_row uwp_clear">
3781 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3782 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
3783 + $bs_sr_only = $design_style ? 'sr-only' : '';
3784 + $bs_form_control = $design_style ? 'form-control' : '';
3785 + $site_title = uwp_get_form_label( $field );
1572 3786
1573 - <?php
1574 - $site_title = uwp_get_form_label($field);
1575 - if (!is_admin()) { ?>
1576 - <label>
1577 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1578 - <?php if ($field->is_required) echo '<span>*</span>';?>
1579 - </label>
1580 - <?php } ?>
3787 + ob_start(); // Start buffering;
1581 3788
1582 - <input type="hidden" name="<?php echo $field->htmlvar_name;?>" value=""/>
1583 - <?php if ($multi_display == 'select') { ?>
1584 - <div class="uwp_multiselect_list">
1585 - <select name="<?php echo $field->htmlvar_name;?>[]"
1586 - id="<?php echo $field->htmlvar_name;?>"
1587 - title="<?php echo $site_title; ?>"
1588 - multiple="multiple" class="uwp_chosen_select"
1589 - data-placeholder="<?php echo $site_title; ?>"
1590 - >
1591 - <?php
1592 - } else {
3789 + // bootstrap
3790 + if ( $design_style ) {
3791 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
3792 +
3793 + echo aui()->textarea(
3794 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3795 + 'id' => esc_attr( $field->htmlvar_name ),
3796 + 'name' => esc_attr( $field->htmlvar_name ),
3797 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
3798 + 'title' => esc_html( $site_title ),
3799 + 'value' => wp_kses_post( stripslashes( $value ) ),
3800 + 'required' => (bool) $field->is_required,
3801 + 'validation_text' => ! empty( $field->is_required ) ? esc_attr__( stripslashes( $field->required_msg ), 'userswp' ) : '',
3802 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
3803 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
3804 + 'rows' => '4',
3805 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3806 + )
3807 + );
3808 + } else {
3809 + ?>
3810 +
3811 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3812 + class="
3813 + <?php
3814 + if ( $field->is_required ) {
3815 + echo 'required_field';
3816 + }
3817 + ?>
3818 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
3819 +
3820 + <?php
3821 +
3822 + if ( ! is_admin() ) {
3823 + ?>
3824 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3825 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3826 + <?php
3827 + if ( $field->is_required ) {
3828 + echo '<span>*</span>';
3829 + }
1593 3830 ?>
1594 - <ul class="uwp_multi_choice">
1595 - <?php
1596 - }
3831 + </label>
3832 + <?php } ?>
1597 3833
1598 - $option_values_arr = uwp_string_values_to_options($field->option_values, true);
1599 - $select_options = '';
1600 - if (!empty($option_values_arr)) {
1601 - foreach ($option_values_arr as $option_row) {
1602 - if (isset($option_row['optgroup']) && ($option_row['optgroup'] == 'start' || $option_row['optgroup'] == 'end')) {
1603 - $option_label = isset($option_row['label']) ? $option_row['label'] : '';
3834 + <textarea name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
3835 + class="<?php echo esc_attr( $field->css_class ); ?> <?php echo esc_attr( $bs_form_control ); ?>"
3836 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
3837 + title="<?php echo esc_attr( $site_title ); ?>"
3838 + oninvalid="this.setCustomValidity('<?php esc_attr_e( stripslashes( $field->required_msg ), 'userswp' ); ?>')"
3839 + oninput="setCustomValidity('')"
3840 + <?php
3841 + if ( $field->is_required == 1 ) {
3842 + echo 'required="required"';
3843 + }
3844 + ?>
3845 + type="<?php echo esc_attr( $field->field_type ); ?>"
3846 + rows="4"><?php echo wp_kses_post( stripslashes( $value ) ); ?></textarea>
3847 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3848 + <?php if ( $field->is_required ) { ?>
3849 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3850 + <?php } ?>
3851 + </div>
1604 3852
1605 - if ($multi_display == 'select') {
1606 - $select_options .= $option_row['optgroup'] == 'start' ? '<optgroup label="' . esc_attr($option_label) . '">' : '</optgroup>';
1607 - } else {
1608 - $select_options .= $option_row['optgroup'] == 'start' ? '<li>' . $option_label . '</li>' : '';
1609 - }
1610 - } else {
1611 - $option_label = isset($option_row['label']) ? $option_row['label'] : '';
1612 - $option_value = isset($option_row['value']) ? $option_row['value'] : '';
1613 - $selected = $option_value == $value ? 'selected="selected"' : '';
1614 - $checked = '';
3853 + <?php
3854 + }
3855 + $html = ob_get_clean();
3856 + }
1615 3857
1616 - if ((!is_array($value) && trim($value) != '') || (is_array($value) && !empty($value))) {
1617 - if (!is_array($value)) {
1618 - $value_array = explode(',', $value);
1619 - } else {
1620 - $value_array = $value;
1621 - }
3858 + return $html;
3859 + }
1622 3860
1623 - if (is_array($value_array)) {
1624 - if (in_array($option_value, $value_array)) {
1625 - $selected = 'selected="selected"';
1626 - $checked = 'checked="checked"';
1627 - }
1628 - }
1629 - }
3861 + public function form_input_editor( $html, $field, $value, $form_type ) {
1630 3862
1631 - if ($multi_display == 'select') {
1632 - $select_options .= '<option value="' . esc_attr($option_value) . '" ' . $selected . '>' . $option_label . '</option>';
1633 - } else {
1634 - $select_options .= '<li><input name="' . $field->name . '[]" ' . $checked . ' value="' . esc_attr($option_value) . '" class="uwp-' . $multi_display . '" type="' . $multi_display . '" />&nbsp;' . $option_label . ' </li>';
1635 - }
1636 - }
1637 - }
1638 - }
1639 - echo $select_options;
3863 + // Check if there is a field specific filter.
3864 + if ( has_filter( "uwp_form_input_editor_{$field->htmlvar_name}" ) ) {
3865 + $html = apply_filters( "uwp_form_input_editor_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3866 + }
1640 3867
1641 - if ($multi_display == 'select') { ?></select></div>
1642 - <?php } else { ?>
1643 - </ul>
1644 - <?php } ?>
1645 - <?php if ($field->is_required) { ?>
1646 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1647 - <?php } ?>
1648 - </div>
1649 - <?php
1650 - $html = ob_get_clean();
1651 - }
3868 + if ( empty( $html ) ) {
1652 3869
1653 - return $html;
1654 - }
3870 + ob_start();
1655 3871
1656 - /**
1657 - * Form field template for file field type.
1658 - *
1659 - * @since 1.0.0
1660 - * @package userswp
1661 - *
1662 - * @param string $html Form field html
1663 - * @param object $field Field info.
1664 - * @param string $value Form field default value.
1665 - * @param string $form_type Form type
1666 - *
1667 - * @return string Modified form field html.
1668 - */
1669 - public function uwp_form_input_file($html, $field, $value, $form_type){
3872 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
3873 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
3874 + $bs_sr_only = $design_style ? 'sr-only' : '';
3875 + $site_title = uwp_get_form_label( $field );
1670 3876
1671 - $file_obj = new UsersWP_Files();
1672 -
1673 - // Check if there is a field specific filter.
1674 - if(has_filter("uwp_form_input_html_file_{$field->htmlvar_name}")){
1675 - $html = apply_filters("uwp_form_input_html_file_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1676 - }
3877 + $content = stripslashes( $value );
3878 + $editor_id = $field->htmlvar_name;
3879 + $args = array(
3880 + 'textarea_rows' => 5,
3881 + 'media_buttons' => false,
3882 + 'quicktags' => false,
3883 + );
1677 3884
1678 - // If no html then we run the standard output.
1679 - if(empty($html)) {
3885 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
3886 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
1680 3887
1681 - ob_start(); // Start buffering;
3888 + // bootstrap
3889 + if ( $design_style ) {
3890 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
1682 3891
1683 - ?>
1684 - <div id="<?php echo $field->htmlvar_name;?>_row"
1685 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
3892 + echo aui()->textarea(
3893 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
3894 + 'id' => esc_attr( $field->htmlvar_name ),
3895 + 'name' => esc_attr( $field->htmlvar_name ),
3896 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
3897 + 'title' => esc_html( $site_title ),
3898 + 'value' => wp_kses_post( stripslashes( $value ) ),
3899 + 'required' => (bool) $field->is_required,
3900 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
3901 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
3902 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
3903 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
3904 + 'rows' => 5,
3905 + 'wysiwyg' => true,
3906 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
3907 + )
3908 + );
3909 + } else {
3910 + ?>
3911 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
3912 + class="
3913 + <?php
3914 + if ( $field->is_required ) {
3915 + echo 'required_field';
3916 + }
3917 + ?>
3918 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
1686 3919
1687 - <?php
1688 - $site_title = uwp_get_form_label($field);
1689 - if (!is_admin()) { ?>
1690 - <label>
1691 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1692 - <?php if ($field->is_required) echo '<span>*</span>';?>
1693 - </label>
1694 - <?php } ?>
3920 + <?php
1695 3921
1696 - <?php echo $file_obj->uwp_file_upload_preview($field, $value); ?>
1697 - <input name="<?php echo $field->htmlvar_name; ?>"
1698 - class="<?php echo $field->css_class; ?>"
1699 - placeholder="<?php echo $site_title; ?>"
1700 - title="<?php echo $site_title; ?>"
3922 + if ( ! is_admin() ) {
3923 + ?>
3924 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
3925 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
3926 + <?php
3927 + if ( $field->is_required ) {
3928 + echo '<span>*</span>';
3929 + }
3930 + ?>
3931 + </label>
3932 + <?php } ?>
3933 +
3934 + <?php wp_editor( $content, $editor_id, $args ); ?>
3935 +
3936 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
3937 + <?php if ( $field->is_required ) { ?>
3938 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
3939 + <?php } ?>
3940 + </div>
3941 + <?php
3942 + }
3943 + $html = ob_get_clean();
3944 + }
3945 +
3946 + return $html;
3947 + }
3948 +
3949 + /**
3950 + * Form field template for fieldset field type.
3951 + *
3952 + * @param string $html Form field html
3953 + * @param object $field Field info.
3954 + * @param string $value Form field default value.
3955 + * @param string $form_type Form type
3956 + *
3957 + * @return string Modified form field html.
3958 + * @package userswp
3959 + *
3960 + * @since 1.0.0
3961 + */
3962 + public function form_input_fieldset( $html, $field, $value, $form_type ) {
3963 + // Check if there is a custom field specific filter.
3964 + if ( has_filter( "uwp_form_input_fieldset_{$field->htmlvar_name}" ) ) {
3965 + $html = apply_filters( "uwp_form_input_fieldset_{$field->htmlvar_name}", $html, $field, $value, $form_type );
3966 + }
3967 +
3968 + // If no html then we run the standard output.
3969 + if ( empty( $html ) ) {
3970 +
3971 + ob_start(); // Start buffering;
3972 + $site_title = uwp_get_form_label( $field );
3973 + ?>
3974 + <h3 class="uwp_input_fieldset <?php echo esc_attr( $field->css_class ); ?>">
3975 + <?php echo esc_html( $site_title ); ?>
3976 + <?php
3977 + if ( $field->help_text != '' ) {
3978 + echo '<small>( ' . wp_kses_post( $field->help_text ) . ' )</small>';
3979 + }
3980 + ?>
3981 + </h3>
3982 + <?php
3983 + $html = ob_get_clean();
3984 + }
3985 +
3986 + return $html;
3987 + }
3988 +
3989 + /**
3990 + * Form field template for url field type.
3991 + *
3992 + * @param string $html Form field html
3993 + * @param object $field Field info.
3994 + * @param string $value Form field default value.
3995 + * @param string $form_type Form type
3996 + *
3997 + * @return string Modified form field html.
3998 + * @package userswp
3999 + *
4000 + * @since 1.0.0
4001 + */
4002 + public function form_input_url( $html, $field, $value, $form_type ) {
4003 +
4004 + // Check if there is a custom field specific filter.
4005 + if ( has_filter( "uwp_form_input_url_{$field->htmlvar_name}" ) ) {
4006 + $html = apply_filters( "uwp_form_input_url_{$field->htmlvar_name}", $html, $field, $value, $form_type );
4007 + }
4008 +
4009 + // If no html then we run the standard output.
4010 + if ( empty( $html ) ) {
4011 +
4012 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4013 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
4014 + $bs_sr_only = $design_style ? 'sr-only' : '';
4015 + $bs_form_control = $design_style ? 'form-control' : '';
4016 +
4017 + ob_start(); // Start buffering;
4018 + $site_title = uwp_get_form_label( $field );
4019 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : __( 'Please enter a valid URL including https://', 'userswp' );
4020 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
4021 +
4022 + // bootstrap
4023 + if ( $design_style ) {
4024 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
4025 +
4026 + echo aui()->input(
4027 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4028 + 'type' => 'url',
4029 + 'id' => esc_attr( $field->htmlvar_name ),
4030 + 'name' => esc_attr( $field->htmlvar_name ),
4031 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
4032 + 'title' => esc_html( $site_title ),
4033 + 'value' => esc_attr( $value ),
4034 + 'required' => (bool) $field->is_required,
4035 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
4036 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
4037 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
4038 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
4039 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
4040 + )
4041 + );
4042 + } else {
4043 + ?>
4044 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
4045 + class="
1701 4046 <?php
1702 - if ($field->is_required == 1 ) { echo 'data-is-required="1"'; }
1703 - if ($field->is_required == 1 && !$value) { echo 'required="required"'; }
4047 + if ( $field->is_required ) {
4048 + echo 'required_field';
4049 + }
1704 4050 ?>
1705 - type="<?php echo $field->field_type; ?>">
1706 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1707 - <?php if ($field->is_required) { ?>
1708 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1709 - <?php } ?>
1710 - </div>
4051 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
1711 4052
1712 - <?php
1713 - $html = ob_get_clean();
1714 - }
4053 + <?php
4054 + if ( ! is_admin() ) {
4055 + ?>
4056 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4057 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4058 + <?php
4059 + if ( $field->is_required ) {
4060 + echo '<span>*</span>';
4061 + }
4062 + ?>
4063 + </label>
4064 + <?php } ?>
1715 4065
1716 - return $html;
1717 - }
4066 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4067 + class="
4068 + <?php
4069 + //echo $field->css_class;
4070 + ?>
4071 + uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"
4072 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4073 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
4074 + value="<?php echo esc_attr( stripslashes( $value ) ); ?>"
4075 + title="<?php echo esc_attr( $site_title ); ?>"
4076 + <?php
4077 + if ( $field->is_required == 1 ) {
4078 + echo 'required="required"';
4079 + }
4080 + ?>
4081 + type="url"
4082 + oninvalid="setCustomValidity('<?php esc_attr_e( 'Please enter a valid URL including http://', 'userswp' ); ?>')"
4083 + onchange="try{setCustomValidity('')}catch(e){}"
4084 + />
4085 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4086 + <?php if ( $field->is_required ) { ?>
4087 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4088 + <?php } ?>
4089 + </div>
1718 4090
1719 - /**
1720 - * Form field template for checkbox field type.
1721 - *
1722 - * @since 1.0.0
1723 - * @package userswp
1724 - *
1725 - * @param string $html Form field html
1726 - * @param object $field Field info.
1727 - * @param string $value Form field default value.
1728 - * @param string $form_type Form type
1729 - *
1730 - * @return string Modified form field html.
1731 - */
1732 - public function uwp_form_input_checkbox($html, $field, $value, $form_type){
4091 + <?php
4092 + }
1733 4093
1734 - // Check if there is a field specific filter.
1735 - if(has_filter("uwp_form_input_html_checkbox_{$field->htmlvar_name}")){
1736 - $html = apply_filters("uwp_form_input_html_checkbox_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1737 - }
4094 + $html = ob_get_clean();
4095 + }
1738 4096
1739 - // If no html then we run the standard output.
1740 - if(empty($html)) {
4097 + return $html;
4098 + }
1741 4099
1742 - ob_start(); // Start buffering;
1743 - $site_title = uwp_get_form_label($field);
1744 - ?>
1745 - <div id="<?php echo $field->htmlvar_name;?>_row"
1746 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
1747 - <input type="hidden" name="<?php echo $field->htmlvar_name; ?>" value="0" />
1748 - <input name="<?php echo $field->htmlvar_name; ?>"
1749 - class="<?php echo $field->css_class; ?>"
1750 - placeholder="<?php echo $site_title; ?>"
1751 - title="<?php echo $site_title; ?>"
1752 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
1753 - <?php if ($value == '1') { echo 'checked="checked"'; } ?>
1754 - type="<?php echo $field->field_type; ?>"
1755 - value="1">
1756 - <?php
1757 - echo (trim($site_title)) ? $site_title : '&nbsp;';
4100 + /**
4101 + * Form field template for email field type.
4102 + *
4103 + * @param string $html Form field html
4104 + * @param object $field Field info.
4105 + * @param string $value Form field default value.
4106 + * @param string $form_type Form type
4107 + *
4108 + * @return string Modified form field html.
4109 + * @package userswp
4110 + *
4111 + * @since 1.0.0
4112 + */
4113 + public function form_input_email( $html, $field, $value, $form_type ) {
4114 +
4115 + // Check if there is a custom field specific filter.
4116 + if ( has_filter( "uwp_form_input_email_{$field->htmlvar_name}" ) ) {
4117 + $html = apply_filters( "uwp_form_input_email_{$field->htmlvar_name}", $html, $field, $value, $form_type );
4118 + }
4119 +
4120 + // If no html then we run the standard output.
4121 + if ( empty( $html ) ) {
4122 +
4123 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4124 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
4125 + $bs_sr_only = $design_style ? 'sr-only' : '';
4126 + $bs_form_control = $design_style ? 'form-control' : '';
4127 +
4128 + ob_start(); // Start buffering;
4129 + $site_title = uwp_get_form_label( $field );
4130 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
4131 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
4132 +
4133 + $is_forgot_email = ( $form_type === 'forgot' && $field->htmlvar_name === 'email' );
4134 + $input_type = $is_forgot_email ? 'text' : 'email';
4135 + if ( $is_forgot_email ) {
4136 + $site_title = __( 'Username or Email', 'userswp' );
4137 + $placeholder = $site_title . ( ! empty( $field->is_required ) ? ' *' : '' );
4138 + } else {
4139 + $placeholder = uwp_get_field_placeholder( $field );
4140 + }
4141 +
4142 + if ( $design_style ) {
4143 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
4144 +
4145 + echo aui()->input(
4146 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4147 + 'type' => $input_type,
4148 + 'id' => esc_attr( $field->htmlvar_name ),
4149 + 'name' => esc_attr( $field->htmlvar_name ),
4150 + 'placeholder' => esc_attr( $placeholder ),
4151 + 'title' => esc_html( $site_title ),
4152 + 'value' => esc_attr( wp_unslash( $value ) ),
4153 + 'required' => (bool) $field->is_required,
4154 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
4155 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
4156 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
4157 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
4158 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
4159 + )
4160 + );
4161 + } else {
4162 + ?>
4163 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
4164 + class="
4165 + <?php
4166 + if ( $field->is_required ) {
4167 + echo 'required_field';
4168 + }
4169 + ?>
4170 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
4171 +
4172 + <?php
4173 + if ( ! is_admin() ) {
4174 + ?>
4175 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4176 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4177 + <?php
4178 + if ( $field->is_required ) {
4179 + echo '<span>*</span>';
4180 + }
4181 + ?>
4182 + </label>
4183 + <?php } ?>
4184 +
4185 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4186 + class="<?php echo esc_attr( $field->css_class ); ?> uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"
4187 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4188 + placeholder="<?php echo esc_attr( $placeholder ); ?>"
4189 + value="<?php echo esc_attr( stripslashes( $value ) ); ?>"
4190 + title="<?php echo esc_attr( $site_title ); ?>"
4191 + <?php
4192 + if ( $field->is_required == 1 ) {
4193 + echo 'required="required"';
4194 + }
4195 + ?>
4196 + type="<?php echo esc_attr( $input_type ); ?>"
4197 + />
4198 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4199 + <?php if ( $field->is_required ) { ?>
4200 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4201 + <?php } ?>
4202 + </div>
4203 +
4204 +
4205 + <?php
4206 + }
4207 + $html = ob_get_clean();
4208 +
4209 + }
4210 +
4211 + if ( has_filter( "uwp_form_input_email_{$field->htmlvar_name}_after" ) ) {
4212 + $html = apply_filters( "uwp_form_input_email_{$field->htmlvar_name}_after", $html, $field, $value, $form_type );
4213 + }
4214 +
4215 + return $html;
4216 + }
4217 +
4218 + /**
4219 + * Form field template for password field type.
4220 + *
4221 + * @param string $html Form field html
4222 + * @param object $field Field info.
4223 + * @param string $value Form field default value.
4224 + * @param string $form_type Form type
4225 + *
4226 + * @return string Modified form field html.
4227 + * @package userswp
4228 + *
4229 + * @since 1.0.0
4230 + */
4231 + public function form_input_password( $html, $field, $value, $form_type ) {
4232 +
4233 + // Check if there is a custom field specific filter.
4234 + if ( has_filter( "uwp_form_input_password_{$field->htmlvar_name}" ) ) {
4235 + $html = apply_filters( "uwp_form_input_password_{$field->htmlvar_name}", $html, $field, $value, $form_type );
4236 + }
4237 +
4238 + // If no html then we run the standard output.
4239 + if ( empty( $html ) ) {
4240 +
4241 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4242 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
4243 + $bs_sr_only = $design_style ? 'sr-only' : '';
4244 + $bs_form_control = $design_style ? 'form-control' : '';
4245 +
4246 + ob_start(); // Start buffering;
4247 + $site_title = uwp_get_form_label( $field );
4248 +
4249 + if ( $design_style ) {
4250 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
4251 + $required_msg = ( ! empty( $field->required_msg ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
4252 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
4253 + $wrap_class = isset( $field->css_class ) ? $field->css_class . ' uwp-password-wrap' : 'uwp-password-wrap';
4254 +
4255 + echo aui()->input(
4256 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4257 + 'type' => 'password',
4258 + 'id' => esc_attr( $field->htmlvar_name ),
4259 + 'name' => esc_attr( $field->htmlvar_name ),
4260 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
4261 + 'title' => esc_html( $site_title ),
4262 + 'value' => esc_attr( $value ),
4263 + 'required' => (bool) $field->is_required,
4264 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
4265 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
4266 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
4267 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
4268 + 'wrap_class' => esc_attr( $wrap_class ),
4269 + )
4270 + );
4271 + } else {
4272 + ?>
4273 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row" class="
4274 + <?php
4275 + if ( $field->is_required ) {
4276 + echo 'required_field';
4277 + }
1758 4278 ?>
1759 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1760 - <?php if ($field->is_required) { ?>
1761 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1762 - <?php } ?>
1763 - </div>
4279 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
4280 + <?php
4281 + if ( ! is_admin() ) {
4282 + ?>
4283 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4284 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4285 + <?php
4286 + if ( $field->is_required ) {
4287 + echo '<span>*</span>';
4288 + }
4289 + ?>
4290 + </label>
4291 + <?php } ?>
1764 4292
1765 - <?php
1766 - $html = ob_get_clean();
1767 - }
4293 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4294 + class="<?php echo esc_attr( $field->css_class ); ?> uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"
4295 + id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4296 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
4297 + value="<?php echo esc_attr( stripslashes( $value ) ); ?>"
4298 + title="<?php echo esc_attr( $site_title ); ?>"
4299 + <?php
4300 + if ( $field->is_required == 1 ) {
4301 + echo 'required="required"';
4302 + }
4303 + ?>
4304 + type="password"
4305 + />
4306 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4307 + <?php if ( $field->is_required ) { ?>
4308 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4309 + <?php } ?>
4310 + </div>
1768 4311
1769 - return $html;
1770 - }
1771 4312
1772 - /**
1773 - * Form field template for radio field type.
1774 - *
1775 - * @since 1.0.0
1776 - * @package userswp
1777 - *
1778 - * @param string $html Form field html
1779 - * @param object $field Field info.
1780 - * @param string $value Form field default value.
1781 - * @param string $form_type Form type
1782 - *
1783 - * @return string Modified form field html.
1784 - */
1785 - public function uwp_form_input_radio($html, $field, $value, $form_type){
4313 + <?php
4314 + }
1786 4315
1787 - // Check if there is a field specific filter.
1788 - if(has_filter("uwp_form_input_html_radio_{$field->htmlvar_name}")){
1789 - $html = apply_filters("uwp_form_input_html_radio_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1790 - }
4316 + $html = ob_get_clean();
4317 + }
1791 4318
1792 - // If no html then we run the standard output.
1793 - if(empty($html)) {
4319 + if ( has_filter( "uwp_form_input_password_{$field->htmlvar_name}_after" ) ) {
4320 + $html = apply_filters( "uwp_form_input_password_{$field->htmlvar_name}_after", $html, $field, $value, $form_type );
4321 + }
1794 4322
1795 - ob_start(); // Start buffering;
4323 + return $html;
4324 + }
1796 4325
1797 - ?>
1798 - <div id="<?php echo $field->htmlvar_name;?>_row"
1799 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
4326 + /**
4327 + * Form field template for Phone field.
4328 + *
4329 + * @param string $html Form field html
4330 + * @param object $field Field info.
4331 + * @param string $value Form field default value.
4332 + * @param string $form_type Form type
4333 + *
4334 + * @return string $html Modified form field html.
4335 + * @since 1.0.0
4336 + *
4337 + */
4338 + public function form_input_phone( $html, $field, $value, $form_type ) {
4339 + if ( empty( $html ) ) {
4340 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4341 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
4342 + $bs_sr_only = $design_style ? 'sr-only' : '';
4343 + $bs_form_control = $design_style ? 'form-control' : '';
4344 + ob_start(); // Start buffering;
4345 + $site_title = uwp_get_form_label( $field );
4346 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
4347 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
1800 4348
1801 - <?php
1802 - $site_title = uwp_get_form_label($field);
1803 - if (!is_admin()) { ?>
1804 - <label>
1805 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1806 - <?php if ($field->is_required) echo '<span>*</span>';?>
1807 - </label>
1808 - <?php } ?>
4349 + if ( $design_style ) {
4350 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
1809 4351
4352 + echo aui()->input(
4353 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4354 + 'type' => 'tel',
4355 + 'id' => esc_attr( $field->htmlvar_name ),
4356 + 'name' => esc_attr( $field->htmlvar_name ),
4357 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
4358 + 'title' => esc_html( $site_title ),
4359 + 'value' => esc_attr( $value ),
4360 + 'required' => (bool) $field->is_required,
4361 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
4362 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
4363 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
4364 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
4365 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
4366 + )
4367 + );
4368 + } else {
4369 + ?>
4370 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
4371 + class="
4372 + <?php
4373 + if ( $field->is_required ) {
4374 + echo 'required_field';
4375 + }
4376 + ?>
4377 + clearfix uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
4378 + <?php
4379 + if ( ! is_admin() ) {
4380 + ?>
4381 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4382 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4383 + <?php
4384 + if ( $field->is_required ) {
4385 + echo '<span>*</span>';
4386 + }
4387 + ?>
4388 + </label>
4389 + <?php } ?>
4390 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4391 + class="<?php echo esc_attr( $field->css_class ); ?> <?php echo esc_attr( $bs_form_control ); ?>"
4392 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
4393 + title="<?php echo esc_attr( $site_title ); ?>"
4394 + <?php
4395 + if ( $field->for_admin_use == 1 ) {
4396 + echo 'readonly="readonly"';
4397 + }
4398 + ?>
4399 + <?php
4400 + if ( $field->is_required == 1 ) {
4401 + echo 'required="required"';
4402 + }
4403 + ?>
4404 + type="tel"
4405 + value="<?php echo esc_html( $value ); ?>">
4406 + </div>
4407 + <?php
4408 + }
4409 + $html = ob_get_clean();
4410 + }
1810 4411
1811 - <?php if ($field->option_values) {
1812 - $option_values = uwp_string_values_to_options($field->option_values, true);
4412 + return $html;
4413 + }
1813 4414
1814 - if (!empty($option_values)) {
1815 - $count = 0;
1816 - foreach ($option_values as $option_value) {
1817 - if (empty($option_value['optgroup'])) {
1818 - $count++;
1819 - if ($count == 1) {
1820 - $class = "uwp-radio-first";
1821 - } else {
1822 - $class = "";
1823 - }
1824 - ?>
1825 - <span class="uwp-radios <?php echo $class; ?>">
1826 - <input name="<?php echo $field->htmlvar_name; ?>"
1827 - id="<?php echo $field->htmlvar_name; ?>"
1828 - title="<?php echo esc_attr($option_value['label']); ?>"
1829 - <?php checked($value, $option_value['value']);?>
1830 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
1831 - value="<?php echo esc_attr($option_value['value']); ?>"
1832 - class="uwp-radio" type="radio" />
1833 - <?php echo $option_value['label']; ?>
1834 - </span>
1835 - <?php
1836 - }
1837 - }
1838 - }
1839 - }
1840 - ?>
1841 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1842 - <?php if ($field->is_required) { ?>
1843 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1844 - <?php } ?>
1845 - </div>
1846 - <?php
1847 - $html = ob_get_clean();
1848 - }
4415 + public function form_input_register_gdpr( $html, $field, $value, $form_type ) {
1849 4416
1850 - return $html;
1851 - }
4417 + $form_id = isset( $field->form_id ) ? (int) $field->form_id : 1;
4418 + $reg_gdpr = uwp_get_register_form_by( $form_id, 'gdpr_page' );
4419 + if ( empty( $reg_gdpr ) ) {
4420 + $reg_gdpr = uwp_get_option( 'register_gdpr_page', false );
4421 + }
1852 4422
1853 - /**
1854 - * Form field template for text field type.
1855 - *
1856 - * @since 1.0.0
1857 - * @package userswp
1858 - *
1859 - * @param string $html Form field html
1860 - * @param object $field Field info.
1861 - * @param string $value Form field default value.
1862 - * @param string $form_type Form type
1863 - *
1864 - * @return string Modified form field html.
1865 - */
1866 - public function uwp_form_input_text($html, $field, $value, $form_type){
4423 + if ( ! empty( $reg_gdpr ) ) {
1867 4424
1868 - // Check if there is a custom field specific filter.
1869 - if(has_filter("uwp_form_input_text_{$field->htmlvar_name}")){
1870 - $html = apply_filters("uwp_form_input_text_{$field->htmlvar_name}",$html, $field, $value, $form_type);
1871 - }
4425 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4426 + $bs_form_group = $design_style ? 'form-group mb-3 form-check' : '';
4427 + $bs_form_control = $design_style ? 'form-check-input' : '';
4428 + $site_title = uwp_get_form_label( $field );
4429 + $field->htmlvar_name = 'register_gdpr';
4430 + $id = wp_doing_ajax() ? $field->htmlvar_name . '_ajax' : $field->htmlvar_name;
1872 4431
1873 - // If no html then we run the standard output.
1874 - if(empty($html)) {
4432 + $gdpr_page = get_permalink( $reg_gdpr );
4433 + $link_start = '<a href="' . esc_url( $gdpr_page ) . '" target="_blank">';
4434 + $link_end = '</a>';
4435 + $field_desc = uwp_get_field_description( $field, '' );
4436 + $field_desc = str_replace( '%%link_start%%', $link_start, $field_desc );
4437 + $field_desc = str_replace( '%%link_end%%', $link_end, $field_desc );
4438 + $content = $field_desc ? $field_desc : sprintf( __( 'By using this form I agree to the storage and handling of my data by this website. View our %1$s %2$s %3$s.', 'userswp' ), '<a href="' . esc_url( $gdpr_page ) . '" target="_blank">', $site_title, '</a>' );
4439 + $checked = $value == '1' ? true : false;
1875 4440
1876 - ob_start(); // Start buffering;
4441 + ob_start(); // Start buffering;
1877 4442
1878 - $type = 'text';
1879 - $step = false;
1880 - //number and float validation $validation_pattern
1881 - if(isset($field->data_type) && $field->data_type == 'INT'){
1882 - $type = 'number';
1883 - } elseif(isset($field->data_type) && $field->data_type == 'FLOAT'){
1884 - $dp = $field->decimal_point;
1885 - switch ($dp) {
1886 - case "1":
1887 - $step = "0.1";
1888 - break;
1889 - case "2":
1890 - $step = "0.01";
1891 - break;
1892 - case "3":
1893 - $step = "0.001";
1894 - break;
1895 - case "4":
1896 - $step = "0.0001";
1897 - break;
1898 - case "5":
1899 - $step = "0.00001";
1900 - break;
1901 - case "6":
1902 - $step = "0.000001";
1903 - break;
1904 - case "7":
1905 - $step = "0.0000001";
1906 - break;
1907 - case "8":
1908 - $step = "0.00000001";
1909 - break;
1910 - case "9":
1911 - $step = "0.000000001";
1912 - break;
1913 - case "10":
1914 - $step = "0.0000000001";
1915 - break;
1916 - default:
1917 - $step = "0.01";
1918 - break;
1919 - }
1920 - $type = 'number';
1921 - }
4443 + // bootstrap
4444 + if ( $design_style ) {
4445 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
4446 + echo '<input type="hidden" name="' . esc_attr( $field->htmlvar_name ) . '" id="checkbox_' . esc_attr( $id ) . '" value="0"/>';
1922 4447
1923 - ?>
4448 + echo aui()->input( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4449 + array(
4450 + 'id' => esc_attr( $id ),
4451 + 'name' => esc_attr( $field->htmlvar_name ),
4452 + 'type' => 'checkbox',
4453 + 'value' => '1',
4454 + 'title' => esc_html( $site_title ),
4455 + 'label' => wp_kses_post( $content . $required ),
4456 + 'label_show' => true,
4457 + 'required' => ! empty( $field->is_required ) ? true : false,
4458 + 'checked' => (bool) $checked,
4459 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
4460 + 'validation_text' => ! empty( $field->is_required ) ? esc_attr__( stripslashes( $field->required_msg ), 'userswp' ) : '',
4461 + )
4462 + );
1924 4463
1925 - <div id="<?php echo $field->htmlvar_name;?>_row"
1926 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
4464 + } else {
4465 + ?>
4466 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
4467 + class="
4468 + <?php
4469 + if ( $field->is_required ) {
4470 + echo 'required_field';
4471 + }
4472 + ?>
4473 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
4474 + <input type="hidden" name="<?php echo esc_attr( $field->htmlvar_name ); ?>" value="0"/>
4475 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4476 + class="<?php echo esc_attr( $field->css_class ); ?> <?php echo esc_attr( $bs_form_control ); ?>"
4477 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
4478 + title="<?php echo esc_attr( $site_title ); ?>"
4479 + <?php
4480 + if ( $value == '1' ) {
4481 + echo 'checked="checked"';
4482 + }
4483 + ?>
4484 + type="<?php echo esc_attr( $field->field_type ); ?>"
4485 + value="1">
4486 + <?php
4487 + echo ( trim( $content ) ) ? wp_kses_post( $content ) : '&nbsp;';
4488 + ?>
4489 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4490 + <?php if ( $field->is_required ) { ?>
4491 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4492 + <?php } ?>
4493 + </div>
1927 4494
1928 - <?php
1929 - $site_title = uwp_get_form_label($field);
1930 - $manual_label = apply_filters('uwp_login_username_label_manual', true);
1931 - if ($manual_label
1932 - && isset($field->form_type)
1933 - && $field->form_type == 'login'
1934 - && $field->htmlvar_name == 'uwp_login_username') {
1935 - $site_title = __("Username or Email", 'userswp');
1936 - }
1937 - if (!is_admin()) { ?>
1938 - <label>
1939 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
1940 - <?php if ($field->is_required) echo '<span>*</span>';?>
1941 - </label>
1942 - <?php } ?>
4495 + <?php
4496 + }
1943 4497
1944 - <input name="<?php echo $field->htmlvar_name;?>"
1945 - class="<?php echo $field->css_class; ?> uwp_textfield"
1946 - id="<?php echo $field->htmlvar_name;?>"
1947 - placeholder="<?php echo $site_title; ?>"
1948 - value="<?php echo esc_attr(stripslashes($value));?>"
1949 - title="<?php echo $site_title; ?>"
1950 - oninvalid="this.setCustomValidity('<?php _e($field->required_msg, 'userswp'); ?>')"
1951 - oninput="setCustomValidity('')"
1952 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
1953 - <?php if ($field->for_admin_use == 1) { echo 'readonly="readonly"'; } ?>
1954 - type="<?php echo $type; ?>"
1955 - <?php if ($step) { echo 'step="'.$step.'"'; } ?>
1956 - />
1957 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
1958 - <?php if ($field->is_required) { ?>
1959 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
1960 - <?php } ?>
1961 - </div>
4498 + $html = ob_get_clean();
1962 4499
4500 + } else {
4501 + $html = '<input type="hidden" name="register_gdpr" value="-1"/>';
4502 + }
1963 4503
1964 - <?php
1965 - $html = ob_get_clean();
1966 - }
4504 + return $html;
4505 + }
1967 4506
1968 - return $html;
1969 - }
4507 + public function form_input_register_tos( $html, $field, $value, $form_type ) {
1970 4508
1971 - /**
1972 - * Form field template for textarea field type.
1973 - *
1974 - * @since 1.0.0
1975 - * @package userswp
1976 - *
1977 - * @param string $html Form field html
1978 - * @param object $field Field info.
1979 - * @param string $value Form field default value.
1980 - * @param string $form_type Form type
1981 - *
1982 - * @return string Modified form field html.
1983 - */
1984 - public function uwp_form_input_textarea($html, $field, $value, $form_type){
4509 + $form_id = isset( $field->form_id ) ? (int) $field->form_id : 1;
4510 + $reg_tos = uwp_get_register_form_by( $form_id, 'tos_page' );
4511 + if ( empty( $reg_tos ) ) {
4512 + $reg_tos = uwp_get_option( 'register_terms_page', false );
4513 + }
1985 4514
1986 - // Check if there is a field specific filter.
1987 - if(has_filter("uwp_form_input_textarea_{$field->htmlvar_name}")){
1988 - $html = apply_filters("uwp_form_input_textarea_{$field->htmlvar_name}", $html, $field, $value, $form_type);
1989 - }
4515 + if ( ! empty( $reg_tos ) ) {
1990 4516
1991 - // If no html then we run the standard output.
1992 - if(empty($html)) {
4517 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4518 + $bs_form_group = $design_style ? 'form-group mb-3 form-check' : '';
4519 + $bs_form_control = $design_style ? 'form-check-input' : '';
1993 4520
1994 - ob_start(); // Start buffering;
4521 + $site_title = uwp_get_form_label( $field );
4522 + $terms_page = get_permalink( $reg_tos );
4523 + $link_start = '<a href="' . esc_url( $terms_page ) . '" target="_blank">';
4524 + $link_end = '</a>';
4525 + $field_desc = uwp_get_field_description( $field, '' );
4526 + $field_desc = str_replace( '%%link_start%%', $link_start, $field_desc );
4527 + $field_desc = str_replace( '%%link_end%%', $link_end, $field_desc );
4528 + $field->htmlvar_name = 'register_tos';
4529 + $id = wp_doing_ajax() ? $field->htmlvar_name . '_ajax' : $field->htmlvar_name;
1995 4530
1996 - ?>
1997 - <div id="<?php echo $field->htmlvar_name;?>_row"
1998 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
4531 + $content = $field_desc ? $field_desc : sprintf( __( 'I accept the %1$s %2$s %3$s.', 'userswp' ), '<a href="' . esc_url( $terms_page ) . '" target="_blank">', $site_title, '</a>' );
4532 + $checked = $value == '1' ? true : false;
1999 4533
2000 - <?php
2001 - $site_title = uwp_get_form_label($field);
2002 - if (!is_admin()) { ?>
2003 - <label>
2004 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2005 - <?php if ($field->is_required) echo '<span>*</span>';?>
2006 - </label>
2007 - <?php } ?>
4534 + ob_start();
2008 4535
2009 - <textarea name="<?php echo $field->htmlvar_name; ?>"
2010 - class="<?php echo $field->css_class; ?>"
2011 - placeholder="<?php echo $site_title; ?>"
2012 - title="<?php echo $site_title; ?>"
2013 - oninvalid="this.setCustomValidity('<?php _e($field->required_msg, 'userswp'); ?>')"
2014 - oninput="setCustomValidity('')"
2015 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
2016 - type="<?php echo $field->field_type; ?>"
2017 - rows="4"><?php echo stripslashes($value); ?></textarea>
2018 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
2019 - <?php if ($field->is_required) { ?>
2020 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
2021 - <?php } ?>
2022 - </div>
4536 + if ( $design_style ) {
4537 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
4538 + echo '<input type="hidden" name="' . esc_attr( $field->htmlvar_name ) . '" id="checkbox_' . esc_attr( $id ) . '" value="0"/>';
2023 4539
2024 - <?php
2025 - $html = ob_get_clean();
2026 - }
4540 + echo aui()->input( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4541 + array(
4542 + 'id' => esc_attr( $id ),
4543 + 'name' => esc_attr( $field->htmlvar_name ),
4544 + 'type' => 'checkbox',
4545 + 'value' => '1',
4546 + 'title' => esc_html( $site_title ),
4547 + 'label' => wp_kses_post( $content . $required ),
4548 + 'label_show' => true,
4549 + 'required' => ! empty( $field->is_required ) ? true : false,
4550 + 'checked' => (bool) $checked,
4551 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
4552 + 'validation_text' => ! empty( $field->is_required ) ? esc_attr__( stripslashes( $field->required_msg ), 'userswp' ) : '',
4553 + )
4554 + );
2027 4555
2028 - return $html;
2029 - }
4556 + } else {
4557 + ?>
4558 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
4559 + class="
4560 + <?php
4561 + if ( $field->is_required ) {
4562 + echo 'required_field';
4563 + }
4564 + ?>
4565 + uwp_form_<?php echo esc_attr( $field->field_type ); ?>_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
4566 + <input type="hidden" name="<?php echo esc_attr( $field->htmlvar_name ); ?>" value="0"/>
4567 + <input name="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4568 + class="<?php echo esc_attr( $field->css_class ); ?> <?php echo esc_attr( $bs_form_control ); ?>"
4569 + placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
4570 + title="<?php echo esc_attr( $site_title ); ?>"
4571 + <?php
4572 + if ( $value == '1' ) {
4573 + echo 'checked="checked"';
4574 + }
4575 + ?>
4576 + type="<?php echo esc_attr( $field->field_type ); ?>"
4577 + value="1">
4578 + <?php
4579 + echo ( trim( $content ) ) ? wp_kses_post( $content ) : '&nbsp;';
4580 + ?>
4581 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4582 + <?php if ( $field->is_required ) { ?>
4583 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4584 + <?php } ?>
4585 + </div>
2030 4586
2031 - /**
2032 - * Form field template for fieldset field type.
2033 - *
2034 - * @since 1.0.0
2035 - * @package userswp
2036 - *
2037 - * @param string $html Form field html
2038 - * @param object $field Field info.
2039 - * @param string $value Form field default value.
2040 - * @param string $form_type Form type
2041 - *
2042 - * @return string Modified form field html.
2043 - */
2044 - public function uwp_form_input_fieldset($html, $field, $value, $form_type) {
2045 - // Check if there is a custom field specific filter.
2046 - if(has_filter("uwp_form_input_fieldset_{$field->htmlvar_name}")){
2047 - $html = apply_filters("uwp_form_input_fieldset_{$field->htmlvar_name}",$html, $field, $value, $form_type);
2048 - }
4587 + <?php
2049 4588
2050 - // If no html then we run the standard output.
2051 - if(empty($html)) {
4589 + }
2052 4590
2053 - ob_start(); // Start buffering;
2054 - ?>
2055 - <h3 class="uwp_input_fieldset <?php echo $field->css_class; ?>">
2056 - <?php echo $field->site_title;; ?>
2057 - <?php if ( $field->help_text != '' ) {
2058 - echo '<small>( ' . $field->help_text . ' )</small>';
2059 - } ?></h3>
2060 - <?php
2061 - $html = ob_get_clean();
2062 - }
4591 + $html = ob_get_clean();
2063 4592
2064 - return $html;
2065 - }
4593 + } else {
4594 + $html = '<input type="hidden" name="register_tos" value="-1"/>';
4595 + }
2066 4596
2067 - /**
2068 - * Form field template for url field type.
2069 - *
2070 - * @since 1.0.0
2071 - * @package userswp
2072 - *
2073 - * @param string $html Form field html
2074 - * @param object $field Field info.
2075 - * @param string $value Form field default value.
2076 - * @param string $form_type Form type
2077 - *
2078 - * @return string Modified form field html.
2079 - */
2080 - public function uwp_form_input_url($html, $field, $value, $form_type){
4597 + return $html;
4598 + }
2081 4599
4600 + /**
4601 + * Adds enctype tag in form for file fields.
4602 + *
4603 + * @return void
4604 + * @package userswp
4605 + *
4606 + * @since 1.0.0
4607 + */
4608 + function add_multipart_to_admin_edit_form() {
4609 + global $wpdb;
4610 + $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
4611 + $fields = $wpdb->get_results( 'SELECT * FROM ' . $table_name . " WHERE form_type = 'account' AND field_type = 'file' AND is_default = '0' ORDER BY sort_order ASC" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
4612 + if ( $fields ) {
4613 + echo 'enctype="multipart/form-data"';
4614 + }
4615 + }
2082 4616
2083 - // Check if there is a custom field specific filter.
2084 - if(has_filter("uwp_form_input_url_{$field->htmlvar_name}")){
2085 - $html = apply_filters("uwp_form_input_url_{$field->htmlvar_name}",$html, $field, $value, $form_type);
2086 - }
4617 + /**
4618 + * Handles UsersWP custom field requests from admin.
4619 + *
4620 + * @param int $user_id User ID.
4621 + *
4622 + * @return void
4623 + * @since 1.0.0
4624 + * @package userswp
4625 + *
4626 + */
4627 + public function update_profile_extra_admin_edit( $user_id ) {
4628 + global $wpdb;
4629 + $file_obj = new UsersWP_Files();
4630 + $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
4631 + //Normal fields
4632 + $fields = $wpdb->get_results( 'SELECT * FROM ' . $table_name . " WHERE form_type = 'account' AND field_type != 'file' AND field_type != 'fieldset' ORDER BY sort_order ASC" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
4633 + if ( $fields ) {
4634 + if ( isset( $_POST['locale'] ) ) {
4635 + $_POST['uwp_language'] = sanitize_text_field( $_POST['locale'] );
4636 + }
4637 + $result = uwp_validate_fields( $_POST, 'account', $fields );
4638 + if ( is_wp_error( $result ) ) {
4639 + die( wp_kses_post( $result->get_error_message() ) );
4640 + }
4641 + if ( isset( $result['display_name'] ) && ! empty( $result['display_name'] ) ) {
4642 + $display_name = $result['display_name'];
4643 + } elseif ( ! empty( $first_name ) || ! empty( $last_name ) ) {
4644 + $display_name = $result['first_name'] . ' ' . $result['last_name'];
4645 + } else {
4646 + $user_info = get_userdata( $user_id );
4647 + $display_name = $user_info->user_login;
4648 + }
4649 + $result['display_name'] = $display_name;
4650 + if ( ! is_wp_error( $result ) ) {
4651 + foreach ( $fields as $field ) {
4652 + $value = isset( $result[ $field->htmlvar_name ] ) ? $result[ $field->htmlvar_name ] : '';
4653 + if ( $value == '0' || ! empty( $value ) ) {
4654 + uwp_update_usermeta( $user_id, $field->htmlvar_name, $value );
4655 + }
4656 + }
4657 + }
4658 + }
2087 4659
2088 - // If no html then we run the standard output.
2089 - if(empty($html)) {
4660 + //File fields
4661 + $fields = $wpdb->get_results( 'SELECT * FROM ' . $table_name . " WHERE form_type = 'account' AND field_type = 'file' AND is_default = '0' ORDER BY sort_order ASC" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
4662 + if ( $fields ) {
4663 + $result = $file_obj->validate_uploads( $_FILES, 'account', true, $fields );
4664 + if ( ! is_wp_error( $result ) ) {
4665 + foreach ( $fields as $field ) {
4666 + $value = isset( $result[ $field->htmlvar_name ] ) ? $result[ $field->htmlvar_name ] : '';
4667 + if ( $value == '0' || ! empty( $value ) ) {
4668 + uwp_update_usermeta( $user_id, $field->htmlvar_name, $value );
4669 + }
4670 + }
4671 + }
4672 + }
4673 + }
2090 4674
2091 - ob_start(); // Start buffering;
2092 - ?>
2093 - <div id="<?php echo $field->htmlvar_name;?>_row"
2094 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
4675 + /**
4676 + * Form field template for country field.
4677 + *
4678 + * @param string $html Form field html
4679 + * @param object $field Field info.
4680 + * @param string $value Form field default value.
4681 + * @param string $form_type Form type
4682 + *
4683 + * @return string Modified form field html.
4684 + * @package userswp
4685 + *
4686 + * @since 1.0.0
4687 + */
4688 + public function form_input_select_country( $html, $field, $value, $form_type ) {
2095 4689
4690 + // If no html then we run the standard output.
4691 + if ( empty( $html ) ) {
4692 +
4693 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4694 + $bs_form_group = $design_style ? 'form-group m-0' : ''; // country wrapper div added by JS adds margin so we remove ours
4695 + $bs_sr_only = $design_style ? 'sr-only' : '';
4696 + $bs_form_control = $design_style ? 'form-control' : '';
4697 +
4698 + ob_start(); // Start buffering;
4699 + ?>
4700 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row" class="<?php echo ( $field->is_required ? 'required_field' : '' ); ?> uwp_clear <?php echo esc_attr( $bs_form_group . ' ' . $field->css_class ); ?>">
4701 +
4702 + <?php
4703 + $site_title = uwp_get_form_label( $field );
4704 +
4705 + if ( ! is_admin() && ! wp_doing_ajax() ) {
4706 + ?>
4707 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4708 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4709 + <?php
4710 + if ( $field->is_required ) {
4711 + echo '<span class="text-danger">*</span>';
4712 + }
4713 + ?>
4714 + </label>
4715 + <?php
4716 + }
4717 + // if value empty set the default
4718 + if ( $value == '' && isset( $field->default_value ) && $field->default_value ) {
4719 + $value = $field->default_value;
4720 + }
4721 + if ( $value === false ) {
4722 + $value = '';
4723 + }
4724 + $select_country_options = wp_json_encode( array( 'defaultCountry' => wp_unslash( $value ) ) );
4725 + $select_country_options = apply_filters( 'uwp_form_input_select_country', $select_country_options, $field, $value, $form_type );
4726 +
4727 + $htmlvar_name = $field->htmlvar_name;
4728 + if ( wp_doing_ajax() ) {
4729 + $htmlvar_name .= '_ajax';
4730 + }
4731 + ?>
4732 + <input type="text" class="uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>" title="<?php echo esc_attr( $site_title ); ?>" id="<?php echo esc_attr( $htmlvar_name ); ?>"/>
4733 + <input type="hidden" id="<?php echo esc_attr( $htmlvar_name ); ?>_code" name="<?php echo esc_attr( $field->htmlvar_name ); ?>"/>
4734 + <script>jQuery(function(){jQuery("#<?php echo esc_js( $htmlvar_name ); ?>").countrySelect(<?php echo wp_json_encode( json_decode( $select_country_options ) ); ?>);});</script>
4735 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4736 + <?php if ( $field->is_required ) { ?>
4737 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4738 + <?php } ?>
4739 + </div>
4740 + <?php
4741 + $html = ob_get_clean();
4742 + }
4743 +
4744 + return $html;
4745 + }
4746 +
4747 + /**
4748 + * Form field template for language field.
4749 + *
4750 + * @param string $html Form field html
4751 + * @param object $field Field info.
4752 + * @param string $value Form field default value.
4753 + * @param string $form_type Form type
4754 + *
4755 + * @return string Modified form field html.
4756 + * @package userswp
4757 + *
4758 + * @since 1.0.0
4759 + */
4760 + public function form_input_uwp_language( $html, $field, $value, $form_type ) {
4761 +
4762 + // If no html then we run the standard output.
4763 + if ( empty( $html ) ) {
4764 +
4765 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4766 + $bs_form_group = $design_style ? 'form-group m-0' : '';
4767 + $bs_sr_only = $design_style ? 'sr-only' : '';
4768 + $bs_form_control = $design_style ? 'form-control' : '';
4769 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
4770 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
4771 +
4772 + ob_start(); // Start buffering;
4773 +
4774 + ?>
4775 + <div id="<?php echo esc_attr( $field->htmlvar_name ); ?>_row"
4776 + class="
2096 4777 <?php
2097 - $site_title = uwp_get_form_label($field);
2098 - if (!is_admin()) { ?>
2099 - <label>
2100 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2101 - <?php if ($field->is_required) echo '<span>*</span>';?>
4778 + if ( $field->is_required ) {
4779 + echo 'required_field';
4780 + }
4781 + ?>
4782 + uwp_clear <?php echo esc_attr( $bs_form_group . ' ' . $field->css_class ); ?>">
4783 +
4784 + <?php
4785 + $site_title = uwp_get_form_label( $field );
4786 + if ( ! is_admin() && ! wp_doing_ajax() ) {
4787 + ?>
4788 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4789 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4790 + <?php
4791 + if ( $field->is_required ) {
4792 + echo '<span class="text-danger">*</span>';
4793 + }
4794 + ?>
2102 4795 </label>
2103 - <?php } ?>
4796 + <?php } ?>
2104 4797
2105 - <input name="<?php echo $field->htmlvar_name;?>"
2106 - class="<?php echo $field->css_class; ?> uwp_textfield"
2107 - id="<?php echo $field->htmlvar_name;?>"
2108 - placeholder="<?php echo $site_title; ?>"
2109 - value="<?php echo esc_attr(stripslashes($value));?>"
2110 - title="<?php echo $site_title; ?>"
2111 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
2112 - type="url"
2113 - oninvalid="setCustomValidity('<?php _e('Please enter a valid URL including http://', 'userswp'); ?>')"
2114 - onchange="try{setCustomValidity('')}catch(e){}"
2115 - />
2116 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
2117 - <?php if ($field->is_required) { ?>
2118 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
2119 - <?php } ?>
2120 - </div>
4798 + <?php
4799 + if ( empty( $field->default_value ) ) {
4800 + $field->default_value = 'site-default';
4801 + }
2121 4802
2122 - <?php
2123 - $html = ob_get_clean();
2124 - }
4803 + // if value empty set the default
4804 + if ( $value == '' && isset( $field->default_value ) && $field->default_value ) {
4805 + $value = $field->default_value;
4806 + }
2125 4807
2126 - return $html;
2127 - }
4808 + require_once ABSPATH . 'wp-admin/includes/translation-install.php';
4809 + $translations = wp_get_available_translations();
4810 + $available_languages = get_available_languages();
4811 + $languages = array( 'site-default' => __( 'Site Default', 'userswp' ) );
2128 4812
2129 - /**
2130 - * Form field template for email field type.
2131 - *
2132 - * @since 1.0.0
2133 - * @package userswp
2134 - *
2135 - * @param string $html Form field html
2136 - * @param object $field Field info.
2137 - * @param string $value Form field default value.
2138 - * @param string $form_type Form type
2139 - *
2140 - * @return string Modified form field html.
2141 - */
2142 - public function uwp_form_input_email($html, $field, $value, $form_type){
4813 + foreach ( $available_languages as $locale ) {
4814 + if ( isset( $translations[ $locale ] ) ) {
4815 + $translation = $translations[ $locale ];
4816 + $languages[ $translation['language'] ] = $translation['native_name'];
2143 4817
4818 + // Remove installed language from available translations.
4819 + unset( $translations[ $locale ] );
4820 + } else {
4821 + $languages[ $locale ] = $translation[ $locale ];
4822 + }
4823 + }
2144 4824
2145 - // Check if there is a custom field specific filter.
2146 - if(has_filter("uwp_form_input_email_{$field->htmlvar_name}")){
2147 - $html = apply_filters("uwp_form_input_email_{$field->htmlvar_name}",$html, $field, $value, $form_type);
2148 - }
4825 + if ( $design_style ) {
2149 4826
2150 - // If no html then we run the standard output.
2151 - if(empty($html)) {
4827 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
2152 4828
2153 - ob_start(); // Start buffering;
2154 - ?>
2155 - <div id="<?php echo $field->htmlvar_name;?>_row"
2156 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
4829 + echo aui()->select(
4830 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4831 + 'id' => esc_attr( $field->htmlvar_name ),
4832 + 'name' => esc_attr( $field->htmlvar_name ),
4833 + 'placeholder' => esc_attr( uwp_get_field_placeholder( $field ) ),
4834 + 'title' => esc_attr( $site_title ),
4835 + 'value' => esc_attr( $value ),
4836 + 'required' => (bool) $field->is_required,
4837 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
4838 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
4839 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
4840 + 'label' => wp_kses_post( $site_title . $required ),
4841 + 'options' => $languages, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4842 + 'select2' => true,
4843 + 'wrap_class' => isset( $field->css_class ) ? esc_attr( $field->css_class ) : '',
4844 + )
4845 + );
4846 + } else {
4847 + ?>
4848 + <select name="<?php echo esc_attr( $field->htmlvar_name ); ?>" id="<?php echo esc_attr( $field->htmlvar_name ); ?>"
4849 + class="uwp_textfield aui-select2 <?php echo esc_attr( $bs_form_control ); ?>"
4850 + title="<?php echo esc_attr( $site_title ); ?>"
4851 + data-placeholder="<?php echo esc_attr( uwp_get_field_placeholder( $field ) ); ?>"
4852 + ><?php echo $select_options; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
4853 + </select>
4854 + <span class="uwp_message_note"><?php echo wp_kses_post( uwp_get_field_description( $field ) ); ?></span>
4855 + <?php if ( $field->is_required ) { ?>
4856 + <span class="uwp_message_error invalid-feedback"><?php echo esc_html__( stripslashes( $field->required_msg ), 'userswp' ); ?></span>
4857 + <?php
4858 + }
4859 + }
2157 4860
2158 - <?php
2159 - $site_title = uwp_get_form_label($field);
2160 - if (!is_admin()) { ?>
2161 - <label>
2162 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2163 - <?php if ($field->is_required) echo '<span>*</span>';?>
2164 - </label>
2165 - <?php } ?>
4861 + $html = ob_get_clean();
4862 + }
2166 4863
2167 - <input name="<?php echo $field->htmlvar_name;?>"
2168 - class="<?php echo $field->css_class; ?> uwp_textfield"
2169 - id="<?php echo $field->htmlvar_name;?>"
2170 - placeholder="<?php echo $site_title; ?>"
2171 - value="<?php echo esc_attr(stripslashes($value));?>"
2172 - title="<?php echo $site_title; ?>"
2173 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
2174 - type="email"
2175 - />
2176 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
2177 - <?php if ($field->is_required) { ?>
2178 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
2179 - <?php } ?>
2180 - </div>
4864 + return $html;
4865 + }
2181 4866
4867 + /**
4868 + * Adds confirm password field in forms.
4869 + *
4870 + * @param string $html Form field html
4871 + * @param object $field Field info.
4872 + * @param string $value Form field default value.
4873 + * @param string $form_type Form type
4874 + *
4875 + * @return string Modified form field html.
4876 + * @package userswp
4877 + *
4878 + * @since 1.0.0
4879 + */
4880 + public function register_confirm_password_field( $html, $field, $value, $form_type ) {
4881 + if ( $form_type == 'register' ) {
4882 + //confirm password field
4883 + $extra = array();
4884 + if ( isset( $field->extra_fields ) && $field->extra_fields != '' ) {
4885 + $extra = unserialize( $field->extra_fields );
4886 + }
2182 4887
2183 - <?php
2184 - $html = ob_get_clean();
2185 - }
4888 + $enable_confirm_password_field = isset( $extra['confirm_password'] ) ? $extra['confirm_password'] : '0';
4889 + if ( $enable_confirm_password_field == '1' ) {
2186 4890
2187 - if(has_filter("uwp_form_input_email_{$field->htmlvar_name}_after")){
2188 - $html = apply_filters("uwp_form_input_email_{$field->htmlvar_name}_after",$html, $field, $value, $form_type);
2189 - }
4891 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4892 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
4893 + $bs_sr_only = $design_style ? 'sr-only' : '';
4894 + $bs_form_control = $design_style ? 'form-control' : '';
4895 + $site_title = $placeholder = __( 'Confirm Password', 'userswp' );
4896 + $required = '';
4897 + if ( isset( $field->is_required ) && ! empty( $field->is_required ) ) {
4898 + $placeholder .= ' *';
4899 + $required = ' <span class="text-danger">*</span>';
4900 + }
4901 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
4902 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
4903 + $wrap_class = isset( $field->css_class ) ? $field->css_class . ' uwp-password-wrap' : 'uwp-password-wrap';
2190 4904
2191 - return $html;
2192 - }
4905 + ob_start(); // Start buffering;
2193 4906
2194 - /**
2195 - * Form field template for password field type.
2196 - *
2197 - * @since 1.0.0
2198 - * @package userswp
2199 - *
2200 - * @param string $html Form field html
2201 - * @param object $field Field info.
2202 - * @param string $value Form field default value.
2203 - * @param string $form_type Form type
2204 - *
2205 - * @return string Modified form field html.
2206 - */
2207 - public function uwp_form_input_password($html, $field, $value, $form_type){
4907 + if ( $design_style ) {
2208 4908
4909 + echo aui()->input(
4910 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4911 + 'type' => 'password',
4912 + 'id' => 'confirm_password',
4913 + 'name' => 'confirm_password',
4914 + 'placeholder' => esc_attr( $placeholder ),
4915 + 'title' => esc_attr( $site_title ),
4916 + 'value' => esc_attr( $value ),
4917 + 'required' => (bool) $field->is_required,
4918 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
4919 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
4920 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
4921 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
4922 + 'wrap_class' => esc_attr( $wrap_class ),
4923 + )
4924 + );
4925 + } else {
4926 + ?>
4927 + <div id="uwp_account_confirm_password_row"
4928 + class="<?php echo 'required_field'; ?> uwp_form_password_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
2209 4929
2210 - // Check if there is a custom field specific filter.
2211 - if(has_filter("uwp_form_input_password_{$field->htmlvar_name}")){
2212 - $html = apply_filters("uwp_form_input_password_{$field->htmlvar_name}",$html, $field, $value, $form_type);
2213 - }
4930 + <?php
2214 4931
2215 - // If no html then we run the standard output.
2216 - if(empty($html)) {
4932 + if ( ! is_admin() ) {
4933 + ?>
4934 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
4935 + <?php echo ( trim( $site_title ) ) ? esc_html( $site_title ) : '&nbsp;'; ?>
4936 + <?php
4937 + if ( $field->is_required ) {
4938 + echo '<span>*</span>';
4939 + }
4940 + ?>
4941 + </label>
4942 + <?php } ?>
4943 + <input name="confirm_password" class="uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>" id="uwp_account_confirm_password" placeholder="<?php echo esc_attr( $placeholder ); ?>" value="" title="<?php echo esc_attr( $site_title ); ?>" <?php echo 'required="required"'; ?> type="password"/>
4944 + </div>
2217 4945
2218 - ob_start(); // Start buffering;
2219 - ?>
2220 - <div id="<?php echo $field->htmlvar_name;?>_row"
2221 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_<?php echo $field->field_type; ?>_row uwp_clear">
4946 + <?php
4947 + }
4948 + $confirm_html = ob_get_clean();
4949 + $html = $html . $confirm_html;
4950 + }
4951 + }
2222 4952
2223 - <?php
2224 - $site_title = uwp_get_form_label($field);
2225 - if (!is_admin()) { ?>
2226 - <label>
2227 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2228 - <?php if ($field->is_required) echo '<span>*</span>';?>
2229 - </label>
2230 - <?php } ?>
4953 + return $html;
4954 + }
2231 4955
2232 - <input name="<?php echo $field->htmlvar_name;?>"
2233 - class="<?php echo $field->css_class; ?> uwp_textfield"
2234 - id="<?php echo $field->htmlvar_name;?>"
2235 - placeholder="<?php echo $site_title; ?>"
2236 - value="<?php echo esc_attr(stripslashes($value));?>"
2237 - title="<?php echo $site_title; ?>"
2238 - <?php if ($field->is_required == 1) { echo 'required="required"'; } ?>
2239 - type="password"
2240 - />
2241 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
2242 - <?php if ($field->is_required) { ?>
2243 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
2244 - <?php } ?>
2245 - </div>
4956 + /**
4957 + * Adds confirm email field in forms.
4958 + *
4959 + * @param string $html Form field html
4960 + * @param object $field Field info.
4961 + * @param string $value Form field default value.
4962 + * @param string $form_type Form type
4963 + *
4964 + * @return string Modified form field html.
4965 + * @package userswp
4966 + *
4967 + * @since 1.0.0
4968 + */
4969 + public function register_confirm_email_field( $html, $field, $value, $form_type ) {
4970 + if ( $form_type == 'register' ) {
4971 + //confirm email field
4972 + $extra = array();
4973 + if ( isset( $field->extra_fields ) && $field->extra_fields != '' ) {
4974 + $extra = unserialize( $field->extra_fields );
4975 + }
4976 + $enable_confirm_email_field = isset( $extra['confirm_email'] ) ? $extra['confirm_email'] : '0';
4977 + if ( $enable_confirm_email_field == '1' ) {
2246 4978
4979 + $design_style = uwp_get_option( 'design_style', 'bootstrap' );
4980 + $bs_form_group = $design_style ? 'form-group mb-3' : '';
4981 + $bs_sr_only = $design_style ? 'sr-only' : '';
4982 + $bs_form_control = $design_style ? 'form-control' : '';
4983 + $site_title = __( 'Confirm Email', 'userswp' );
4984 + $required_msg = ( ! empty( $field->is_required ) && $field->required_msg != '') ? __( stripslashes( $field->required_msg ), 'userswp' ) : '';
4985 + $validation_text = ! empty( $field->validation_msg ) ? __( stripslashes( $field->validation_msg ), 'userswp' ) : '';
2247 4986
2248 - <?php
2249 - $html = ob_get_clean();
2250 - }
4987 + ob_start();
2251 4988
2252 - if(has_filter("uwp_form_input_password_{$field->htmlvar_name}_after")){
2253 - $html = apply_filters("uwp_form_input_password_{$field->htmlvar_name}_after",$html, $field, $value, $form_type);
2254 - }
4989 + if ( $design_style ) {
4990 + $required = ! empty( $field->is_required ) ? ' <span class="text-danger">*</span>' : '';
2255 4991
2256 - return $html;
2257 - }
4992 + echo aui()->input(
4993 + array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
4994 + 'type' => 'email',
4995 + 'id' => esc_attr( $field->htmlvar_name ),
4996 + 'name' => 'confirm_email',
4997 + 'placeholder' => esc_attr( $site_title ),
4998 + 'title' => esc_attr( $site_title ),
4999 + 'value' => esc_attr( $value ),
5000 + 'required' => (bool) $field->is_required,
5001 + 'help_text' => wp_kses_post( uwp_get_field_description( $field ) ),
5002 + 'label' => is_admin() && ! wp_doing_ajax() ? '' : wp_kses_post( $site_title . $required ),
5003 + 'validation_text' => $validation_text != '' ? esc_attr( $validation_text ) : esc_attr( $required_msg ),
5004 + 'validation_pattern' => ! empty( $field->validation_pattern ) ? esc_attr( wp_unslash( $field->validation_pattern ) ) : '',
5005 + )
5006 + );
5007 + } else {
5008 + ?>
5009 + <div id="uwp_account_confirm_email_row"
5010 + class="<?php echo 'required_field'; ?> uwp_form_email_row uwp_clear <?php echo esc_attr( $bs_form_group ); ?>">
2258 5011
5012 + <?php
2259 5013
5014 + if ( ! is_admin() ) {
5015 + ?>
5016 + <label class="<?php echo esc_attr( $bs_sr_only ); ?>">
5017 + <?php echo ( trim( $site_title ) ) ? esc_attr( $site_title ) : '&nbsp;'; ?>
5018 + <?php
5019 + if ( $field->is_required ) {
5020 + echo '<span>*</span>';
5021 + }
5022 + ?>
5023 + </label>
5024 + <?php } ?>
2260 5025
2261 - /**
2262 - * Adds enctype tag in form for file fields.
2263 - *
2264 - * @since 1.0.0
2265 - * @package userswp
2266 - *
2267 - * @return void
2268 - */
2269 - function add_multipart_to_admin_edit_form() {
2270 - global $wpdb;
2271 - $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
2272 - $fields = $wpdb->get_results("SELECT * FROM " . $table_name . " WHERE form_type = 'account' AND field_type = 'file' AND is_default = '0' ORDER BY sort_order ASC");
2273 - if ($fields) {
2274 - echo 'enctype="multipart/form-data"';
2275 - }
2276 - }
5026 + <input name="confirm_email"
5027 + class="uwp_textfield <?php echo esc_attr( $bs_form_control ); ?>"
5028 + id="uwp_account_confirm_email"
5029 + placeholder="<?php echo esc_attr( $site_title ); ?>"
5030 + value=""
5031 + title="<?php echo esc_attr( $site_title ); ?>"
5032 + <?php echo 'required="required"'; ?>
5033 + type="email"
5034 + />
5035 + </div>
5036 + <?php
5037 + }
5038 + $confirm_html = ob_get_clean();
5039 + $html = $html . $confirm_html;
5040 + }
5041 + }
2277 5042
2278 - /**
2279 - * Handles UsersWP custom field requests from admin.
2280 - *
2281 - * @since 1.0.0
2282 - * @package userswp
2283 - *
2284 - * @param int $user_id User ID.
2285 - *
2286 - * @return void
2287 - */
2288 - public function update_profile_extra_admin_edit($user_id) {
2289 - global $wpdb;
2290 - $file_obj = new UsersWP_Files();
2291 - $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
2292 - //Normal fields
2293 - $fields = $wpdb->get_results("SELECT * FROM " . $table_name . " WHERE form_type = 'account' AND field_type != 'file' AND field_type != 'fieldset' ORDER BY sort_order ASC");
2294 - if ($fields) {
2295 - $_POST['uwp_account_first_name'] = $_POST['first_name'];
2296 - $_POST['uwp_account_last_name'] = $_POST['last_name'];
2297 - $_POST['uwp_account_display_name'] = $_POST['nickname'];
2298 - $_POST['uwp_account_email'] = $_POST['email'];
2299 - $_POST['uwp_account_bio'] = $_POST['description'];
2300 - $result = uwp_validate_fields($_POST, 'account', $fields);
2301 - if (isset($result['uwp_account_display_name']) && !empty($result['uwp_account_display_name'])) {
2302 - $display_name = $result['uwp_account_display_name'];
2303 - } else {
2304 - if (!empty($first_name) || !empty($last_name)) {
2305 - $display_name = $result['uwp_account_first_name'] . ' ' . $result['uwp_account_last_name'];
2306 - } else {
2307 - $user_info = get_userdata($user_id);
2308 - $display_name = $user_info->user_login;
2309 - }
2310 - }
2311 - $result['uwp_account_display_name'] = $display_name;
2312 - if (!is_wp_error($result)) {
2313 - foreach ($fields as $field) {
2314 - $value = isset($result[$field->htmlvar_name]) ? $result[$field->htmlvar_name] : '';
2315 - if ($value == '0' || !empty($value)) {
2316 - uwp_update_usermeta($user_id, $field->htmlvar_name, $value);
2317 - }
2318 - }
2319 - }
2320 - }
5043 + return $html;
5044 + }
2321 5045
2322 - //File fields
2323 - $fields = $wpdb->get_results("SELECT * FROM " . $table_name . " WHERE form_type = 'account' AND field_type = 'file' AND is_default = '0' ORDER BY sort_order ASC");
2324 - if ($fields) {
2325 - $result = $file_obj->uwp_validate_uploads($_FILES, 'account', true, $fields);
2326 - if (!is_wp_error($result)) {
2327 - foreach ($fields as $field) {
2328 - $value = $result[$field->htmlvar_name];
2329 - if ($value == '0' || !empty($value)) {
2330 - uwp_update_usermeta($user_id, $field->htmlvar_name, $value);
2331 - }
2332 - }
2333 - }
2334 - }
2335 - }
5046 + /**
5047 + * Handles the privacy form submission.
5048 + *
5049 + * @return void
5050 + * @package userswp
5051 + *
5052 + * @since 1.0.0
5053 + */
5054 + public function privacy_submit_handler() {
5055 + if ( isset( $_POST['uwp_privacy_submit'] ) ) {
5056 + if ( ! isset( $_POST['uwp_privacy_nonce'] ) || ! wp_verify_nonce( $_POST['uwp_privacy_nonce'], 'uwp-privacy-nonce' ) ) {
5057 + return;
5058 + }
2336 5059
5060 + global $wpdb, $uwp_notices;
2337 5061
2338 - /**
2339 - * Adds search form keyword input html.
2340 - *
2341 - * @since 1.0.0
2342 - * @package userswp
2343 - *
2344 - * @param string $keyword Search keyword.
2345 - *
2346 - * @return void
2347 - */
2348 - public function uwp_users_search_form_text_field($keyword) {
2349 - ?>
2350 - <input placeholder="Search For" name="uwps" value="<?php echo $keyword; ?>" class="s search-input" type="text">
2351 - <?php
2352 - }
5062 + // Save fields privacy settings
5063 + $extra_where = "AND is_public='2'";
5064 + $fields = get_account_form_fields( $extra_where );
5065 + $fields = apply_filters( 'uwp_account_privacy_fields', $fields );
5066 + $user_id = get_current_user_id();
5067 + $meta_table = get_usermeta_table_prefix() . 'uwp_usermeta';
2353 5068
2354 - /**
2355 - * Adds search form submit button html.
2356 - *
2357 - * @since 1.0.0
2358 - * @package userswp
2359 - *
2360 - * @return void
2361 - */
2362 - public function uwp_users_search_form_submit() {
2363 - ?>
2364 - <input class="uwp-searchsubmit uwp-search-submit" value="Search" type="submit">
2365 - <?php
2366 - }
5069 + $user_meta_info = $wpdb->get_row( $wpdb->prepare( "SELECT user_privacy, tabs_privacy FROM $meta_table WHERE user_id = %d", $user_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
5070 + if ( ! empty( $user_meta_info->user_privacy ) ) {
5071 + $public_fields = explode( ',', $user_meta_info->user_privacy );
5072 + } else {
5073 + $public_fields = array();
5074 + }
2367 5075
2368 - /**
2369 - * Checks for errors in mail submission.
2370 - *
2371 - * @since 1.0.0
2372 - * @package userswp
2373 - *
2374 - * @param array $res Result array.
2375 - * @param object $user_data User object.
2376 - * @param WP_Error $errors Error object
2377 - *
2378 - * @return WP_Error|array Error object when error. Result array when success.
2379 - */
2380 - public function uwp_forms_check_for_send_mail_errors($res, $user_data, $errors) {
2381 - if (!$res) {
2382 - if (get_option('admin_email') == $user_data->user_email) {
2383 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong when sending email. Please check your site error log for more details.', 'userswp'));
2384 - } else {
2385 - $errors->add('something_wrong', __('<strong>Error</strong>: Something went wrong when sending email. Please contact site admin.', 'userswp'));
2386 - }
2387 - }
5076 + if ( $fields ) {
2388 5077
2389 - $error_code = $errors->get_error_code();
2390 - if (!empty($error_code)) {
2391 - return $errors;
2392 - } else {
2393 - return $res;
2394 - }
2395 -
2396 - }
5078 + foreach ( $fields as $field ) {
5079 + $field_name = $field->htmlvar_name . '_privacy';
5080 + $field_value = strip_tags( esc_sql( $_POST[ $field_name ] ) );
2397 5081
2398 - /**
2399 - * Form field template for country field.
2400 - *
2401 - * @since 1.0.0
2402 - * @package userswp
2403 - *
2404 - * @param string $html Form field html
2405 - * @param object $field Field info.
2406 - * @param string $value Form field default value.
2407 - * @param string $form_type Form type
2408 - *
2409 - * @return string Modified form field html.
2410 - */
2411 - public function uwp_form_input_select_country($html, $field, $value, $form_type){
5082 + if ( $field_value == 'no' ) {
5083 + if ( ! in_array( $field_name, $public_fields ) ) {
5084 + $public_fields[] = $field_name;
5085 + }
5086 + } elseif ( ( $field_name = array_search( $field_name, $public_fields ) ) !== false ) {
5087 + unset( $public_fields[ $field_name ] );
5088 + }
5089 + }
2412 5090
2413 - // Check if there is a field specific filter.
2414 - if(has_filter("uwp_form_input_html_select_{$field->htmlvar_name}")){
2415 - $html = apply_filters("uwp_form_input_html_select_{$field->htmlvar_name}", $html, $field, $value, $form_type);
2416 - }
5091 + $value = implode( ',', $public_fields );
5092 + uwp_update_usermeta( $user_id, 'user_privacy', $value );
5093 + }
2417 5094
2418 - //print_r($field);
5095 + // Save tabs privacy settings
5096 + $tabs_table_name = uwp_get_table_prefix() . 'uwp_profile_tabs';
5097 + $tabs = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM ' . $tabs_table_name . ' WHERE form_type=%s AND user_decided = 1 ORDER BY sort_order ASC', 'profile-tabs' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
2419 5098
2420 - // If no html then we run the standard output.
2421 - if(empty($html)) {
5099 + if ( $tabs ) {
5100 + $public_fields = maybe_unserialize( $user_meta_info->tabs_privacy );
5101 + $do_tabs_update = false;
5102 + foreach ( $tabs as $tab ) {
5103 + $field_name = $tab->tab_key . '_tab_privacy';
2422 5104
2423 - ob_start(); // Start buffering;
5105 + if ( isset( $_POST[ $field_name ] ) ) {
5106 + $do_tabs_update = true;
5107 + $field_value = $_POST[ $field_name ] == '' ? '' : absint( $_POST[ $field_name ] );
2424 5108
2425 - ?>
2426 - <div id="<?php echo $field->htmlvar_name;?>_row"
2427 - class="<?php if ($field->is_required) echo 'required_field';?> uwp_form_row uwp_clear">
5109 + if ( $field_value === '' && isset( $public_fields[ $field_name ] ) ) {
5110 + unset( $public_fields[ $field_name ] );
5111 + } else {
5112 + $public_fields[ $field_name ] = $field_value;
5113 + }
5114 + }
5115 +}
2428 5116
2429 - <?php
2430 - $site_title = uwp_get_form_label($field);
2431 - if (!is_admin()) { ?>
2432 - <label>
2433 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2434 - <?php if ($field->is_required) echo '<span>*</span>';?>
2435 - </label>
2436 - <?php } ?>
5117 + if ( $do_tabs_update ) {
5118 + uwp_update_usermeta( $user_id, 'tabs_privacy', maybe_serialize( $public_fields ) );
5119 + }
5120 + }
2437 5121
2438 - <?php
2439 - // if value empty set the default
2440 - if($value=='' && isset($field->default_value) && $field->default_value){
2441 - $value = $field->default_value;
2442 - }
2443 - $select_country_options = apply_filters('uwp_form_input_select_country',"{defaultCountry: '$value'}",$field, $value, $form_type);
2444 - ?>
5122 + if ( isset( $_POST['uwp_hide_from_listing'] ) && 1 == $_POST['uwp_hide_from_listing'] ) {
5123 + update_user_meta( $user_id, 'uwp_hide_from_listing', 1 );
5124 + } else {
5125 + update_user_meta( $user_id, 'uwp_hide_from_listing', 0 );
5126 + }
2445 5127
2446 - <input type="text" class="uwp_textfield" title="<?php echo $site_title; ?>" id="<?php echo $field->htmlvar_name;?>" />
2447 - <input type="hidden" id="<?php echo $field->htmlvar_name;?>_code" name="<?php echo $field->htmlvar_name;?>" />
5128 + $make_profile_private = uwp_can_make_profile_private();
5129 + if ( $make_profile_private ) {
5130 + $field_name = 'uwp_make_profile_private';
5131 + if ( isset( $_POST[ $field_name ] ) ) {
5132 + $value = strip_tags( esc_sql( $_POST[ $field_name ] ) );
5133 + $user_id = get_current_user_id();
5134 + update_user_meta( $user_id, $field_name, $value );
5135 + }
5136 + }
2448 5137
2449 - <script>
2450 - jQuery("#<?php echo $field->htmlvar_name;?>").countrySelect(<?php echo $select_country_options;?>);
2451 - </script>
5138 + $message = apply_filters( 'uwp_privacy_update_success_message', __( 'Privacy settings updated successfully.', 'userswp' ) );
5139 + $message = aui()->alert(
5140 + array(
5141 + 'type' => 'success',
5142 + 'content' => $message,
5143 + )
5144 + );
5145 + $uwp_notices[] = array( 'account' => $message );
2452 5146
5147 + }
5148 + }
2453 5149
2454 - <span class="uwp_message_note"><?php _e($field->help_text, 'userswp');?></span>
2455 - <?php if ($field->is_required) { ?>
2456 - <span class="uwp_message_error"><?php _e($field->required_msg, 'userswp'); ?></span>
2457 - <?php } ?>
2458 - </div>
5150 + /**
5151 + * Get the ajax login form.
5152 + *
5153 + * @since 1.2.0
5154 + */
5155 + public function ajax_login_form() {
2459 5156
2460 - <?php
2461 - $html = ob_get_clean();
5157 + // add the modal error container
5158 + add_action( 'uwp_template_display_notices', array( $this, 'modal_error_container' ) );
5159 +
5160 + $args = array(
5161 + 'form_title' => __( 'Login', 'userswp' ),
5162 + );
5163 +
5164 + // get the form
5165 + ob_start();
5166 + uwp_get_template( 'bootstrap/login.php', $args );
5167 + $form = ob_get_clean();
5168 +
5169 + // bs5
5170 + if ( function_exists( 'aui_bs_convert_sd_output' ) ) {
5171 + $form = aui_bs_convert_sd_output( $form );
2462 5172 }
5173 + // send ajax response
5174 + wp_send_json_success( $form );
5175 + }
2463 5176
2464 - return $html;
2465 - }
5177 + /**
5178 + * Get the ajax register form.
5179 + *
5180 + * @since 1.2.0
5181 + */
5182 + public function ajax_register_form() {
2466 5183
2467 - /**
2468 - * Prints the username link in "Edit Account" page
2469 - *
2470 - * @since 1.0.0
2471 - * @package userswp
2472 - *
2473 - * @param string $type Page type.
2474 - *
2475 - * @return void
2476 - */
2477 - public function uwp_display_username_in_account($type) {
2478 - if ($type == 'account') {
2479 - $user_id = get_current_user_id();
2480 - $user_info = get_userdata($user_id);
2481 - $display_name = $user_info->user_login;
2482 - ?>
2483 - <span class="uwp_account_page_username">
2484 - <a href="<?php echo uwp_build_profile_tab_url($user_id); ?>">( @<?php echo $display_name; ?> )</a>
2485 - </span>
2486 - <?php
2487 - }
2488 - }
5184 + // add the modal error container
5185 + add_action( 'uwp_template_display_notices', array( $this, 'modal_error_container' ) );
2489 5186
5187 + global $wp_scripts;
5188 + if ( empty( $wp_scripts ) ) {
5189 + $wp_scripts = wp_scripts();
5190 + }
2490 5191
2491 - /**
2492 - * Adds confirm password field in forms.
2493 - *
2494 - * @since 1.0.0
2495 - * @package userswp
2496 - *
2497 - * @param string $html Form field html
2498 - * @param object $field Field info.
2499 - * @param string $value Form field default value.
2500 - * @param string $form_type Form type
2501 - *
2502 - * @return string Modified form field html.
2503 - */
2504 - public function uwp_register_confirm_password_field($html, $field, $value, $form_type) {
2505 - if ($form_type == 'register') {
2506 - //confirm password field
2507 - $extra = array();
2508 - if (isset($field->extra_fields) && $field->extra_fields != '') {
2509 - $extra = unserialize($field->extra_fields);
2510 - }
2511 - $enable_confirm_password_field = isset($extra['confirm_password']) ? $extra['confirm_password'] : '0';
2512 - if ($enable_confirm_password_field == '1') {
2513 - ob_start(); // Start buffering;
2514 - ?>
2515 - <div id="uwp_account_confirm_password_row"
2516 - class="<?php echo 'required_field';?> uwp_form_password_row uwp_clear">
5192 + // do we need country code script in ajax?
5193 + $country_field = false;
5194 + $lightbox_forms = uwp_get_option( 'register_modal_form', 1 );
2517 5195
2518 - <?php
2519 - $site_title = __("Confirm Password", 'userswp');
2520 - if (!is_admin()) { ?>
2521 - <label>
2522 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2523 - <?php echo '<span>*</span>'; ?>
2524 - </label>
2525 - <?php } ?>
5196 + if ( isset( $_POST['form_id'] ) && ! empty( $_POST['form_id'] ) ) {
5197 + $form_id = (int)$_POST['form_id'];
5198 + } elseif ( is_array( $lightbox_forms ) && count( $lightbox_forms ) > 0 ) {
5199 + $form_id = reset( $lightbox_forms );
5200 + } else {
5201 + $form_id = 1;
5202 + }
2526 5203
2527 - <input name="uwp_account_confirm_password"
2528 - class="uwp_textfield"
2529 - id="uwp_account_confirm_password"
2530 - placeholder="<?php echo $site_title; ?>"
2531 - value=""
2532 - title="<?php echo $site_title; ?>"
2533 - <?php echo 'required="required"'; ?>
2534 - type="password"
2535 - />
2536 - </div>
5204 + $fields = get_register_form_fields( $form_id );
5205 + if ( ! empty( $fields ) ) {
5206 + foreach ( $fields as $field ) {
5207 + if ( $field->field_type_key == 'country' || $field->field_type_key == 'uwp_country' ) {
5208 + $country_field = true;
5209 + }
5210 + }
5211 + }
2537 5212
2538 - <?php
2539 - $confirm_html = ob_get_clean();
2540 - $html = $html.$confirm_html;
2541 - }
2542 - }
2543 - return $html;
2544 - }
5213 + ob_start();
2545 5214
2546 - /**
2547 - * Adds confirm email field in forms.
2548 - *
2549 - * @since 1.0.0
2550 - * @package userswp
2551 - *
2552 - * @param string $html Form field html
2553 - * @param object $field Field info.
2554 - * @param string $value Form field default value.
2555 - * @param string $form_type Form type
2556 - *
2557 - * @return string Modified form field html.
2558 - */
2559 - public function uwp_register_confirm_email_field($html, $field, $value, $form_type) {
2560 - if ($form_type == 'register') {
2561 - //confirm email field
2562 - $extra = array();
2563 - if (isset($field->extra_fields) && $field->extra_fields != '') {
2564 - $extra = unserialize($field->extra_fields);
2565 - }
2566 - $enable_confirm_email_field = isset($extra['confirm_email']) ? $extra['confirm_email'] : '0';
2567 - if ($enable_confirm_email_field == '1') {
2568 - ob_start(); // Start buffering;
2569 - ?>
2570 - <div id="uwp_account_confirm_email_row"
2571 - class="<?php echo 'required_field';?> uwp_form_email_row uwp_clear">
5215 + // maybe add country code JS
5216 + if ( $country_field ) {
5217 + $country_data = uwp_get_country_data();
5218 + echo '<script>var uwp_country_data = ' . json_encode( $country_data ) . '</script>';
5219 + echo "<script type='text/javascript' src='" . esc_url( USERSWP_PLUGIN_URL ) . 'assets/js/countrySelect.min.js' . "' ></script>";
5220 + }
2572 5221
2573 - <?php
2574 - $site_title = __("Confirm Email", 'userswp');
2575 - if (!is_admin()) { ?>
2576 - <label>
2577 - <?php echo (trim($site_title)) ? $site_title : '&nbsp;'; ?>
2578 - <?php echo '<span>*</span>'; ?>
2579 - </label>
2580 - <?php } ?>
5222 + $args = array( 'form_title' => '' );
5223 + if ( $form_id > 0 ) {
5224 + $args['id'] = $form_id;
5225 + }
2581 5226
2582 - <input name="uwp_account_confirm_email"
2583 - class="uwp_textfield"
2584 - id="uwp_account_confirm_email"
2585 - placeholder="<?php echo $site_title; ?>"
2586 - value=""
2587 - title="<?php echo $site_title; ?>"
2588 - <?php echo 'required="required"'; ?>
2589 - type="email"
2590 - />
2591 - </div>
5227 + $args['limit'] = $lightbox_forms;
2592 5228
2593 - <?php
2594 - $confirm_html = ob_get_clean();
2595 - $html = $html.$confirm_html;
2596 - }
5229 + // get template
5230 + uwp_get_template( 'bootstrap/register.php', $args );
5231 +
5232 + // only show the JS if NOT doing a block render
5233 + if ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] != 'super_duper_output_shortcode' ) {
5234 + // load scripts
5235 + $wp_scripts->do_item( 'zxcvbn-async' );
5236 + $wp_scripts->do_item( 'wp-hooks' );
5237 + $wp_scripts->do_item( 'wp-i18n' );
5238 + $wp_scripts->do_item( 'password-strength-meter' );
5239 + ?>
5240 + <script>
5241 + // Password strength indicator script
5242 + jQuery(function ($) {
5243 +
5244 + // Load the settings like WP does.
5245 + var first, s;
5246 + s = document.createElement('script');
5247 + s.src = _zxcvbnSettings.src;
5248 + s.type = 'text/javascript';
5249 + s.async = true;
5250 + first = document.getElementsByTagName('script')[0];
5251 + first.parentNode.insertBefore(s, first);
5252 +
5253 + // Enable any pass inputs.
5254 + $('body').on('keyup', 'input[name=password], input[name=confirm_password]',
5255 + function (event) {
5256 + var $form = $(this).closest('form');
5257 + if( ! $form.hasClass('uwp-login-form') ) {
5258 + uwp_checkPasswordStrength(
5259 + $form.find('input[name=password]'),
5260 + $form.find('input[name=confirm_password]'),
5261 + $form.find('#uwp-password-strength'),
5262 + $form.find('button[type="submit"], input[type="submit"]'),
5263 + ['black', 'listed', 'word']
5264 + );
5265 + }
5266 + }
5267 + );
5268 + });
5269 + </script>
5270 + <?php
5271 + }
5272 + $form = ob_get_clean();
5273 +
5274 + // bs5
5275 + if ( function_exists( 'aui_bs_convert_sd_output' ) ) {
5276 + $form = aui_bs_convert_sd_output( $form );
2597 5277 }
2598 - return $html;
2599 - }
2600 5278
5279 + // send ajax response
5280 + wp_send_json_success( $form );
5281 + }
2601 5282
2602 - /**
2603 - * Handles the privacy form submission.
2604 - *
2605 - * @since 1.0.0
2606 - * @package userswp
2607 - *
2608 - * @return void
2609 - */
2610 - public function uwp_privacy_submit_handler() {
2611 - if (isset($_POST['uwp_privacy_submit'])) {
2612 - if( ! isset( $_POST['uwp_privacy_nonce'] ) || ! wp_verify_nonce( $_POST['uwp_privacy_nonce'], 'uwp-privacy-nonce' ) ) {
2613 - return;
2614 - }
5283 + /**
5284 + * Get the ajax forgot password form.
5285 + *
5286 + * @since 1.2.0
5287 + */
5288 + public function ajax_forgot_password_form() {
2615 5289
2616 - $extra_where = "AND is_public='2'";
2617 - $fields = get_account_form_fields($extra_where);
2618 - $fields = apply_filters('uwp_account_privacy_fields', $fields);
2619 - if ($fields) {
2620 - foreach ($fields as $field) {
2621 - $field_name = $field->htmlvar_name.'_privacy';
2622 - if (isset($_POST[$field_name])) {
2623 - $value = strip_tags(esc_sql($_POST[$field_name]));
2624 - $user_id = get_current_user_id();
2625 - uwp_update_usermeta($user_id, $field_name, $value);
2626 - }
2627 - }
2628 - }
5290 + // add the modal error container
5291 + add_action( 'uwp_template_display_notices', array( $this, 'modal_error_container' ) );
5292 + $args = array(
5293 + 'form_title' => '',
5294 + 'css_class' => ''
5295 + );
5296 + // get the form
5297 + ob_start();
5298 + uwp_get_template( 'bootstrap/forgot.php', $args );
5299 + $form = ob_get_clean();
2629 5300
2630 - $user_id = get_current_user_id();
2631 - if (isset($_POST['uwp_hide_from_listing']) && 1 == $_POST['uwp_hide_from_listing']) {
2632 - update_user_meta($user_id, 'uwp_hide_from_listing', 1);
2633 - } else {
2634 - update_user_meta($user_id, 'uwp_hide_from_listing', 0);
2635 - }
5301 + // bs5
5302 + if ( function_exists( 'aui_bs_convert_sd_output' ) ) {
5303 + $form = aui_bs_convert_sd_output( $form );
5304 + }
2636 5305
2637 - $make_profile_private = uwp_can_make_profile_private();
2638 - if ($make_profile_private) {
2639 - $field_name = 'uwp_make_profile_private';
2640 - if (isset($_POST[$field_name])) {
2641 - $value = strip_tags(esc_sql($_POST[$field_name]));
2642 - $user_id = get_current_user_id();
2643 - update_user_meta($user_id, $field_name, $value);
2644 - }
2645 - }
5306 + // send ajax response
5307 + wp_send_json_success( $form );
5308 + }
2646 5309
2647 - }
2648 - }
5310 + /**
5311 + * Output the modal error container.
5312 + *
5313 + * @param string $type
5314 + *
5315 + * @since 1.2.0
5316 + */
5317 + public function modal_error_container( $type = '' ) {
5318 + echo '<div class="form-group mb-3"><div class="modal-error"></div></div>';
5319 + }
2649 5320
2650 -}
5321 + public function form_custom_html( $html, $field, $value, $form_type ) {
5322 +
5323 + $html = ! empty( $field->default_value ) ? $field->default_value : ' ';
5324 +
5325 + return $html;
5326 + }
5327 +}