PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.53
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.53
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 1.2.53, at includes/class-profile.php

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