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

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

1,985 lines 62.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Profile Template related functions
5 *
6 * This class defines all code necessary for Profile template.
7 *
8 * @since 1.0.0
9 * @author GeoDirectory Team <info@wpgeodirectory.com>
10 */
11 class UsersWP_Profile {
12
13 public static function get_author_link( $link, $user_id ) {
14
15 if ( 1 == uwp_get_option( 'uwp_disable_author_link' ) && ! ( is_uwp_profile_page() || is_uwp_users_page() ) ) {
16 return $link;
17 }
18
19 return self::get_profile_link( $link, $user_id );
20 }
21
22 /**
23 * Returns user profile link based on user id.
24 *
25 * @since 1.0.0
26 * @package userswp
27 *
28 * @param string $link Unmodified link.
29 * @param int $user_id User id.
30 *
31 * @return string Modified link.
32 */
33 public static function get_profile_link( $link, $user_id ) {
34
35 $page_id = uwp_get_page_id( 'profile_page', false );
36
37 if ( ! $page_id ) {
38 return $link;
39 }
40
41 $link = get_permalink( $page_id );
42
43 if ( $link != '' ) {
44
45 if ( isset( $_REQUEST['page_id'] ) ) {
46 $permalink_structure = 'DEFAULT';
47 } else {
48 $permalink_structure = 'CUSTOM';
49 // Add forward slash if not available
50 $link = trailingslashit( $link );
51 }
52
53 $url_type = apply_filters( 'uwp_profile_url_type', 'slug' );
54
55 if ( $url_type && 'id' == $url_type ) {
56 if ( 'DEFAULT' == $permalink_structure ) {
57 return add_query_arg( array( 'viewuser' => $user_id ), $link );
58 } else {
59 return user_trailingslashit( $link . $user_id );
60 }
61 } else {
62 $user = get_userdata( $user_id );
63 if ( $user ) {
64 if ( ! empty( $user->user_nicename ) ) {
65 $username = $user->user_nicename;
66 } else {
67 $username = $user->user_login;
68 }
69 } else {
70 $username = '';
71 }
72
73 if ( 'DEFAULT' == $permalink_structure ) {
74 return add_query_arg( array( 'username' => $username ), $link );
75 } else {
76 return user_trailingslashit( $link . $username );
77 }
78 }
79 } else {
80 return $link;
81 }
82 }
83
84 /**
85 * Prints the profile page title section.
86 *
87 * @since 1.0.0
88 * @package userswp
89 *
90 * @param object $user The User ID.
91 * @param string $tag Tag
92 * @param string $title_class Title Class
93 * @param string $link_class Link Class
94 * @param bool $link The User ID.
95 */
96 public function get_profile_title( $user, $tag = 'h2', $title_class = '', $link_class = '', $link = true ) {
97 if ( ! $user ) {
98 return;
99 }
100 ?>
101 <div class="uwp-profile-name">
102 <<?php echo esc_attr( $tag ); ?> class="uwp-user-title <?php echo esc_attr( $title_class ); ?>"
103 data-user="<?php echo absint( $user->ID ); ?>">
104 <?php if ( $link ){ ?><a href="<?php echo esc_url( uwp_build_profile_tab_url( $user->ID ) ); ?>"
105 class="<?php echo esc_attr( $link_class ); ?>"><?php } ?>
106 <?php echo esc_attr( apply_filters( 'uwp_profile_display_name', esc_attr( $user->display_name ), $user ) ); ?>
107 <?php if ( $link ){ ?></a><?php } ?>
108 <?php do_action( 'uwp_profile_after_title', $user->ID ); ?>
109 </<?php echo esc_attr( $tag ); ?>>
110 </div>
111 <?php
112 }
113
114 /**
115 * Displays edit account button
116 */
117 public function edit_profile_button( $user_id ) {
118 global $uwp_in_user_loop;
119 $account_page = uwp_get_page_id( 'account_page', false );
120 if ( $user_id ) {
121 $user = get_userdata( $user_id );
122 } else {
123 $user = uwp_get_displayed_user();
124 }
125
126 $can_user_edit_account = apply_filters( 'uwp_user_can_edit_own_profile', true, $user->ID );
127
128 if ( ! $uwp_in_user_loop && $account_page && is_user_logged_in() && ( get_current_user_id() == $user->ID ) && $can_user_edit_account ) { ?>
129 <a href="<?php echo esc_url( get_permalink( $account_page ) ); ?>"
130 class="btn btn-sm btn-outline-dark btn-circle mt-n1" data-toggle="tooltip"
131 title="<?php esc_attr_e( 'Edit Account', 'userswp' ); ?>"><i
132 class="fas fa-pencil-alt fa-fw fa-lg"></i></a>
133 <?php }
134 }
135
136 /**
137 * Prints the profile page social links section.
138 *
139 * @since 1.0.0
140 * @package userswp
141 *
142 * @param object $user The User ID.
143 * @param string , array $exclude Fields to exclude from displaying.
144 */
145 public function get_profile_social( $user, $exclude = '' ) {
146
147 if ( is_uwp_profile_page() ) {
148 $show_type = '[profile_side]';
149 } elseif ( is_uwp_users_page() ) {
150 $show_type = '[users]';
151 } else {
152 $show_type = false;
153 }
154
155 if ( ! $show_type ) {
156 return;
157 }
158
159 global $wpdb;
160 $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
161 $form_id = uwp_get_register_form_id( $user->ID );
162 $fields = $wpdb->get_results( $wpdb->prepare("SELECT * FROM " . $table_name . " WHERE ( form_type = 'register' OR form_type = 'account' ) AND field_type = 'url' AND css_class LIKE '%uwp_social%' AND form_id = %d ORDER BY sort_order ASC", $form_id ) );
163
164 $usermeta = isset( $user->ID ) ? uwp_get_usermeta_row( $user->ID ) : array();
165 $privacy = ! empty( $usermeta ) && ! empty( $usermeta->user_privacy ) ? explode( ',', $usermeta->user_privacy ) : array();
166
167 if ( ! empty( $exclude ) && ! is_array( $exclude ) ) {
168 $exclude = explode( ',', $exclude );
169 $exclude = array_map( 'trim', $exclude );
170 }
171 ?>
172 <div class="uwp-profile-social">
173 <ul class="uwp-profile-social-ul">
174 <?php
175 foreach ( $fields as $field ) {
176 $show_in = explode( ',', $field->show_in );
177
178 if ( ! in_array( $show_type, $show_in ) ) {
179 continue;
180 }
181
182 $display = false;
183 if ( $field->is_public == '0' ) {
184 $display = false;
185 } else if ( $field->is_public == '1' ) {
186 $display = true;
187 } else {
188 if ( ! in_array( $field->htmlvar_name . '_privacy', $privacy ) ) {
189 $display = true;
190 }
191 }
192 if ( ! $display ) {
193 continue;
194 }
195
196 $key = $field->htmlvar_name;
197 // see UsersWP_Forms -> save_user_extra_fields reason for replacing key
198 $key = str_replace( 'uwp_register_', '', $key );
199 $exclude_key = str_replace( 'uwp_account_', '', $key );
200 $value = uwp_get_usermeta( $user->ID, $key, false );
201 $icon = uwp_get_field_icon( $field->field_icon );
202
203 if ( isset( $icon ) && ! empty( $icon ) ) {
204 $title = $icon;
205 } else {
206 $title = $field->site_title;
207 }
208
209 if ( ! empty( $exclude ) && in_array( $exclude_key, $exclude ) ) {
210 continue;
211 }
212
213 if ( $value ) {
214 echo '<li><a target="_blank" rel="nofollow" href="' . esc_url( $value ) . '">' . esc_attr( $title ) . '</a></li>';
215 }
216 }
217 ?>
218 </ul>
219 </div>
220 <?php
221 }
222
223 /**
224 * Returns the custom fields content of profile page more info tab.
225 *
226 * @since 1.0.0
227 * @package userswp
228 *
229 * @param object $user The User ID.
230 * @param string $show_type Location of field to display.
231 */
232 public function show_output_location_data( $user, $show_type ) {
233 if ( ! $show_type ) {
234 return;
235 }
236 echo $this->get_extra_fields( $user, '[' . $show_type . ']' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
237 }
238
239 /**
240 * Returns the custom fields content based on type.
241 *
242 * @since 1.0.0
243 * @package userswp
244 *
245 * @param object $user The User ID.
246 * @param string $show_type Filter type.
247 *
248 * @return string Custom fields content.
249 */
250 public function get_extra_fields( $user, $show_type ) {
251
252 ob_start();
253 global $wpdb;
254 $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
255 $form_id = uwp_get_register_form_id( $user->ID );
256 $fields = $wpdb->get_results( $wpdb->prepare("SELECT * FROM " . $table_name . " WHERE form_type = 'account' AND css_class NOT LIKE '%uwp_social%' AND form_id = %d ORDER BY sort_order ASC", $form_id ));
257 $wrap_html = false;
258 if ( $fields ) {
259 $usermeta = isset( $user->ID ) ? uwp_get_usermeta_row( $user->ID ) : array();
260 $privacy = ! empty( $usermeta ) && ! empty( $usermeta->user_privacy ) ? explode( ',', $usermeta->user_privacy ) : array();
261
262 foreach ( $fields as $field ) {
263 $show_in = explode( ',', $field->show_in );
264 if ( ! in_array( $show_type, $show_in ) ) {
265 continue;
266 }
267
268 $display = false;
269 if ( $field->is_public == '0' ) {
270 $display = false;
271 } else if ( $field->is_public == '1' ) {
272 $display = true;
273 } else {
274 if ( ! in_array( $field->htmlvar_name . '_privacy', $privacy ) ) {
275 $display = true;
276 }
277 }
278 if ( ! $display ) {
279 continue;
280 }
281
282 $value = $this->get_field_value( $field, $user );
283 $class = isset( $field->css_class ) ? $field->css_class : '';
284
285 // Icon
286 $icon = uwp_get_field_icon( $field->field_icon );
287 $site_title = isset( $field->site_title ) ? __( wp_unslash($field->site_title), 'userswp' ) : '';
288
289 if ( $field->field_type == 'fieldset' ) {
290 $icon = '';
291 ?>
292 <div class="uwp-profile-extra-wrap m-0 p-0">
293 <div class="uwp-profile-extra-key uwp-profile-extra-full m-0 p-0"><h3
294 style="margin: 10px 0;"><?php echo wp_kses($icon, array('i'=>array(), 'span'=> array() ) ) . esc_attr( $site_title ); ?></h3></div>
295 </div>
296 <?php
297 } else {
298 if ( $value ) {
299 $wrap_html = true;
300 ?>
301 <div class="uwp-profile-extra-wrap <?php echo esc_attr( $class ); ?>">
302 <div class="uwp-profile-extra-key d-inline-block"><?php echo wp_kses($icon, array('i'=>array(), 'span'=> array() ) ) . " " . esc_attr( $site_title ); ?>
303 <span class="uwp-profile-extra-sep">:</span></div>
304 <div class="uwp-profile-extra-value d-inline-block">
305 <?php
306 if ( $field->htmlvar_name == 'bio' ) {
307 $show_read_more = apply_filters( 'uwp_profile_bio_show_read_more', false );
308 $value = get_user_meta( $user->ID, 'description', true );
309 $value = stripslashes( $value );
310 $limit_words = apply_filters( 'uwp_profile_bio_content_limit', 50 );
311 if ( $value ) {
312 ?>
313 <div class="uwp-profile-bio <?php if ( $show_read_more ) {
314 echo "uwp_more";
315 } ?>">
316 <?php
317 if ( is_uwp_profile_page() ) {
318 echo nl2br( esc_attr( $value ) );
319 } else {
320 echo esc_attr( wp_trim_words( $value, $limit_words, '...' ) );
321 }
322 ?>
323 </div>
324 <?php
325 }
326 } else {
327 echo wp_kses_post( $value );
328 }
329 ?>
330 </div>
331 </div>
332 <?php
333 }
334 }
335 }
336 }
337 $output = ob_get_contents();
338 $wrapped_output = '';
339 if ( $wrap_html ) {
340 $wrapped_output .= '<div class="uwp-profile-extra"><div class="uwp-profile-extra-div form-table">';
341 $wrapped_output .= $output;
342 $wrapped_output .= '</div></div>';
343 }
344 ob_end_clean();
345
346 return trim( $wrapped_output );
347 }
348
349 /**
350 * Gets custom field value based on key.
351 *
352 * @since 1.0.0
353 * @package userswp
354 *
355 * @param object $field Field info object.
356 * @param object $user The User.
357 *
358 * @return string Custom field value.
359 */
360 public function get_field_value( $field, $user ) {
361
362 $user_data = get_userdata( $user->ID );
363
364 if ( $field->htmlvar_name == 'email' ) {
365 $value = $user_data->user_email;
366 } elseif ( $field->htmlvar_name == 'password' ) {
367 $value = '';
368 $field->is_required = 0;
369 } elseif ( $field->htmlvar_name == 'confirm_password' ) {
370 $value = '';
371 $field->is_required = 0;
372 } else {
373 $value = uwp_get_usermeta( $user->ID, $field->htmlvar_name, "" );
374 }
375
376 // Select and Multiselect needs Value to be converted
377 if ( $field->field_type == 'select' || $field->field_type == 'multiselect' ) {
378 $option_values_arr = uwp_string_values_to_options( $field->option_values, true );
379
380 // Select
381 if ( $field->field_type == 'select' ) {
382
383 if ( $field->field_type_key != 'country' && $field->field_type_key != 'uwp_country' ) {
384 if ( ! empty( $value ) ) {
385 $data = $this->uwp_array_search( $option_values_arr, 'value', $value );
386 $value = !empty( $data[0]['label'] ) ? $data[0]['label'] : '';
387 } else {
388 $value = '';
389 }
390 }
391 }
392
393 //Multiselect
394 if ( $field->field_type == 'multiselect' && ! empty( $value ) ) {
395 if ( ! empty( $value ) && is_array( $value ) ) {
396 $array_value = array();
397 foreach ( $value as $v ) {
398 if ( ! empty( $v ) ) {
399 $data = $this->uwp_array_search( $option_values_arr, 'value', $v );
400 if ( ! empty( $data ) && isset( $data[0]['label'] ) ) {
401 $array_value[] = $data[0]['label'];
402 }
403 }
404
405 }
406 if ( ! empty( $array_value ) ) {
407 $value = implode( ', ', $array_value );
408 } else {
409 $value = '';
410 }
411
412 } else {
413 $value = '';
414 }
415 }
416 }
417
418 // Date
419 if ( $field->field_type == 'datepicker' ) {
420 $date_format = get_option( 'date_format' );
421
422 if ( isset( $field->extra_fields ) && ! empty( $field->extra_fields ) ) {
423 $extra_fields = unserialize( $field->extra_fields );
424 if ( isset( $extra_fields['date_format'] ) && ! empty( $extra_fields['date_format'] ) ) {
425 $date_format = $extra_fields['date_format'];
426 }
427 }
428
429 if ( ! empty( $value ) ) {
430 $value = date( $date_format, $value );
431 } else {
432 $value = '';
433 }
434
435 }
436
437 // Time
438 if ( $field->field_type == 'time' ) {
439 if ( ! empty( $value ) ) {
440 $value = date( get_option( 'time_format' ), strtotime( $value ) );
441 } else {
442 $value = '';
443 }
444 }
445
446 // URL
447 if ( $field->field_type == 'url' && ! empty( $value ) ) {
448 $link_text = $value;
449 // if default_value is not url then it will be used as link text.
450 if ( $field->default_value && ! empty( $field->default_value ) ) {
451 if ( substr( $field->default_value, 0, 4 ) === "http" ) {
452 $link_text = $value;
453 } else {
454 $link_text = $field->default_value;
455 }
456 }
457 if ( substr( $link_text, 0, 4 ) === "http" ) {
458 $link_text = esc_url( $link_text );
459 }
460
461 $value = '<a href="' . esc_url( $value ) . '" target="_blank" rel="nofollow">' . esc_attr( $link_text ) . '</a>';
462 }
463
464 // Checkbox
465 if ( $field->field_type == 'checkbox' ) {
466 if ( $value == '1' ) {
467 $value = __( 'Yes', 'userswp' );
468 } else {
469 $value = __( 'No', 'userswp' );
470 }
471 }
472
473 // File
474 if ( $field->field_type == 'file' ) {
475 $file_obj = new UsersWP_Files();
476 $value = $file_obj->file_upload_preview( $field, $value, false );
477 }
478
479 // Sanitize
480 switch ( $field->field_type ) {
481 case 'url':
482 // already escaped
483 break;
484 case 'file':
485 // already escaped
486 break;
487 case 'textarea':
488 $value = esc_textarea( $value );
489 $value = nl2br( $value );
490 break;
491 case 'editor':
492 $value = wp_kses_post( $value );
493 $value = nl2br( $value );
494 break;
495 default:
496 $value = esc_html( $value );
497 }
498
499 if ( isset( $field->field_type_key ) && $field->field_type_key == 'country' || $field->field_type_key == 'uwp_country' ) {
500 $value = uwp_output_country_html( $value );
501 }
502
503 return apply_filters('uwp_get_field_value', $value, $field, $user);
504 }
505
506 /**
507 * Array search by value
508 *
509 * @since 1.0.0
510 * @package userswp
511 *
512 * @param array $array Original array.
513 * @param mixed $key Array key
514 * @param mixed $value Array value.
515 *
516 * @return array Result array.
517 */
518 public function uwp_array_search( $array, $key, $value ) {
519 $results = array();
520
521 if ( is_array( $array ) ) {
522 if ( isset( $array[ $key ] ) && $array[ $key ] == $value ) {
523 $results[] = $array;
524 }
525
526 foreach ( $array as $subarray ) {
527 $results = array_merge( $results, $this->uwp_array_search( $subarray, $key, $value ) );
528 }
529 }
530
531 return $results;
532 }
533
534 /**
535 * Returns the custom fields content of profile page sidebar.
536 *
537 * @since 1.0.0
538 * @package userswp
539 *
540 * @param object $user The User ID.
541 */
542 public function get_profile_side_extra( $user ) {
543 echo $this->get_extra_fields( $user, '[profile_side]' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
544 }
545
546 /**
547 * Returns the custom fields content of users page.
548 *
549 * @since 1.0.0
550 * @package userswp
551 *
552 * @param object $user The User ID.
553 */
554 public function get_users_extra( $user ) {
555 echo $this->get_extra_fields( $user, '[users]' ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
556 }
557
558 /**
559 *
560 * Returns profile page tabs
561 *
562 * @return array
563 */
564 public function get_tabs() {
565 global $uwp_profile_doing_tab, $uwp_profile_first_tab;
566
567 // get the settings
568 global $uwp_profile_tabs_array;
569 // check if we have been here before
570 $tabs = ! empty( $uwp_profile_tabs_array ) ? $uwp_profile_tabs_array : $this->get_tab_settings();
571
572 $tabs_array = array();
573
574 if ( ! empty( $tabs ) ) {
575 // get the tab contents first so we can decide to output the tab head
576 $tabs_content = array();
577 foreach ( $tabs as $tab ) {
578 $uwp_profile_doing_tab = $tab->tab_key;
579 $tabs_content[ $tab->id . "tab" ] = $this->tab_content( $tab );
580
581 if ( ! ( isset( $tab->tab_level ) && $tab->tab_level > 0 ) && empty( $uwp_profile_first_tab ) && ! empty( $tabs_content[ $tab->id . "tab" ] ) ) {
582 $uwp_profile_first_tab = $tab->tab_key;
583 }
584 }
585
586 // setup the array
587 foreach ( $tabs as $tab ) {
588 if ( isset( $tab->tab_level ) && $tab->tab_level > 0 ) {
589 continue;
590 }
591
592 $hide_empty = apply_filters('uwp_hide_empty_tabs', true, $tab, $tabs);
593
594 if ( $hide_empty && empty( $tabs_content[ $tab->id . "tab" ] ) ) {
595 continue;
596 }
597
598 $tab->tab_content_rendered = $tabs_content[ $tab->id . "tab" ];
599 $tabs_array[] = (array) $tab;
600 }
601
602 }
603
604 /**
605 * Get the tabs output settings.
606 *
607 * @param array $tabs_array The array of tabs.
608 */
609 return apply_filters( 'uwp_get_profile_tabs', $tabs_array );
610
611 }
612
613 /**
614 *
615 * Returns profile tabs
616 *
617 * @return array $tabs Profile tabs
618 */
619 public function get_tab_settings() {
620 global $wpdb, $uwp_profile_tabs_array;
621
622 if ( $uwp_profile_tabs_array ) {
623 $tabs = $uwp_profile_tabs_array;
624 } else {
625 $tabs_table_name = uwp_get_table_prefix() . 'uwp_profile_tabs';
626 $uwp_profile_tabs_array = array();
627 $displayed_user = uwp_get_user_by_author_slug();
628
629 if ( $displayed_user ) {
630 $tabs_privacy = uwp_get_tabs_privacy_by_user( $displayed_user );
631 }
632
633 $form_id = uwp_get_register_form_id( $displayed_user->ID );
634 $tabs_result = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $tabs_table_name . " WHERE form_type = %s and form_id = %s ORDER BY sort_order ASC", 'profile-tabs', $form_id ) );
635 foreach ( $tabs_result as $tab ) {
636 if ( isset( $tab->user_decided ) && 1 == $tab->user_decided && ! empty( $tabs_privacy ) ) {
637
638 $field_name = $tab->tab_key . '_tab_privacy';
639 $public_fields_keys = is_array( $tabs_privacy ) ? array_keys( $tabs_privacy ) : $tabs_privacy;
640 if ( in_array( $field_name, $public_fields_keys ) ) {
641 if ( 1 == $tabs_privacy[ $field_name ] && is_user_logged_in() ) { // 1 for logged in users
642 $uwp_profile_tabs_array[] = $tab;
643 } elseif ( 2 == $tabs_privacy[ $field_name ] && isset( $displayed_user->ID ) && ( $displayed_user->ID == get_current_user_id() || current_user_can( 'administrator' ) ) ) { // 2 for author and admin only
644 $uwp_profile_tabs_array[] = $tab;
645 } elseif ( 0 == $tabs_privacy[ $field_name ] ) { // for all users
646 $uwp_profile_tabs_array[] = $tab;
647 } else {
648 // Skip tab
649 }
650 }
651
652 } elseif ( isset( $tab->tab_privacy ) ) {
653
654 if ( 1 == $tab->tab_privacy && is_user_logged_in() ) { // 1 for logged in users
655 $uwp_profile_tabs_array[] = $tab;
656 } elseif ( 2 == $tab->tab_privacy && isset( $displayed_user->ID ) && ( $displayed_user->ID == get_current_user_id() || current_user_can( 'administrator' ) ) ) { // 2 for author and admin only
657 $uwp_profile_tabs_array[] = $tab;
658 } elseif ( 0 == $tab->tab_privacy ) { // for all users
659 $uwp_profile_tabs_array[] = $tab;
660 } else {
661 // Skip tab
662 }
663
664 } else {
665 // Skip tab
666 }
667 }
668
669 $tabs = $uwp_profile_tabs_array;
670 }
671
672 /**
673 * Get the tabs output settings.
674 *
675 * @param array $tabs The array of stdClass settings for the tabs output.
676 */
677 return apply_filters( 'uwp_profile_tab_settings', $tabs );
678 }
679
680 /**
681 * Returns profile tab content
682 *
683 * @since 2.0.0
684 *
685 * @param array $tab Tab array
686 *
687 * @return string
688 */
689 public function tab_content( $tab ) {
690
691 ob_start();
692 // main content
693 if ( ! empty( $tab->tab_content ) ) { // override content
694 $content = stripslashes( $tab->tab_content );
695 echo do_shortcode( $content );
696 } elseif ( $tab->tab_type == 'standard' ) {
697 $user = uwp_get_displayed_user();
698 do_action( 'uwp_profile_tab_content', $user, $tab );
699 do_action( 'uwp_profile_' . $tab->tab_key . '_tab_content', $user, $tab );
700 }
701
702 // child elements
703 echo self::tab_content_child( $tab ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
704
705 return ob_get_clean();
706 }
707
708 /**
709 * Returns profile child tab content
710 *
711 * @since 2.0.0
712 *
713 * @param array $tab Child tab array
714 *
715 * @return string
716 */
717 public function tab_content_child( $tab ) {
718 ob_start();
719 $tabs = self::get_tab_settings();
720 $parent_id = $tab->id;
721
722 foreach ( $tabs as $child_tab ) {
723 if ( isset( $child_tab->tab_parent ) && $child_tab->tab_parent == $parent_id ) {
724 if ( ! empty( $child_tab->tab_content ) ) { // override content
725 echo do_shortcode( stripslashes( $child_tab->tab_content ) );
726 } elseif ( $child_tab->tab_type == 'fieldset' ) {
727 self::output_fieldset( $child_tab );
728 } elseif ( $child_tab->tab_type == 'standard' ) {
729 $user = uwp_get_displayed_user();
730 do_action( 'uwp_profile_tab_content', $user, $child_tab );
731 do_action( 'uwp_profile_' . $child_tab->tab_key . '_tab_content', $user, $child_tab );
732 if ( $child_tab->tab_key == 'reviews' ) {
733 comments_template();
734 }
735 }
736 }
737 }
738
739 return ob_get_clean();
740
741 }
742
743 /**
744 *
745 * Displays fieldset content
746 *
747 * @param array $tab Tab array
748 *
749 * @return string
750 */
751 public function output_fieldset( $tab ) {
752 ob_start();
753 echo '<div class="uwp_post_meta uwp-fieldset">';
754 echo "<h4>";
755 if ( $tab->tab_icon ) {
756 echo '<i class="fas ' . esc_attr( $tab->tab_icon ) . '" aria-hidden="true"></i>';
757 }
758 if ( $tab->tab_name ) {
759 esc_attr_e( $tab->tab_name, 'userswp' );
760 }
761 echo "</h4>";
762 echo "</div>";
763
764 return ob_get_clean();
765 }
766
767 /**
768 * Prints the tab content pagination section.
769 *
770 * @since 1.0.0
771 * @package userswp
772 *
773 * @param int $total Total items.
774 *
775 * @return void
776 */
777 public function get_profile_pagination( $total ) {
778 ?>
779 <div class="uwp-pagination">
780 <?php
781 $design_style = uwp_get_option( "design_style", 'bootstrap' );
782 if ( $design_style == 'bootstrap' ) {
783 self::get_bootstrap_pagination( $total );
784 } else {
785 $big = 999999999; // need an unlikely integer
786 $translated = __( 'Page', 'userswp' ); // Supply translatable string
787
788 $args = array(
789 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
790 'format' => '?paged=%#%',
791 'current' => max( 1, get_query_var( 'paged' ) ),
792 'total' => $total,
793 'before_page_number' => '<span class="screen-reader-text">' . $translated . ' </span>',
794 'type' => 'list'
795 );
796
797 echo paginate_links( $args ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
798 }
799
800
801 ?>
802 </div>
803 <?php
804 }
805
806 /**
807 * Displays boostrap pagination
808 *
809 * @since 2.0.0
810 *
811 * @param int $total Total count
812 */
813 public function get_bootstrap_pagination( $total ) {
814
815 $navigation = '';
816 $args = array(
817 'mid_size' => 2,
818 'type' => 'array',
819 'prev_text' => sprintf(
820 '%s <span class="nav-prev-text sr-only">%s</span>',
821 '<i class="fas fa-chevron-left"></i>',
822 __( 'Newer posts', 'userswp' )
823 ),
824 'next_text' => sprintf(
825 '<span class="nav-next-text sr-only">%s</span> %s',
826 __( 'Older posts', 'userswp' ),
827 '<i class="fas fa-chevron-right"></i>'
828 ),
829 );
830
831 // Don't print empty markup if there's only one page.
832 if ( $total > 1 ) {
833 $args = wp_parse_args( $args, array(
834 'mid_size' => 1,
835 'prev_text' => _x( 'Previous', 'previous set of posts', 'userswp' ),
836 'next_text' => _x( 'Next', 'next set of posts', 'userswp' ),
837 'screen_reader_text' => __( 'Posts navigation', 'userswp' ),
838 'total' => $total,
839 ) );
840
841 if ( is_front_page() ) {
842 $args['current'] = ( get_query_var( 'page' ) ) ? absint( get_query_var( 'page' ) ) : 1;
843 }
844
845 // Set up paginated links.
846 $links = paginate_links( $args );
847
848 // make the output bootstrap ready
849 $links_html = "<ul class='pagination m-0 p-0'>";
850 if ( ! empty( $links ) ) {
851 foreach ( $links as $link ) {
852 $active = strpos( $link, 'current' ) !== false ? 'active' : '';
853 $links_html .= "<li class='page-item $active'>";
854 $links_html .= str_replace( "page-numbers", "page-link", $link );
855 $links_html .= "</li>";
856 }
857 }
858 $links_html .= "</ul>";
859
860 if ( $links ) {
861 $navigation .= '<section class="px-0 py-2 w-100">';
862 $navigation .= _navigation_markup( $links_html, 'pagination', $args['screen_reader_text'] );
863 $navigation .= '</section>';
864 }
865
866 $navigation = str_replace( "nav-links", "uwp-nav-links", $navigation );
867 }
868
869 echo $navigation; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
870
871 }
872
873 /**
874 * Prints the profile page more info tab content.
875 *
876 * @since 1.0.0
877 * @package userswp
878 *
879 * @param object $user The User ID.
880 *
881 * @return void
882 */
883 public function get_profile_more_info( $user ) {
884 $extra = $this->get_profile_extra( $user );
885 echo $extra; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
886 }
887
888 /**
889 * Returns the custom fields content of profile page more info tab.
890 *
891 * @since 1.0.0
892 * @package userswp
893 *
894 * @param object $user The User ID.
895 *
896 * @return string More info tab content.
897 */
898 public function get_profile_extra( $user ) {
899 return $this->get_extra_fields( $user, '[more_info]' );
900 }
901
902 /**
903 * Prints the profile page "posts" tab content.
904 *
905 * @since 1.0.0
906 * @package userswp
907 *
908 * @param object $user The User ID.
909 *
910 * @return void
911 */
912 public function get_profile_posts( $user ) {
913 uwp_generic_tab_content( $user, 'post', __( 'Posts', 'userswp' ) );
914 }
915
916 /**
917 * Prints the profile page "comments" tab content.
918 *
919 * @since 1.0.0
920 * @package userswp
921 *
922 * @param object $user The User ID.
923 * @param string $post_type Post type.
924 * @param array $args Extra arguments.
925 *
926 * @return void
927 */
928 public function get_profile_comments( $user, $post_type = 'post', $args = array() ) {
929
930 $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
931 $number = uwp_get_option( 'profile_no_of_items', 10 );
932 $offset = ( $paged - 1 ) * $number;
933
934 $total_comments = $this->get_comment_count_by_user( $user->ID, $post_type );
935 $maximum_pages = ceil( $total_comments / $number );
936
937 $query_args = array(
938 'number' => $number,
939 'offset' => $offset,
940 'user_id' => $user->ID,
941 'paged' => $paged,
942 'post_type' => $post_type,
943 );
944 // The Query
945 $the_query = new WP_Comment_Query();
946 $comments = $the_query->query( $query_args );
947
948 if(!$comments){
949 return;
950 }
951
952 $args['template_args']['the_query'] = $comments;
953 $args['template_args']['user'] = $user;
954 $args['template_args']['title'] = ! empty( $args['template_args']['title'] ) ? $args['template_args']['title'] : __( "Comments", 'userswp' );
955 $args['template_args']['maximum_pages'] = $maximum_pages;
956
957 $design_style = ! empty( $args['design_style'] ) ? esc_attr( $args['design_style'] ) : uwp_get_option( "design_style", 'bootstrap' );
958 $template = $design_style ? $design_style . "/loop-comments.php" : "loop-comments.php";
959 uwp_get_template( $template, $args );
960 }
961
962 /**
963 * Displays the profile page "user comments" tab content.
964 *
965 * @since 1.2.2.36
966 * @package userswp
967 *
968 * @param object $user The User ID.
969 * @param string $post_type Post type.
970 * @param array $args Extra arguments.
971 *
972 * @return void
973 */
974 public function get_profile_user_comments( $user, $post_type = 'post', $args = array() ) {
975
976 $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
977 $number = uwp_get_option( 'profile_no_of_items', 10 );
978 $offset = ( $paged - 1 ) * $number;
979
980 $args = array(
981 'post_type' => $post_type,
982 'post_status' => 'published',
983 'posts_per_page' => -1,
984 'author' => $user->ID,
985 'fields' => 'ids',
986 );
987
988 $wp_query = new WP_Query($args);
989 $post_ids = $wp_query->posts;
990
991 if(isset( $the_query->found_posts ) && $wp_query->found_posts == 0 || empty($post_ids) ){
992 return;
993 }
994
995 $query_args = array(
996 'count' => true,
997 'post_type' => $post_type,
998 'post__in' => $post_ids,
999 'author__not_in' => $user->ID,
1000 );
1001 // The Query
1002 $the_query = new WP_Comment_Query();
1003 $comments_count = $the_query->query( $query_args );
1004
1005 $total_comments = $comments_count;
1006 $maximum_pages = ceil( $total_comments / $number );
1007
1008 $query_args = array(
1009 'number' => $number,
1010 'offset' => $offset,
1011 'paged' => $paged,
1012 'post_type' => $post_type,
1013 'post__in' => $post_ids,
1014 'author__not_in' => $user->ID,
1015 );
1016
1017 // The Query
1018 $the_query = new WP_Comment_Query();
1019 $comments = $the_query->query( $query_args );
1020
1021 if(!$comments){
1022 return;
1023 }
1024
1025 $args['template_args']['the_query'] = $comments;
1026 $args['template_args']['user'] = $user;
1027 $args['template_args']['title'] = ! empty( $args['template_args']['title'] ) ? $args['template_args']['title'] : __( "User Comments", 'userswp' );
1028 $args['template_args']['maximum_pages'] = $maximum_pages;
1029
1030 $design_style = ! empty( $args['design_style'] ) ? esc_attr( $args['design_style'] ) : uwp_get_option( "design_style", 'bootstrap' );
1031 $template = $design_style ? $design_style . "/loop-comments.php" : "loop-comments.php";
1032 uwp_get_template( $template, $args );
1033 }
1034
1035 /**
1036 * Gets the comment count.
1037 *
1038 * @since 1.0.0
1039 * @package userswp
1040 *
1041 * @param int $user_id User ID.
1042 *
1043 * @return int Comment count.
1044 */
1045 public function get_comment_count_by_user( $user_id, $post_type = 'post' ) {
1046 global $wpdb;
1047
1048 $count = $wpdb->get_var(
1049 "SELECT COUNT(comment_ID)
1050 FROM " . $wpdb->comments . "
1051 WHERE comment_post_ID in (
1052 SELECT ID
1053 FROM " . $wpdb->posts . "
1054 WHERE post_type = '".$post_type."'
1055 AND post_status = 'publish')
1056 AND user_id = " . $user_id . "
1057 AND comment_approved = '1'
1058 AND comment_type NOT IN ('pingback', 'trackback' )"
1059 );
1060
1061 return $count;
1062 }
1063
1064 /**
1065 * Rewrites profile page links
1066 *
1067 * @since 1.0.0
1068 * @package userswp
1069 * @return void
1070 */
1071 public function rewrite_profile_link() {
1072
1073 $page_id = uwp_get_page_id( 'profile_page', false );
1074 if ( $page_id && ! isset( $_REQUEST['page_id'] ) && get_post_type( $page_id ) == 'page' ) {
1075 $link = get_page_link( $page_id );
1076 $uwp_profile_link = trailingslashit( $this->profile_slug() );
1077 $uwp_profile_page_id = $page_id;
1078
1079 // {home_url}/profile/1
1080 $uwp_profile_link_empty_slash = '^' . $uwp_profile_link . '([^/]+)?$';
1081 add_rewrite_rule( $uwp_profile_link_empty_slash, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]', 'top' );
1082
1083 // {home_url}/profile/1/
1084 $uwp_profile_link_with_slash = '^' . $uwp_profile_link . '([^/]+)/?$';
1085 add_rewrite_rule( $uwp_profile_link_with_slash, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]', 'top' );
1086
1087 // {home_url}/profile/1/page/1
1088 $uwp_profile_link_empty_slash_paged = '^' . $uwp_profile_link . '([^/]+)/page/([0-9]+)?$';
1089 add_rewrite_rule( $uwp_profile_link_empty_slash_paged, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&paged=$matches[2]', 'top' );
1090
1091 // {home_url}/profile/1/page/1/
1092 $uwp_profile_link_with_slash_paged = '^' . $uwp_profile_link . '([^/]+)/page/([0-9]+)/?$';
1093 add_rewrite_rule( $uwp_profile_link_with_slash_paged, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&paged=$matches[2]', 'top' );
1094
1095 // {home_url}/profile/1/tab-slug
1096 $uwp_profile_tab_empty_slash = '^' . $uwp_profile_link . '([^/]+)/([^/]+)?$';
1097 add_rewrite_rule( $uwp_profile_tab_empty_slash, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]', 'top' );
1098
1099 // {home_url}/profile/1/tab-slug/
1100 $uwp_profile_tab_with_slash = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/?$';
1101 add_rewrite_rule( $uwp_profile_tab_with_slash, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]', 'top' );
1102
1103 // {home_url}/profile/1/tab-slug/page/1
1104 $uwp_profile_tab_empty_slash_paged = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/page/([0-9]+)?$';
1105 add_rewrite_rule( $uwp_profile_tab_empty_slash_paged, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]&paged=$matches[3]', 'top' );
1106
1107 // {home_url}/profile/1/tab-slug/page/1/
1108 $uwp_profile_tab_with_slash_paged = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/page/([0-9]+)/?$';
1109 add_rewrite_rule( $uwp_profile_tab_with_slash_paged, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]&paged=$matches[3]', 'top' );
1110
1111 // {home_url}/profile/1/tab-slug/subtab-slug
1112 $uwp_profile_tab_empty_slash = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/([^/]+)?$';
1113 add_rewrite_rule( $uwp_profile_tab_empty_slash, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]&uwp_subtab=$matches[3]', 'top' );
1114
1115 // {home_url}/profile/1/tab-slug/subtab-slug/
1116 $uwp_profile_tab_with_slash = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/([^/]+)/?$';
1117 add_rewrite_rule( $uwp_profile_tab_with_slash, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]&uwp_subtab=$matches[3]', 'top' );
1118
1119 // {home_url}/profile/1/tab-slug/subtab-slug/page/1
1120 $uwp_profile_tab_empty_slash_paged = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/([^/]+)/page/([0-9]+)?$';
1121 add_rewrite_rule( $uwp_profile_tab_empty_slash_paged, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]&uwp_subtab=$matches[3]&paged=$matches[4]', 'top' );
1122
1123 // {home_url}/profile/1/tab-slug/subtab-slug/page/1/
1124 $uwp_profile_tab_with_slash_paged = '^' . $uwp_profile_link . '([^/]+)/([^/]+)/([^/]+)/page/([0-9]+)/?$';
1125 add_rewrite_rule( $uwp_profile_tab_with_slash_paged, 'index.php?page_id=' . $uwp_profile_page_id . '&uwp_profile=$matches[1]&uwp_tab=$matches[2]&uwp_subtab=$matches[3]&paged=$matches[4]', 'top' );
1126
1127 if ( get_option( 'uwp_flush_rewrite' ) ) {
1128 //Ensure the $wp_rewrite global is loaded
1129 global $wp_rewrite;
1130 //Call flush_rules() as a method of the $wp_rewrite object
1131 $wp_rewrite->flush_rules( false );
1132 delete_option( 'uwp_flush_rewrite' );
1133 }
1134
1135 if ( function_exists('pll_current_language') ) {
1136 $previous_lang = ! empty( $_COOKIE[ PLL_COOKIE ] ) ? $_COOKIE[ PLL_COOKIE ] : '';
1137 $current_lang = pll_current_language();
1138 if ( $current_lang != $previous_lang ) {
1139
1140
1141 flush_rewrite_rules( true );
1142 }
1143 }
1144 }
1145 }
1146
1147 /**
1148 * Get the slug for the profile page.
1149 *
1150 * @since 1.2.2.18
1151 *
1152 * @param string $slug Profile slug. Default profile.
1153 *
1154 * @return string
1155 */
1156 public function profile_slug( $slug = 'profile' ) {
1157 if ( $page_id = uwp_get_page_id( 'profile_page', false ) ) {
1158 if ( $_slug = get_page_uri( absint( $page_id ) ) ) {
1159 $slug = $_slug;
1160 }
1161 }
1162 return apply_filters( 'uwp_rewrite_profile_slug', $slug );
1163 }
1164
1165 /**
1166 * Adds profile page query variables.
1167 *
1168 * @since 1.0.0
1169 * @package userswp
1170 *
1171 * @param array $query_vars Query variables.
1172 *
1173 * @return array Modified Query variables array.
1174 */
1175 public function profile_query_vars( $query_vars ) {
1176 $query_vars[] = 'uwp_profile';
1177 $query_vars[] = 'uwp_tab';
1178 $query_vars[] = 'uwp_subtab';
1179
1180 return $query_vars;
1181 }
1182
1183 /**
1184 * Modifies profile page title to include username.
1185 *
1186 * @since 1.0.0
1187 * @package userswp
1188 *
1189 * @param string $title Original title
1190 * @param int|null $id Page id.
1191 *
1192 * @return string Modified page title.
1193 */
1194 public function modify_profile_page_title( $title, $id = null ) {
1195
1196 global $wp_query;
1197 $page_id = uwp_get_page_id( 'profile_page', false );
1198
1199 if ( $page_id == $id && isset( $wp_query->query_vars['uwp_profile'] ) && in_the_loop() ) {
1200
1201 $url_type = apply_filters( 'uwp_profile_url_type', 'slug' );
1202
1203 $author_slug = $wp_query->query_vars['uwp_profile'];
1204
1205 if ( $url_type == 'id' ) {
1206 $user = get_user_by( 'id', $author_slug );
1207 } else {
1208 $user = get_user_by( 'slug', $author_slug );
1209 }
1210 $title = esc_attr( $user->display_name );
1211 }
1212
1213 return $title;
1214 }
1215
1216 /**
1217 * Initializes image crop js.
1218 *
1219 * @since 1.0.0
1220 * @package userswp
1221 *
1222 * @param object $user The User ID.
1223 */
1224 public function image_crop_init( $user ) {
1225 if ( is_user_logged_in() ) {
1226 add_action( 'wp_footer', array( $this, 'modal_loading_html' ) );
1227 add_action( 'wp_footer', array( $this, 'modal_close_js' ) );
1228 if ( is_admin() ) {
1229 add_action( 'admin_footer', array( $this, 'modal_loading_html' ) );
1230 add_action( 'admin_footer', array( $this, 'modal_close_js' ) );
1231 }
1232 }
1233 }
1234
1235 /**
1236 * Adds modal close js.
1237 *
1238 * @since 1.0.0
1239 * @package userswp
1240 * @return void
1241 */
1242 public function modal_close_js() {
1243 ?>
1244 <script type="text/javascript">
1245 (function ($, window, undefined) {
1246 $(document).ready(function () {
1247 $('.uwp-modal-close').click(function (e) {
1248 e.preventDefault();
1249 var uwp_popup_type = $(this).data('type');
1250 // $('#uwp-'+uwp_popup_type+'-modal').hide();
1251 var mod_shadow = jQuery('#uwp-modal-backdrop');
1252 var container = jQuery('#uwp-popup-modal-wrap');
1253 container.hide();
1254 container.replaceWith('<?php echo $this->modal_loading_html(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>');
1255 mod_shadow.remove();
1256 });
1257 });
1258 }(jQuery, window));
1259 </script>
1260 <?php
1261 }
1262
1263 /*
1264 * Modifies get_avatar_url function to use UWP avatar URL.
1265 *
1266 * @param string $url Default avatar URL
1267 * @param int|string $id_or_email User ID or email
1268 *
1269 * @return string $url New avatar URL
1270 *
1271 */
1272 function get_avatar_url( $url, $id_or_email ) {
1273
1274 // don't filter on admin side.
1275 if ( is_admin() && ! wp_doing_ajax() ) {
1276 return $url;
1277 }
1278
1279 $user = false;
1280
1281 if ( 1 == uwp_get_option( 'disable_avatar_override' ) ) {
1282 return $url;
1283 }
1284
1285 if ( is_numeric( $id_or_email ) ) {
1286
1287 $id = (int) $id_or_email;
1288 $user = get_user_by( 'id', $id );
1289
1290 } elseif ( is_object( $id_or_email ) ) {
1291
1292 if ( ! empty( $id_or_email->user_id ) ) {
1293 $id = (int) $id_or_email->user_id;
1294 $user = get_user_by( 'id', $id );
1295 }
1296
1297 } else {
1298 $user = get_user_by( 'email', $id_or_email );
1299 }
1300
1301 if ( $user && is_object( $user ) ) {
1302 $avatar_thumb = uwp_get_usermeta( $user->data->ID, 'avatar_thumb', '' );
1303 if ( ! empty( $avatar_thumb ) ) {
1304 add_filter( 'upload_dir', 'uwp_handle_multisite_profile_image', 10, 1 );
1305 $uploads = wp_upload_dir();
1306 remove_filter( 'upload_dir', 'uwp_handle_multisite_profile_image' );
1307 $upload_url = $uploads['baseurl'];
1308 if ( substr( $avatar_thumb, 0, 4 ) !== "http" ) {
1309 $url = $upload_url . $avatar_thumb;
1310 } else {
1311 $url = $avatar_thumb;
1312 }
1313 } else {
1314 $default = uwp_get_default_avatar_uri();
1315 if ( uwp_is_localhost() ) { // if localhost then default gravatar won't work.
1316 $url = $default;
1317 } else {
1318 $url = remove_query_arg( 'd', $url );
1319 $url = add_query_arg( array( 'd' => $default ), $url );
1320 }
1321
1322 }
1323 }
1324
1325 return $url;
1326 }
1327
1328 /**
1329 * Modified the comment author url to profile page link for loggedin users.
1330 *
1331 * @since 1.0.0
1332 * @package userswp
1333 *
1334 * @param string $link Original author link.
1335 *
1336 * @return string Modified author link.
1337 */
1338 public function get_comment_author_link( $link ) {
1339 global $comment;
1340 if ( ! empty( $comment->user_id ) && ! empty( get_userdata( $comment->user_id )->ID ) ) {
1341 $user = get_userdata( $comment->user_id );
1342 $link = sprintf(
1343 '<a href="%s" rel="external nofollow" class="url">%s</a>',
1344 uwp_build_profile_tab_url( $comment->user_id ),
1345 strip_tags( $user->display_name )
1346 );
1347 }
1348
1349 return $link;
1350 }
1351
1352 /**
1353 * Redirects /author page to /profile page.
1354 *
1355 * @since 1.0.0
1356 * @package userswp
1357 * @return void
1358 */
1359 public function redirect_author_page() {
1360
1361 if ( uwp_is_page_builder() ) {
1362 return;
1363 }
1364
1365 if ( is_author() && 1 != uwp_get_option( 'uwp_disable_author_link' ) && apply_filters( 'uwp_check_redirect_author_page', true ) ) {
1366 $id = get_query_var( 'author' );
1367 $link = uwp_build_profile_tab_url( $id );
1368 $link = apply_filters( 'uwp_redirect_author_page', $link, $id );
1369 wp_redirect( $link );
1370 exit;
1371 }
1372 }
1373
1374 /**
1375 * Modifies "edit my profile" link in admin bar
1376 *
1377 * @since 1.0.0
1378 * @package userswp
1379 *
1380 * @param string $url The complete URL including scheme and path.
1381 * @param int $user_id The user ID.
1382 * @param string $scheme Scheme to give the URL context. Accepts 'http', 'https', 'login',
1383 * 'login_post', 'admin', 'relative' or null.
1384 *
1385 * @return false|string Filtered url.
1386 */
1387 public function modify_admin_bar_edit_profile_url( $url, $user_id, $scheme ) {
1388 // Makes the link to http://example.com/account
1389 if ( ! is_admin() && ! user_can( $user_id, 'administrator' ) ) {
1390 $account_page = uwp_get_page_id( 'account_page', false );
1391 if ( $account_page ) {
1392 $account_page_link = get_permalink( $account_page );
1393 $url = $account_page_link;
1394 }
1395 }
1396
1397 return $url;
1398 }
1399
1400 /**
1401 * Restrict the files display only to current users in media popup.
1402 *
1403 * @since 1.0.0
1404 * @package userswp
1405 *
1406 * @param object $wp_query Unmodified wp_query.
1407 *
1408 * @return object Modified wp_query.
1409 */
1410 public function restrict_attachment_display( $wp_query ) {
1411 if ( ! is_admin() ) {
1412 if ( ! current_user_can( 'manage_options' ) ) {
1413 $wp_query->set( 'author', get_current_user_id() );
1414 }
1415 }
1416
1417 return $wp_query;
1418 }
1419
1420 /**
1421 * Allow users to upload files who has upload capability.
1422 *
1423 * @since 1.0.0
1424 * @package userswp
1425 *
1426 * @param array $llcaps An array of all the user's capabilities.
1427 * @param array $caps Actual capabilities for meta capability.
1428 * @param array $args Optional parameters passed to has_cap(), typically object ID.
1429 * @param object $user The user object.
1430 *
1431 * @return array User capabilities.
1432 */
1433 public function allow_all_users_profile_uploads( $llcaps, $caps, $args, $user ) {
1434
1435 $files = new UsersWP_Files();
1436
1437 if ( isset( $caps[0] ) && $caps[0] == 'upload_files' && $files->doing_upload() ) {
1438 $llcaps['upload_files'] = true;
1439 }
1440
1441 return $llcaps;
1442 }
1443
1444 /**
1445 * Validates file uploads and returns errors if found.
1446 *
1447 * @since 1.0.0
1448 * @package userswp
1449 *
1450 * @param string|bool $value Original value.
1451 * @param object $field Field info.
1452 * @param string $file_key Field key.
1453 * @param array $file_to_upload File data to upload.
1454 *
1455 * @return string|WP_Error Returns original value if no errors. Else returns errors.
1456 */
1457 public function handle_file_upload_error_checks( $value, $field, $file_key, $file_to_upload ) {
1458
1459 if ( in_array( $field->htmlvar_name, array( 'avatar', 'banner' ) ) ) {
1460
1461 if ( $field->htmlvar_name == 'avatar' ) {
1462 $avatar_size = uwp_get_upload_image_size();
1463 $min_width = $avatar_size['width'];
1464 $min_height = $avatar_size['height'];
1465 } else {
1466 $banner_size = uwp_get_upload_image_size('banner');
1467 $min_width = $banner_size['width'];
1468 $min_height = $banner_size['height'];
1469 }
1470
1471 $imagedetails = getimagesize( $file_to_upload['tmp_name'] );
1472 $width = $imagedetails[0];
1473 $height = $imagedetails[1];
1474
1475 if ( $width < $min_width ) {
1476 return new WP_Error( 'image-too-small', sprintf( __( 'The uploaded file is too small. Minimum image width should be %s px', 'userswp' ), $min_width ) );
1477 }
1478 if ( $height < $min_height ) {
1479 return new WP_Error( 'image-too-small', sprintf( __( 'The uploaded file is too small. Minimum image height should be %s px', 'userswp' ), $min_height ) );
1480 }
1481 }
1482
1483 return $value;
1484
1485 }
1486
1487 /**
1488 * Sets uwp_profile_upload to true on profile page.
1489 *
1490 * @since 1.0.0
1491 * @package userswp
1492 *
1493 * @param array $params Plupload params
1494 *
1495 * @return array Plupload params
1496 */
1497 public function add_uwp_plupload_param( $params ) {
1498
1499 if ( ! is_admin() && get_the_ID() == uwp_get_page_id( 'profile_page', false ) ) {
1500 $params['uwp_profile_upload'] = true;
1501 }
1502
1503 return $params;
1504 }
1505
1506 /**
1507 * Handles avatar and banner file upload.
1508 *
1509 * @since 1.0.0
1510 * @package userswp
1511 * @return void
1512 */
1513 public function ajax_avatar_banner_upload() {
1514
1515 if ( ! isset( $_POST['security'] ) || ! wp_verify_nonce( $_POST['security'], 'uwp_avatar_banner_upload_nonce' ) ) {
1516 $result['error'] = aui()->alert( array(
1517 'type' => 'danger',
1518 'content' => __( "Security check failed.", "userswp" )
1519 ) );
1520 $return = json_encode( $result );
1521 echo $return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1522 die();
1523 }
1524
1525 $type = strip_tags( esc_sql( $_POST['uwp_popup_type'] ) );
1526 $result = array();
1527
1528 if ( ! in_array( $type, array( 'banner', 'avatar' ) ) ) {
1529 $result['error'] = aui()->alert( array(
1530 'type' => 'danger',
1531 'content' => __( "Invalid request!", "userswp" )
1532 ) );
1533 $return = json_encode( $result );
1534 echo $return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1535 die();
1536 }
1537
1538 global $wpdb;
1539 $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
1540 $fields = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $table_name . " WHERE form_type = %s AND field_type = 'file' AND is_active = '1' ORDER BY sort_order ASC", array( $type ) ) );
1541
1542 $field = false;
1543 if ( $fields ) {
1544 $field = $fields[0];
1545 }
1546
1547 $result = array();
1548
1549 if ( ! $field ) {
1550 $result['error'] = aui()->alert( array(
1551 'type' => 'danger',
1552 'content' => __( "No fields available", "userswp" )
1553 ) );
1554 $return = json_encode( $result );
1555 echo $return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1556 die();
1557 }
1558
1559 $files = new UsersWP_Files();
1560 $errors = $files->handle_file_upload( $field, $_FILES );
1561
1562 if ( is_wp_error( $errors ) ) {
1563 $result['error'] = aui()->alert( array(
1564 'type' => 'danger',
1565 'content' => $errors->get_error_message()
1566 ) );
1567 $return = json_encode( $result );
1568 echo $return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1569 } else {
1570 $return = $this->ajax_image_crop_popup( $errors['url'], $type );
1571 echo $return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1572 }
1573
1574 die();
1575 }
1576
1577 /**
1578 * Returns the avatar and banner crop popup html and js.
1579 *
1580 * @since 1.0.0
1581 * @package userswp
1582 *
1583 * @param string $image_url Image url to crop.
1584 * @param string $type Crop type. Avatar or Banner
1585 *
1586 * @return string|null Html and js content.
1587 */
1588 public function ajax_image_crop_popup( $image_url, $type ) {
1589 wp_enqueue_style( 'jcrop' );
1590 wp_enqueue_script( 'jcrop', array( 'jquery' ) );
1591
1592 $output = null;
1593 if ( $image_url && $type ) {
1594 $output = $this->image_crop_popup( $image_url, $type );
1595 }
1596
1597 return $output;
1598 }
1599
1600 /**
1601 * Returns json content for image crop.
1602 *
1603 * @since 1.0.0
1604 * @package userswp
1605 *
1606 * @param string $image_url Image url
1607 * @param string $type popup type. Avatar or Banner
1608 *
1609 * @return string Json
1610 */
1611 public function image_crop_popup( $image_url, $type ) {
1612
1613 add_filter( 'upload_dir', 'uwp_handle_multisite_profile_image', 10, 1 );
1614 $uploads = wp_upload_dir();
1615 remove_filter( 'upload_dir', 'uwp_handle_multisite_profile_image' );
1616 $upload_url = $uploads['baseurl'];
1617 $upload_path = $uploads['basedir'];
1618 $image_path = str_replace( $upload_url, $upload_path, $image_url );
1619
1620 $image = apply_filters( 'uwp_' . $type . '_cropper_image', getimagesize( $image_path ) );
1621 if ( empty( $image ) ) {
1622 return "";
1623 }
1624
1625 if ( $type == 'avatar' ) {
1626 $avatar_size = uwp_get_upload_image_size();
1627 $full_width = $avatar_size['width'];
1628 $full_height = $avatar_size['height'];
1629 } else {
1630 $banner_size = uwp_get_upload_image_size('banner');
1631 $full_width = $banner_size['width'];
1632 $full_height = $banner_size['height'];
1633 }
1634
1635 $values = array(
1636 'error' => '',
1637 'image_url' => $image_url,
1638 'uwp_popup_type' => $type,
1639 'uwp_full_width' => $full_width,
1640 'uwp_full_height' => $full_height,
1641 'uwp_true_width' => $image[0],
1642 'uwp_true_height' => $image[1],
1643 'uwp_popup_content' => $this->image_crop_modal_html( $type, $image_url, $full_width, $full_height ),
1644 );
1645
1646 $json = json_encode( $values );
1647
1648
1649 return $json;
1650 }
1651
1652 /**
1653 * Returns avatar and banner crop modal html.
1654 *
1655 * @since 1.0.0
1656 * @package userswp
1657 *
1658 * @param string $type Avatar or Banner
1659 * @param string $image_url Image url to crop
1660 * @param int $full_width Full image width
1661 * @param int $full_height Full image height
1662 *
1663 * @return string Html.
1664 */
1665 public function image_crop_modal_html( $type, $image_url, $full_width, $full_height ) {
1666 $args = array(
1667 'type' => $type,
1668 'image_url' => $image_url,
1669 'full_width' => $full_width,
1670 'full_height' => $full_height,
1671 );
1672 ob_start();
1673
1674 $design_style = uwp_get_option( "design_style", 'bootstrap' );
1675 $template = $design_style ? $design_style . "/modal-profile-image-crop.php" : "modal-profile-image-crop.php";
1676
1677 uwp_get_template( $template, $args );
1678 ?>
1679 <script type="text/javascript">
1680 (function ($, window, undefined) {
1681 $(document).ready(function () {
1682 $('.uwp-modal-close').click(function (e) {
1683 e.preventDefault();
1684 var uwp_popup_type = $(this).data('type');
1685 var mod_shadow = jQuery('#uwp-modal-backdrop');
1686 var container = jQuery('#uwp-popup-modal-wrap');
1687 container.hide();
1688 container.replaceWith('<?php echo $this->modal_loading_html(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>');
1689 mod_shadow.remove();
1690 });
1691 });
1692 }(jQuery, window));
1693 </script>
1694 <?php
1695 $output = ob_get_contents();
1696 ob_end_clean();
1697
1698 return trim( $output );
1699 }
1700
1701 /**
1702 * Returns modal content loading html.
1703 *
1704 * @since 1.0.0
1705 * @package userswp
1706 */
1707 public function modal_loading_html() {
1708 ob_start();
1709 ?>
1710 <div id="uwp-popup-modal-wrap" style="display: none;">
1711 <div class="uwp-bs-modal uwp_fade uwp_show">
1712 <div class="uwp-bs-modal-dialog">
1713 <div class="uwp-bs-modal-content">
1714 <div class="uwp-bs-modal-header">
1715 <h4 class="uwp-bs-modal-title">
1716 <?php esc_attr_e( "Loading Form ...", "userswp" ); ?>
1717 </h4>
1718 </div>
1719 <div class="uwp-bs-modal-body">
1720 <div class="uwp-bs-modal-loading-icon-wrap">
1721 <div class="uwp-bs-modal-loading-icon"></div>
1722 </div>
1723 </div>
1724 </div>
1725 </div>
1726 </div>
1727 </div>
1728 <?php
1729 $output = ob_get_contents();
1730 ob_end_clean();
1731 echo trim( preg_replace( "/\s+|\n+|\r/", ' ', $output ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1732 }
1733
1734 /**
1735 * Handles crop popup form ajax request.
1736 *
1737 * @since 1.0.0
1738 * @package userswp
1739 * @return void
1740 */
1741 public function ajax_image_crop_popup_form() {
1742 $type = isset( $_POST['type'] ) ? strip_tags( esc_sql( $_POST['type'] ) ) : '';
1743
1744 $output = null;
1745
1746
1747 if ( $type && in_array( $type, array( 'banner', 'avatar' ) ) ) {
1748 $output = $this->crop_submit_form( $type );
1749 }
1750 echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1751 exit();
1752 }
1753
1754 /**
1755 * Returns avatar and banner crop submit form.
1756 *
1757 * @since 1.0.0
1758 * @package userswp
1759 *
1760 * @param string $type Avatar or Banner
1761 *
1762 * @return string Html.
1763 */
1764 public function crop_submit_form( $type = 'avatar' ) {
1765
1766 if ( is_admin() && defined( 'IS_PROFILE_PAGE' ) && IS_PROFILE_PAGE ) {
1767 $user_id = get_current_user_id();
1768 } elseif ( is_admin() && current_user_can( 'manage_options' ) && ! empty( $_GET['user_id'] ) && is_numeric( $_GET['user_id'] ) ) {
1769 $user_id = absint( $_GET['user_id'] );
1770 } else {
1771 $user_id = get_current_user_id();
1772 }
1773
1774 ob_start();
1775
1776 // get file sizes
1777 $files = new UsersWP_Files();
1778 $max_file_size = $files->uwp_get_max_upload_size( $type );
1779
1780 $design_style = uwp_get_option( "design_style", 'bootstrap' );
1781 $template = $design_style ? $design_style . "/modal-profile-image.php" : "modal-profile-image.php";
1782 uwp_get_template( $template, array( 'user_id' => $user_id ) );
1783
1784 $content_wrap = $design_style == 'bootstrap' ? '.uwp-profile-image-change-modal .modal-content' : '#uwp-popup-modal-wrap';
1785 $bg_color = apply_filters('uwp_crop_image_bg_color', '', $type);
1786
1787 $ajax_nonce = wp_create_nonce( 'uwp_avatar_banner_upload_nonce' );
1788 ?>
1789
1790 <script type="text/javascript">
1791 (function ($, window, undefined) {
1792
1793 var uwp_popup_type = '<?php echo esc_attr( $type ); ?>';
1794
1795 $(document).ready(function () {
1796 $("#progressbar").progressbar();
1797 $('.uwp-modal-close').click(function (e) {
1798 e.preventDefault();
1799 var uwp_popup_type = $(this).data('type');
1800 var mod_shadow = jQuery('#uwp-modal-backdrop');
1801 var container = jQuery('#uwp-popup-modal-wrap');
1802 container.hide();
1803 container.replaceWith('<?php $this->modal_loading_html(); ?>');
1804 mod_shadow.remove();
1805 });
1806
1807 $('#uwp_upload_<?php echo esc_attr( $type ); ?>').on('change', function (e) {
1808 e.preventDefault();
1809
1810 var container = jQuery('<?php echo esc_attr( $content_wrap );?>');
1811 var err_container = jQuery('#uwp-bs-modal-notice');
1812 err_container.html('');// clear errors on retry
1813
1814 var fd = new FormData();
1815 var files_data = $(this); // The <input type="file" /> field
1816 var file = files_data[0].files[0];
1817 var file_size = file.size;
1818
1819 // file size check
1820 if (file_size && <?php echo absint( $max_file_size );?> && file_size > <?php echo absint( $max_file_size );?>) {
1821 err_container.html('<div class="text-center alert alert-danger"><?php esc_attr_e( 'File too big.', 'userswp' );?></div>');
1822 return;
1823 }
1824
1825 fd.append('<?php echo esc_attr( $type ); ?>', file);
1826 // our AJAX identifier
1827 fd.append('action', 'uwp_avatar_banner_upload');
1828 fd.append('uwp_popup_type', '<?php echo esc_attr( $type ); ?>');
1829 // Add nonce for security
1830 fd.append('security', '<?php echo esc_js( $ajax_nonce ); ?>');
1831
1832 $("#progressBar").show().removeClass('d-none');
1833
1834 $.ajax({
1835 // Your server script to process the upload
1836 url: '<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>',
1837 type: 'POST',
1838 data: fd,
1839 cache: false,
1840 contentType: false,
1841 processData: false,
1842
1843 xhr: function () {
1844 myXhr = $.ajaxSettings.xhr();
1845 if (myXhr.upload) {
1846 myXhr.upload.addEventListener('progress', showProgress, false);
1847 } else {
1848 console.log("Upload progress is not supported.");
1849 }
1850 return myXhr;
1851 },
1852
1853 success: function (response) {
1854 $("#progressBar").hide();
1855 resp = JSON.parse(response);
1856 if (resp['error'] != "") {
1857 err_container.html(resp['error']);
1858 } else {
1859 resp = JSON.parse(response);
1860 uwp_full_width = resp['uwp_full_width'];
1861 uwp_full_height = resp['uwp_full_height'];
1862 uwp_true_width = resp['uwp_true_width'];
1863 uwp_true_height = resp['uwp_true_height'];
1864
1865 container.html(resp['uwp_popup_content']).find('#uwp-' + uwp_popup_type + '-to-crop').Jcrop({
1866 // onChange: showPreview,
1867 onSelect: updateCoords,
1868 allowResize: true,
1869 allowSelect: false,
1870 bgColor: '<?php echo esc_html( $bg_color ); ?>',
1871 boxWidth: 650, //Maximum width you want for your bigger images
1872 boxHeight: 400, //Maximum Height for your bigger images
1873 setSelect: [0, 0, uwp_full_width, uwp_full_height],
1874 aspectRatio: uwp_full_width / uwp_full_height,
1875 trueSize: [uwp_true_width, uwp_true_height],
1876 minSize: [uwp_full_width, uwp_full_height]
1877 });
1878 }
1879 },
1880
1881 });
1882 });
1883
1884 function showProgress(evt) {
1885 if (evt.lengthComputable) {
1886 var percentComplete = (evt.loaded / evt.total) * 100;
1887 progress(percentComplete, $('#progressBar'));
1888 }
1889 }
1890
1891 function progress(percent, $element) {
1892 percent = Math.round(percent);
1893 var progressBarWidth = percent * ( $element.width() / 100 );
1894 $element.find('div').width(progressBarWidth).html(percent + "%");
1895 }
1896
1897 function updateCoords(c) {
1898 jQuery('#' + uwp_popup_type + '-x').val(c.x);
1899 jQuery('#' + uwp_popup_type + '-y').val(c.y);
1900 jQuery('#' + uwp_popup_type + '-w').val(c.w);
1901 jQuery('#' + uwp_popup_type + '-h').val(c.h);
1902 }
1903
1904 });
1905 }(jQuery, window));
1906 </script>
1907
1908 <?php
1909 $output = ob_get_contents();
1910 ob_end_clean();
1911
1912 return trim( $output );
1913 }
1914
1915 public function ajax_profile_image_remove() {
1916 check_ajax_referer( 'uwp_basic_nonce', 'security' );
1917
1918 $type = ! empty( $_POST['type'] ) ? $_POST['type'] : '';
1919
1920 if ( ! in_array( $type, array( 'banner', 'avatar' ) ) ) {
1921 wp_die( -1 );
1922 }
1923
1924 $user_id = is_user_logged_in() ? (int) get_current_user_id() : 0;
1925
1926 if ( empty( $user_id ) ) {
1927 wp_send_json_error( __( 'Invalid access!', 'userswp' ) );
1928 }
1929
1930 uwp_update_usermeta( $user_id, $type . '_thumb', '' );
1931
1932 wp_send_json_success();
1933
1934 wp_die();
1935 }
1936
1937 /**
1938 * Defines javascript ajaxurl variable.
1939 *
1940 * @since 1.0.0
1941 * @package userswp
1942 * @return void
1943 */
1944 public function define_ajaxurl() {
1945
1946 echo '<script type="text/javascript">
1947 var ajaxurl = "' . esc_url( admin_url( 'admin-ajax.php' ) ) . '";
1948 </script>';
1949 }
1950
1951 public function wpdiscuz_profile_url( $profile_url, $user ) {
1952 if(!$user){
1953 return $profile_url;
1954 }
1955
1956 $allowed = apply_filters( 'uwp_wpdiscuz_profile_url_change', true, $profile_url, $user );
1957 if ( $allowed && isset($user->user_login) ) {
1958 return $this->get_profile_link( $profile_url, $user->ID );
1959 }
1960
1961 return $profile_url;
1962 }
1963
1964 /**
1965 * Display lightbox modal
1966 */
1967 public function lightbox_modals() {
1968 ?>
1969 <div class="modal fade uwp-profile-image-change-modal" tabindex="-1" role="dialog"
1970 aria-labelledby="uwp-profile-modal-title" aria-hidden="true">
1971 <div class="modal-dialog modal-xl">
1972 <div class="modal-content">
1973 <div class="modal-header">
1974 <h5 class="modal-title" id="uwp-profile-modal-title"></h5>
1975 </div>
1976 <div class="modal-body">
1977 <i class="fas fa-circle-notch fa-spin"></i>
1978 </div>
1979 </div>
1980 </div>
1981 </div>
1982 <?php
1983 }
1984
1985 }