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