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

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