PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 3.16.6
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v3.16.6
4.0.2 4.0.1 4.0.0 3.16.6 3.16.5 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.9 3.9.9 3.9.5 3.9.6 3.9.7 3.9.8 1.1.7 1.1.8 1.1.9 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 All 340 releases
profile-builder / features / functions.php

functions.php in User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor 3.16.6, at features/functions.php

2,085 lines 82.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
3
4 /**
5 * Functions Load
6 *
7 */
8
9 // whitelist options, you can add more register_settings changing the second parameter
10 function wppb_register_settings() {
11 register_setting( 'wppb_option_group', 'wppb_default_settings' );
12 register_setting( 'wppb_general_settings', 'wppb_general_settings', 'wppb_general_settings_sanitize' );
13 // register_setting( 'wppb_display_admin_settings', 'wppb_display_admin_settings' );
14 register_setting( 'wppb_profile_builder_pro_serial', 'wppb_profile_builder_pro_serial' );
15 register_setting( 'wppb_profile_builder_hobbyist_serial', 'wppb_profile_builder_hobbyist_serial' );
16 register_setting( 'wppb_module_settings', 'wppb_module_settings' );
17 register_setting( 'wppb_module_settings_description', 'wppb_module_settings_description' );
18 register_setting( 'customRedirectSettings', 'customRedirectSettings' );
19 register_setting( 'customUserListingSettings', 'customUserListingSettings' );
20 register_setting( 'reCaptchaSettings', 'reCaptchaSettings' );
21 register_setting( 'emailCustomizer', 'emailCustomizer' );
22 register_setting( 'wppb_content_restriction_settings', 'wppb_content_restriction_settings' );
23 register_setting( 'wppb_private_website_settings', 'wppb_private_website_settings' );
24 register_setting( 'wppb_two_factor_authentication_settings', 'wppb_two_factor_authentication_settings' );
25 }
26
27
28
29
30 // WPML support
31 function wppb_icl_t( $context, $name, $value, $kses = false ){
32
33 if( $kses === false ){
34 if( function_exists( 'icl_t' ) )
35 return icl_t( $context, $name, $value );
36 else
37 return $value;
38 } else {
39 if( function_exists( 'icl_t' ) )
40 return wp_kses_post( icl_t( $context, $name, $value ) );
41 else
42 return wp_kses_post( $value );
43 }
44
45 }
46
47 function wppb_icl_register_string( $context, $name, $value ) {
48 if( function_exists( 'icl_register_string' )) {
49 if ( $name === 'msf_previous_button_text_translation' || $name === 'msf_next_button_text_translation' )
50 $wpml_default_lang = 'en';
51 else
52 $wpml_default_lang = apply_filters('wpml_default_language', NULL );
53 $allow_empty_value = false;
54 icl_register_string($context, $name , $value , $allow_empty_value , $wpml_default_lang );
55 }
56 }
57
58
59 /**
60 * Whether Profile Builder should load style-block-themes-front-end.css.
61 */
62 function wppb_should_load_block_theme_stylesheet() {
63 $is_block_theme_context = version_compare( get_bloginfo( 'version' ), '5.9', '>=' )
64 && function_exists( 'wp_is_block_theme' )
65 && wp_is_block_theme();
66
67 /**
68 * Filter whether to load the block theme front-end stylesheet.
69 *
70 * @param bool $load_block_theme_stylesheet True when WordPress is 5.9+ and the active theme is a block theme.
71 */
72 return (bool) apply_filters( 'wppb_load_block_theme_stylesheet', $is_block_theme_context );
73 }
74
75 function wppb_add_plugin_stylesheet() {
76 $wppb_generalSettings = get_option( 'wppb_general_settings' );
77
78 if ( ( file_exists( WPPB_PLUGIN_DIR . '/assets/css/style-front-end.css' ) ) && ( isset( $wppb_generalSettings['extraFieldsLayout'] ) && ( $wppb_generalSettings['extraFieldsLayout'] == 'default' ) ) ){
79 wp_register_style( 'wppb_stylesheet', WPPB_PLUGIN_URL . 'assets/css/style-front-end.css', array(), PROFILE_BUILDER_VERSION );
80 wp_enqueue_style( 'wppb_stylesheet' );
81 }
82
83 if( is_rtl() ) {
84 if ( ( file_exists( WPPB_PLUGIN_DIR . '/assets/css/rtl.css' ) ) && ( isset( $wppb_generalSettings['extraFieldsLayout'] ) && ( $wppb_generalSettings['extraFieldsLayout'] == 'default' ) ) ){
85 wp_register_style( 'wppb_stylesheet_rtl', WPPB_PLUGIN_URL . 'assets/css/rtl.css', array(), PROFILE_BUILDER_VERSION );
86 wp_enqueue_style( 'wppb_stylesheet_rtl' );
87 }
88 }
89
90 if ( wppb_should_load_block_theme_stylesheet() ) {
91 $active_design = function_exists( 'wppb_get_active_form_design' ) ? wppb_get_active_form_design() : 'form-style-default';
92
93 if ( $active_design === 'form-style-default' && file_exists( WPPB_PLUGIN_DIR . 'assets/css/style-block-themes-front-end.css' ) ) {
94 wp_register_style( 'wppb_block_themes_front_end_stylesheet', WPPB_PLUGIN_URL . 'assets/css/style-block-themes-front-end.css', array(), PROFILE_BUILDER_VERSION );
95 wp_enqueue_style( 'wppb_block_themes_front_end_stylesheet' );
96 }
97 }
98 }
99
100
101 function wppb_show_admin_bar($content){
102 global $current_user;
103
104 $general_settings = get_option( 'wppb_general_settings' );
105 $selected_roles = isset( $general_settings['hide_admin_bar_for'] ) ? $general_settings['hide_admin_bar_for'] : '';
106
107 $show = null;
108
109 if ( $general_settings != 'not_found' && $current_user->ID && !empty( $selected_roles ) )
110 foreach ( $current_user->roles as $role_key ) {
111 if( $role_key == 'administrator' && current_user_can( 'manage_options' ) && !in_array( 'allUserRoles', $selected_roles ) )
112 break;
113 else if ( empty( $GLOBALS['wp_roles']->roles[$role_key] ) )
114 continue;
115
116 $role = $GLOBALS['wp_roles']->roles[$role_key];
117
118 if ( !empty( $selected_roles ) && ( in_array( $role['name'], $selected_roles ) || in_array( 'allUserRoles', $selected_roles ) || in_array( 'allUserRolesExceptAdmin', $selected_roles ) ) && $show === null )
119 $show = false;
120 }
121 return $show === null ? $content : $show;
122 }
123
124 function wppb_has_international_tel_input_field() {
125 $manage_fields = get_option( 'wppb_manage_fields', array() );
126
127 if ( ! is_array( $manage_fields ) ) {
128 return false;
129 }
130
131 foreach ( $manage_fields as $field ) {
132 if ( ! empty( $field['field'] ) && $field['field'] === 'International Telephone Input' ) {
133 return true;
134 }
135 }
136
137 return false;
138 }
139
140 function wppb_maybe_add_international_tel_input_notice() {
141 if ( ! class_exists( 'WPPB_Plugin_Notifications' ) ) {
142 return;
143 }
144
145 if ( ! wppb_has_international_tel_input_field() ) {
146 return;
147 }
148
149 if ( function_exists( 'wppb_international_tel_input_handler' ) ) {
150 return;
151 }
152
153 $notification_id = 'wppb_intl_tel_input_paid_update_notice';
154 $message = '<p>';
155 $message .= __( 'The <strong>International Telephone Input</strong> field is currently used on this site, but it now requires the <strong>paid Profile Builder plugin</strong> to be updated as well.', 'profile-builder' );
156 $message .= ' ';
157 $message .= __( 'Please update the paid plugin to the latest version so this field can continue to load and validate correctly.', 'profile-builder' );
158 $message .= '</p>';
159 $message .= '<a href="' . wp_nonce_url( add_query_arg( array( 'wppb_dismiss_admin_notification' => $notification_id ) ), 'wppb_plugin_notice_dismiss' ) . '" type="button" class="notice-dismiss"><span class="screen-reader-text">' . __( 'Dismiss this notice.', 'profile-builder' ) . '</span></a>';
160
161 WPPB_Plugin_Notifications::get_instance()->add_notification( $notification_id, $message, 'wppb-notice notice notice-warning is-dismissible', false, array(), true );
162 }
163
164 add_action( 'admin_init', 'wppb_maybe_add_international_tel_input_notice' );
165
166 if(!function_exists('wppb_curpageurl')){
167 function wppb_curpageurl(){
168 $req_uri = isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( $_SERVER['REQUEST_URI'] ) : '';
169
170 if( function_exists('wppb_get_abs_home') ) {
171 $url = parse_url( wppb_get_abs_home(), PHP_URL_PATH );
172
173 $home_path = !empty( $url ) ? trim( $url, '/' ) : $url;
174
175 if( $home_path === null || $home_path === false )
176 $home_path = '';
177
178 $home_path_regex = sprintf('|^%s|i', preg_quote($home_path, '|'));
179
180 // Trim path info from the end and the leading home path from the front.
181 $req_uri = ltrim($req_uri, '/');
182 $req_uri = preg_replace($home_path_regex, '', $req_uri);
183 $req_uri = trim(wppb_get_abs_home(), '/') . '/' . ltrim($req_uri, '/');
184 }
185
186 if ( function_exists('apply_filters') ) $req_uri = apply_filters('wppb_curpageurl', $req_uri);
187
188 return $req_uri;
189 }
190 }
191
192 /**
193 * Return absolute home url as stored in database, unfiltered.
194 *
195 * @return string
196 */
197 if(!function_exists('wppb_get_abs_home')) {
198 function wppb_get_abs_home(){
199 global $wpdb;
200 global $wppb_absolute_home;
201
202 if( isset($wppb_absolute_home) ) {
203 return $wppb_absolute_home;
204 }
205
206 // returns the unfiltered home_url by directly retrieving it from wp_options.
207 $wppb_absolute_home = (!is_multisite() && defined('WP_HOME')
208 ? WP_HOME
209 : (is_multisite() && !is_main_site()
210 ? (preg_match('/^(https)/', get_option('home')) === 1 ? 'https://'
211 : 'http://') . $wpdb->get_var(" SELECT CONCAT(b.domain, b.path)
212 FROM {$wpdb->blogs} b
213 WHERE blog_id = {$wpdb->blogid}
214 LIMIT 1")
215
216 : $wpdb->get_var(" SELECT option_value
217 FROM {$wpdb->options}
218 WHERE option_name = 'home'
219 LIMIT 1"))
220 );
221
222 if (empty($wppb_absolute_home)) {
223 $wppb_absolute_home = get_option("siteurl");
224 }
225
226 // always return absolute_home based on the http or https version of the current page request. This means no more redirects.
227 if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
228 $wppb_absolute_home = str_replace('http://', 'https://', $wppb_absolute_home);
229 } else {
230 $wppb_absolute_home = str_replace('https://', 'http://', $wppb_absolute_home);
231 }
232
233 return $wppb_absolute_home;
234 }
235 }
236
237
238 if ( is_admin() ){
239
240 // register the settings for the menu only display sidebar menu for a user with a certain capability, in this case only the "admin"
241 add_action( 'admin_init', 'wppb_register_settings' );
242
243 // display the same extra profile fields in the admin panel also
244 if ( file_exists ( WPPB_PLUGIN_DIR.'/front-end/default-fields/fields-functions.php' ) ){
245 require_once( WPPB_PLUGIN_DIR.'/front-end/default-fields/fields-functions.php' );
246
247 add_action( 'show_user_profile', 'wppb_display_fields_in_admin', 10 );
248 add_action( 'edit_user_profile', 'wppb_display_fields_in_admin', 10 );
249 global $pagenow;
250 if( $pagenow != 'user-new.php' )
251 add_action( 'user_profile_update_errors', 'wppb_validate_fields_in_admin', 10, 3 );
252 add_action( 'personal_options_update', 'wppb_save_fields_in_admin', 10 );
253 add_action( 'edit_user_profile_update', 'wppb_save_fields_in_admin', 10 );
254 }
255
256 // Since 3.8.1 fields are loaded in the back-end all the time: for conditional logic, simple uploads, display fields in admin functionalities
257 if (file_exists(WPPB_PLUGIN_DIR . '/front-end/default-fields/default-fields.php'))
258 require_once(WPPB_PLUGIN_DIR . '/front-end/default-fields/default-fields.php');
259
260 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists( WPPB_PAID_PLUGIN_DIR . '/front-end/extra-fields/extra-fields.php'))
261 require_once(WPPB_PAID_PLUGIN_DIR . '/front-end/extra-fields/extra-fields.php');
262
263
264 }else if ( !is_admin() ){
265 // include the stylesheet
266 add_action( 'wp_print_styles', 'wppb_add_plugin_stylesheet' );
267
268 // include the menu file for the profile informations
269 include_once( WPPB_PLUGIN_DIR.'/front-end/edit-profile.php' );
270 include_once( WPPB_PLUGIN_DIR.'/front-end/class-formbuilder.php' );
271 add_shortcode( 'wppb-edit-profile', 'wppb_front_end_profile_info' );
272
273 // include the menu file for the login screen
274 include_once( WPPB_PLUGIN_DIR.'/front-end/login.php' );
275 add_shortcode( 'wppb-login', 'wppb_front_end_login' );
276
277 // include the menu file for the logout screen
278 include_once( WPPB_PLUGIN_DIR.'/front-end/logout.php' );
279 add_shortcode( 'wppb-logout', 'wppb_front_end_logout' );
280
281 // include the menu file for the register screen
282 include_once( WPPB_PLUGIN_DIR.'/front-end/register.php' );
283 add_shortcode( 'wppb-register', 'wppb_front_end_register_handler' );
284
285 // include the menu file for the recover password screen
286 include_once( WPPB_PLUGIN_DIR.'/front-end/recover.php' );
287 add_shortcode( 'wppb-recover-password', 'wppb_front_end_password_recovery' );
288
289 // set the front-end admin bar to show/hide
290 add_filter( 'show_admin_bar' , 'wppb_show_admin_bar');
291
292 // Shortcodes used for the widget area
293 add_filter( 'widget_text', 'do_shortcode', 11 );
294 }
295
296
297 /**
298 * Function that overwrites the default wp_mail function and sends out emails
299 *
300 * @since v.2.0
301 *
302 * @param string $to
303 * @param string $subject
304 * @param string $message
305 * @param string $message_from
306 *
307 */
308 function wppb_mail( $to, $subject, $message, $message_from = null, $context = null, $headers = '' ) {
309 $to = apply_filters( 'wppb_send_email_to', $to, $context );
310 $send_email = apply_filters( 'wppb_send_email', true, $to, $subject, $message, $context );
311
312 $message = apply_filters( 'wppb_email_message', $message, $context );
313
314 $message = wppb_maybe_add_propper_html_tags_to_email( $message );
315
316 do_action( 'wppb_before_sending_email', $to, $subject, $message, $send_email, $context );
317
318 if ( $send_email ) {
319 //we add this filter to enable html encoding
320 if( apply_filters( 'wppb_mail_enable_html', true, $context, $to, $subject, $message ) )
321 add_filter('wp_mail_content_type', 'wppb_html_content_type' );
322
323 $atts = apply_filters( 'wppb_mail', compact( 'to', 'subject', 'message', 'headers' ), $context );
324
325 $sent = wp_mail( $atts['to'] , html_entity_decode( htmlspecialchars_decode( $atts['subject'], ENT_QUOTES ), ENT_QUOTES ), $atts['message'], $atts['headers'] );
326
327 do_action( 'wppb_after_sending_email', $sent, $to, $subject, $message, $send_email, $context );
328
329 return $sent;
330 }
331
332 return '';
333 }
334
335 /* return text/html as email content type. used in wp_mail_content_type filter */
336 function wppb_html_content_type( $content_type ){
337 return 'text/html';
338 }
339
340 /*
341 * function that adds proper html tags to a html email message if they are missing
342 */
343 function wppb_maybe_add_propper_html_tags_to_email( $message ){
344
345 //check if we have html content
346 if( $message !== wp_strip_all_tags( $message ) ){
347 if( strpos( html_entity_decode( $message ), '<html' ) === false && strpos( html_entity_decode( $message ), '<body' ) === false ){
348 $message = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>'. $message . '</body></html>';
349 }
350 }
351
352 return $message;
353 }
354
355 function wppb_activate_account_check(){
356 if ( ( isset( $_GET['activation_key'] ) ) && ( sanitize_text_field( $_GET['activation_key'] ) != '' ) ){
357 global $post;
358 $activation_key = sanitize_text_field( $_GET['activation_key'] );
359
360 $wppb_generalSettings = get_option( 'wppb_general_settings' );
361 $activation_landing_page_id = ( ( isset( $wppb_generalSettings['activationLandingPage'] ) && ( trim( $wppb_generalSettings['activationLandingPage'] ) != '' ) ) ? $wppb_generalSettings['activationLandingPage'] : 'not_set' );
362
363 if ( $activation_landing_page_id != 'not_set' ){
364 //an activation page was selected, but we still need to check if the current page doesn't already have the registration shortcode
365 if ( strpos( $post->post_content, '[wppb-register' ) === false && !has_block( 'wppb/register', $post->post_content ) )
366 add_filter( 'the_content', 'wppb_add_activation_message' );
367
368 }elseif ( strpos( $post->post_content, '[wppb-register' ) === false && !has_block( 'wppb/register', $post->post_content ) ){
369 //no activation page was selected, and the sent link pointed to the home url
370 nocache_headers();
371 wp_redirect( apply_filters( 'wppb_activatate_account_redirect_url', WPPB_PLUGIN_URL.'assets/misc/fallback-page.php?activation_key='.urlencode( $activation_key ).'&site_name='.urlencode( get_bloginfo( 'name' ) ).'&message='.urlencode( $activation_message = wppb_activate_signup( $activation_key ) ), $activation_key, $activation_message ) );
372 exit;
373 }
374 }
375 }
376 add_action( 'template_redirect', 'wppb_activate_account_check' );
377
378
379 function wppb_add_activation_message( $content ){
380 if( isset( $_GET['activation_key'] ) )
381 return wppb_activate_signup( sanitize_text_field( $_GET['activation_key'] ) ) . $content;
382 else
383 return $content;
384 }
385
386
387 // Create a new, top-level page
388 $args = array(
389 'page_title' => 'Profile Builder',
390 'menu_title' => 'Profile Builder',
391 'capability' => 'manage_options',
392 'menu_slug' => 'profile-builder',
393 'page_type' => 'menu_page',
394 'position' => '70.69',
395 'priority' => 1,
396 'icon_url' => WPPB_PLUGIN_URL . 'assets/images/pb-menu-icon.svg'
397 );
398 new WCK_Page_Creator_PB( $args );
399
400 /**
401 * Remove the automatically created submenu page
402 *
403 * @since v.2.0
404 *
405 * @return void
406 */
407 function wppb_remove_main_menu_page(){
408 remove_submenu_page( 'profile-builder', 'profile-builder' );
409 }
410 add_action( 'admin_menu', 'wppb_remove_main_menu_page', 11 );
411
412 /**
413 * Add scripts to the back-end CPT's to remove the slug from the edit page
414 *
415 * @since v.2.0
416 *
417 * @return void
418 */
419 function wppb_print_cpt_script( $hook ){
420 wp_enqueue_script( 'jquery-ui-dialog' );
421 wp_enqueue_style( 'wp-jquery-ui-dialog' );
422
423 if ( $hook == 'profile-builder_page_manage-fields' ){
424 wp_enqueue_script( 'wppb-manage-fields-live-change', WPPB_PLUGIN_URL . 'assets/js/jquery-manage-fields-live-change.js', array(), PROFILE_BUILDER_VERSION, true );
425 wp_localize_script( 'wppb-manage-fields-live-change', 'wppb_fields_strings', array( 'gdpr_title' => __( 'GDPR Checkbox', 'profile-builder' ), 'gdpr_description' => __( 'I allow the website to collect and store the data I submit through this form.', 'profile-builder' ), 'honeypot_title' => __( 'Honeypot', 'profile-builder' ) ) );
426
427 wp_enqueue_script( 'wppb-select2', WPPB_PLUGIN_URL . 'assets/js/select2/select2.min.js', array(), PROFILE_BUILDER_VERSION, true );
428 wp_enqueue_style( 'wppb-select2-style', WPPB_PLUGIN_URL . 'assets/css/select2/select2.min.css', false, PROFILE_BUILDER_VERSION );
429 }
430
431 if ( $hook == 'profile-builder_page_profile-builder-private-website' ){
432 wp_enqueue_script( 'wppb-select2', WPPB_PLUGIN_URL . 'assets/js/select2/select2.min.js', array(), PROFILE_BUILDER_VERSION, true );
433 wp_enqueue_script( 'wppb-select2-compat', WPPB_PLUGIN_URL . 'assets/js/select2-compat.js', array(), PROFILE_BUILDER_VERSION, true );
434 wp_enqueue_style( 'wppb-select2-style', WPPB_PLUGIN_URL . 'assets/css/select2/select2.min.css', false, PROFILE_BUILDER_VERSION );
435 }
436
437 if (( $hook == 'profile-builder_page_manage-fields' ) ||
438 ( $hook == 'profile-builder_page_profile-builder-basic-info' ) ||
439 ( $hook == 'profile-builder_page_profile-builder-add-ons' ) ||
440 ( $hook == 'profile-builder_page_profile-builder-general-settings' ) ||
441 ( $hook == 'profile-builder_page_profile-builder-admin-bar-settings' ) ||
442 ( $hook == 'profile-builder_page_profile-builder-register' ) ||
443 ( $hook == 'profile-builder_page_profile-builder-wppb_userListing' ) ||
444 ( $hook == 'profile-builder_page_custom-redirects' ) ||
445 ( $hook == 'profile-builder_page_profile-builder-wppb_emailCustomizer' ) ||//?what is this
446 ( $hook == 'profile-builder_page_profile-builder-wppb_emailCustomizerAdmin' ) ||//?what is this
447 ( $hook == 'profile-builder_page_profile-builder-add-ons' ) ||
448 ( $hook == 'profile-builder_page_profile-builder-woocommerce-sync' ) ||
449 ( $hook == 'profile-builder_page_profile-builder-bbpress') ||
450 ( $hook == 'profile-builder_page_admin-email-customizer') ||
451 ( $hook == 'profile-builder_page_user-email-customizer') ||
452 ( $hook == 'profile-builder_page_profile-builder-content_restriction' ) ||
453 ( strpos( $hook, 'profile-builder_page_' ) === 0 ) ||
454 ( $hook == 'edit.php' && ( isset( $_GET['post_type'] ) && $_GET['post_type'] === 'wppb-roles-editor' ) ) ||
455 ( $hook == 'toplevel_page_profile-builder-register') || //multisite register version page
456 ( $hook == 'admin_page_profile-builder-pms-promo') ) {
457 wp_enqueue_style( 'wppb-back-end-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end.css', false, PROFILE_BUILDER_VERSION );
458 }
459
460 if ( $hook == 'profile-builder_page_profile-builder-general-settings' )
461 wp_enqueue_script( 'wppb-manage-fields-live-change', WPPB_PLUGIN_URL . 'assets/js/jquery-email-confirmation.js', array(), PROFILE_BUILDER_VERSION, true );
462
463 if( ($hook == 'profile-builder_page_profile-builder-add-ons' ) ||
464 ($hook == 'admin_page_profile-builder-pms-promo' ) ) {
465 wp_enqueue_script('wppb-add-ons', WPPB_PLUGIN_URL . 'assets/js/jquery-pb-add-ons.js', array(), PROFILE_BUILDER_VERSION, true);
466 wp_enqueue_style( 'thickbox' );
467 wp_enqueue_script( 'thickbox' );
468 }
469
470 if ( $hook == 'profile-builder_page_profile-builder-dashboard' )
471 wp_enqueue_script( 'jquery-pb-dashboard', WPPB_PLUGIN_URL . 'assets/js/jquery-pb-dashboard.js', array(), PROFILE_BUILDER_VERSION, true );
472
473 if ( isset( $_GET['post_type'] ) || isset( $_GET['post'] ) ){
474 if ( isset( $_GET['post_type'] ) )
475 $post_type = sanitize_text_field( $_GET['post_type'] );
476
477 elseif ( isset( $_GET['post'] ) )
478 $post_type = get_post_type( absint( $_GET['post'] ) );
479
480 if ( ( 'wppb-epf-cpt' == $post_type ) || ( 'wppb-rf-cpt' == $post_type ) || ( 'wppb-ul-cpt' == $post_type ) ){
481 wp_enqueue_style( 'wppb-back-end-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end.css', false, PROFILE_BUILDER_VERSION );
482 wp_enqueue_script( 'wppb-epf-rf', WPPB_PLUGIN_URL . 'assets/js/jquery-epf-rf.js', array(), PROFILE_BUILDER_VERSION, true );
483 }
484 else if( 'wppb-roles-editor' == $post_type ){
485 wp_enqueue_style( 'wppb-back-end-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end.css', array(), PROFILE_BUILDER_VERSION );
486 }
487 }
488 else if ( isset( $_GET['page'] ) ) {
489 wp_enqueue_style( 'wppb-back-end-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end.css', array(), PROFILE_BUILDER_VERSION );
490 }
491
492 if ( $hook == 'user-edit.php' ) {
493 wp_enqueue_style( 'wppb-back-end-edit-user-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end-edit-user.css', array(), PROFILE_BUILDER_VERSION );
494 }
495
496 wp_enqueue_script( 'wppb-sitewide', WPPB_PLUGIN_URL . 'assets/js/jquery-pb-sitewide.js', array(), PROFILE_BUILDER_VERSION, true );
497 wp_localize_script( 'wppb-sitewide', 'wppbDeactivationData', array(
498 'deactivationReasonNonce' => wp_create_nonce( 'wppb_deactivation_reason' ),
499 'deactivationReasonRequired' => __( 'Please select a reason before deactivating.', 'profile-builder' ),
500 'deactivationReasonInput' => __( 'Please complete the required field before deactivating.', 'profile-builder' ),
501 'deactivationReasonSaveError' => __( 'We could not save your feedback. Please try again.', 'profile-builder' ),
502 ) );
503
504 wp_enqueue_style( 'wppb-serial-notice-css', WPPB_PLUGIN_URL . 'assets/css/serial-notice.css', false, PROFILE_BUILDER_VERSION );
505 }
506 add_action( 'admin_enqueue_scripts', 'wppb_print_cpt_script', 9 );
507
508 /**
509 * Highlight the settings page under Profile Builder in the admin menu for these pages
510 */
511 //add add_action( "admin_footer-$hook", "wppb_make_setting_menu_item_highlighted" ); for other pages that don't have a parent
512 add_action( "admin_footer-profile-builder_page_profile-builder-private-website", "wppb_make_setting_menu_item_highlighted" );
513 add_action( "admin_footer-profile-builder_page_profile-builder-admin-bar-settings", "wppb_make_setting_menu_item_highlighted" );
514 add_action( "admin_footer-profile-builder_page_profile-builder-content_restriction", "wppb_make_setting_menu_item_highlighted" );
515 add_action( "admin_footer-profile-builder_page_admin-email-customizer", "wppb_make_setting_menu_item_highlighted" );
516 add_action( "admin_footer-profile-builder_page_user-email-customizer", "wppb_make_setting_menu_item_highlighted" );
517 add_action( "admin_footer-profile-builder_page_profile-builder-toolbox-settings", "wppb_make_setting_menu_item_highlighted" );
518 add_action( "admin_footer-profile-builder_page_profile-builder-two-factor-authentication", "wppb_make_setting_menu_item_highlighted" );
519 function wppb_make_setting_menu_item_highlighted(){
520 echo'<script type="text/javascript">
521 jQuery(document).ready( function($) {
522 $("#toplevel_page_profile-builder").addClass("current wp-has-current-submenu wp-menu-open");
523 $("a[href=\'admin.php?page=profile-builder-general-settings\']").closest("li").addClass("current");
524 });
525 </script>';
526 }
527
528
529 //the function used to overwrite the avatar across the wp installation
530 function wppb_changeDefaultAvatar( $avatar, $id_or_email, $size, $default, $alt ){
531 /* Get user info. */
532 if(is_object($id_or_email)){
533 $my_user_id = $id_or_email->user_id;
534
535 if ($id_or_email instanceof WP_User){
536 $my_user_id = $id_or_email->ID;
537 }
538
539 }elseif(is_numeric($id_or_email)){
540 $my_user_id = $id_or_email;
541
542 }elseif(!is_integer($id_or_email)){
543 $user_info = get_user_by( 'email', $id_or_email );
544 $my_user_id = ( is_object( $user_info ) ? $user_info->ID : '' );
545 }else
546 $my_user_id = $id_or_email;
547
548 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
549 if ( $wppb_manage_fields != 'not_found' ){
550 foreach( $wppb_manage_fields as $value ){
551 if ( $value['field'] == 'Avatar'){
552 $avatar_field = $value;
553 }
554 }
555 }
556
557 /* for multisite if we don't have an avatar try to get it from the main blog */
558 if( is_multisite() && empty( $avatar_field ) ){
559 switch_to_blog(1);
560 $wppb_switched_blog = true;
561 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
562 if ( $wppb_manage_fields != 'not_found' ){
563 foreach( $wppb_manage_fields as $value ){
564 if ( $value['field'] == 'Avatar'){
565 $avatar_field = $value;
566 }
567 }
568 }
569 }
570
571 if ( !empty( $avatar_field ) ){
572
573 $customUserAvatar = get_user_meta( $my_user_id, Wordpress_Creation_Kit_PB::wck_generate_slug( $avatar_field['meta-name'] ), true );
574 if( !empty( $customUserAvatar ) ){
575 if( is_numeric( $customUserAvatar ) ){
576 $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'wppb-avatar-size-'.$size );
577
578 if( is_array( $img_attr ) ){
579 if( $img_attr[3] === false ){
580 $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'thumbnail' );
581 $avatar = "<img alt='{$alt}' src='{$img_attr[0]}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
582 }
583 else
584 $avatar = "<img alt='{$alt}' src='{$img_attr[0]}' class='avatar avatar-{$size} photo avatar-default' height='{$img_attr[2]}' width='{$img_attr[1]}' />";
585 }
586 }
587 else {
588 $customUserAvatar = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'], true);
589 $customUserAvatarRelativePath = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'] . '_relative_path', true);
590
591 if ((($customUserAvatar != '') || ($customUserAvatar != null)) && file_exists($customUserAvatarRelativePath)) {
592 $avatar = "<img alt='{$alt}' src='{$customUserAvatar}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
593 }
594 }
595 }
596
597 }
598
599 /* if we switched the blog restore it */
600 if( is_multisite() && !empty( $wppb_switched_blog ) && $wppb_switched_blog )
601 restore_current_blog();
602
603 return $avatar;
604 }
605 add_filter( 'get_avatar', 'wppb_changeDefaultAvatar', 21, 5 );
606
607
608 //the function used to overwrite the avatar across the wp installation
609 function wppb_changeDefaultAvatarUrl( $url, $id_or_email, $args ){
610 /* Get user info. */
611 if(is_object($id_or_email)){
612 $my_user_id = $id_or_email->user_id;
613
614 if ($id_or_email instanceof WP_User){
615 $my_user_id = $id_or_email->ID;
616 }
617
618 }elseif(is_numeric($id_or_email)){
619 $my_user_id = $id_or_email;
620
621 }elseif(!is_integer($id_or_email)){
622 $user_info = get_user_by( 'email', $id_or_email );
623 $my_user_id = ( is_object( $user_info ) ? $user_info->ID : '' );
624 }else
625 $my_user_id = $id_or_email;
626
627 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
628 if ( $wppb_manage_fields != 'not_found' ){
629 foreach( $wppb_manage_fields as $value ){
630 if ( $value['field'] == 'Avatar'){
631 $avatar_field = $value;
632 }
633 }
634 }
635
636 /* for multisite if we don't have an avatar try to get it from the main blog */
637 if( is_multisite() && empty( $avatar_field ) ){
638 switch_to_blog(1);
639 $wppb_switched_blog = true;
640 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
641 if ( $wppb_manage_fields != 'not_found' ){
642 foreach( $wppb_manage_fields as $value ){
643 if ( $value['field'] == 'Avatar'){
644 $avatar_field = $value;
645 }
646 }
647 }
648 }
649
650 $avatar_url = $url;
651
652 if ( !empty( $avatar_field ) ){
653
654 $customUserAvatar = get_user_meta( $my_user_id, Wordpress_Creation_Kit_PB::wck_generate_slug( $avatar_field['meta-name'] ), true );
655 if( !empty( $customUserAvatar ) ){
656 if( is_numeric( $customUserAvatar ) ){
657 if( $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'wppb-avatar-size-'.$args['size'] ) ) {
658 if ( $img_attr[3] === false ) {
659 $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'thumbnail' );
660 }
661 $avatar_url = $img_attr[0];
662 }
663 }
664 else {
665 $customUserAvatar = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'], true);
666 $customUserAvatarRelativePath = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'] . '_relative_path', true);
667
668 if ((($customUserAvatar != '') || ($customUserAvatar != null)) && file_exists($customUserAvatarRelativePath)) {
669 $avatar_url = $customUserAvatar;
670 }
671 }
672 }
673
674 }
675
676 /* if we switched the blog restore it */
677 if( is_multisite() && !empty( $wppb_switched_blog ) && $wppb_switched_blog )
678 restore_current_blog();
679
680 return $avatar_url;
681 }
682 add_filter( 'get_avatar_url', 'wppb_changeDefaultAvatarUrl', 21, 5 );
683
684
685 //the function used to resize the avatar image; the new function uses a user ID as parameter to make pages load faster
686 function wppb_resize_avatar( $userID, $userlisting_size = null, $userlisting_crop = null ){
687 // include the admin image API
688 require_once( ABSPATH . '/wp-admin/includes/image.php' );
689
690 // retrieve first a list of all the current custom fields
691 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
692 if ( $wppb_manage_fields != 'not_found' ){
693 foreach( $wppb_manage_fields as $value ){
694 if ( $value['field'] == 'Avatar'){
695 $avatar_field = $value;
696 }
697 }
698 }
699
700 /* for multisite if we don't have an avatar try to get it from the main blog */
701 if( is_multisite() && empty( $avatar_field ) ){
702 switch_to_blog(1);
703 $wppb_switched_blog = true;
704 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
705 if ( $wppb_manage_fields != 'not_found' ){
706 foreach( $wppb_manage_fields as $value ){
707 if ( $value['field'] == 'Avatar'){
708 $avatar_field = $value;
709 }
710 }
711 }
712 }
713
714
715 if ( !empty( $avatar_field ) ){
716
717 // retrieve width and height of the image
718 $width = $height = '';
719
720 //this checks if it only has 1 component
721 if ( is_numeric( $avatar_field['avatar-size'] ) ){
722 $width = $height = $avatar_field['avatar-size'];
723
724 }else{
725 //this checks if the entered value has 2 components
726 $sentValue = explode( ',', $avatar_field['avatar-size'] );
727 $width = $sentValue[0];
728 $height = $sentValue[1];
729 }
730
731 $width = ( !empty( $userlisting_size ) ? $userlisting_size : $width );
732 $height = ( !empty( $userlisting_size ) ? $userlisting_size : $height );
733
734 if( !strpos( get_user_meta( $userID, 'resized_avatar_'.$avatar_field['id'], true ), $width . 'x' . $height ) ) {
735 // retrieve the original image (in original size)
736 $avatar_directory_path = get_user_meta( $userID, 'avatar_directory_path_'.$avatar_field['id'], true );
737
738 $image = wp_get_image_editor( $avatar_directory_path );
739 if ( !is_wp_error( $image ) ) {
740 do_action( 'wppb_before_avatar_resizing', $image, $userID, Wordpress_Creation_Kit_PB::wck_generate_slug( $avatar_field['meta-name'] ), $avatar_field['avatar-size'] );
741
742 $crop = apply_filters( 'wppb_avatar_crop_resize', ( !empty( $userlisting_crop ) ? $userlisting_crop : false ) );
743
744 $resize = $image->resize( $width, $height, $crop );
745
746 if ($resize !== FALSE) {
747 do_action( 'wppb_avatar_resizing', $image, $resize );
748
749 $fileType = apply_filters( 'wppb_resized_file_extension', 'png' );
750
751 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
752
753 //create file(name); both with directory and url
754 $fileName_dir = $image->generate_filename( NULL, $wp_upload_array['basedir'].'/profile_builder/avatars/', $fileType );
755
756 if ( PHP_OS == "WIN32" || PHP_OS == "WINNT" )
757 $fileName_dir = str_replace( '\\', '/', $fileName_dir );
758
759 $fileName_url = str_replace( str_replace( '\\', '/', $wp_upload_array['basedir'] ), $wp_upload_array['baseurl'], $fileName_dir );
760
761 //save the newly created (resized) avatar on the disc
762 $saved_image = $image->save( $fileName_dir );
763
764 if ( !is_wp_error( $saved_image ) ) {
765 /* the image save sometimes doesn't save with the desired extension so we need to see with what extension it saved it with and
766 if it differs replace the extension in the path and url that we save as meta */
767 $validate_saved_image = wp_check_filetype_and_ext( $saved_image['path'], $saved_image['path'] );
768 $ext = substr( $fileName_dir,strrpos( $fileName_dir, '.', -1 ), strlen($fileName_dir) );
769 if( !empty( $validate_saved_image['ext'] ) && $validate_saved_image['ext'] != $ext ){
770 $fileName_url = str_replace( $ext, '.'.$validate_saved_image['ext'], $fileName_url );
771 $fileName_dir = str_replace( $ext, '.'.$validate_saved_image['ext'], $fileName_dir );
772 }
773
774 update_user_meta( $userID, 'resized_avatar_'.$avatar_field['id'], $fileName_url );
775 update_user_meta( $userID, 'resized_avatar_'.$avatar_field['id'].'_relative_path', $fileName_dir );
776
777 do_action( 'wppb_after_avatar_resizing', $image, $fileName_dir, $fileName_url );
778 }
779 }
780 }
781 }
782 }
783
784 /* if we switched the blog restore it */
785 if( is_multisite() && !empty( $wppb_switched_blog ) && $wppb_switched_blog )
786 restore_current_blog();
787
788 }
789
790
791 // add a hook to delete the user from the _signups table if either the email confirmation is activated, or it is a wpmu installation
792 function wppb_delete_user_from_signups_table($user_id) {
793 global $wpdb;
794
795 $user = get_userdata( $user_id );
796
797 if ( empty( $user ) ) {
798 return;
799 }
800
801 // Delete signup rows by both email and login so activated entries do not remain orphaned in the signups table
802 // - the signup row can preserve the originally submitted username, while the actual WP user_login may be regenerated from the submitted email address on activation
803 // - the signup row can also preserve the email address used at registration time, while the actual WP user_email may later change after activation
804 // - deleting by both keys covers both mismatch cases and keeps stale signups rows from blocking future registrations or other flows
805 if ( is_multisite() ) {
806 $wpdb->delete( $wpdb->signups, array( 'user_email' => $user->user_email ), array( '%s' ) );
807 $wpdb->delete( $wpdb->signups, array( 'user_login' => $user->user_login ), array( '%s' ) );
808 } else {
809 $table_name = $wpdb->prefix . 'signups';
810 $val = $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name ) );
811 if ( $val ) {
812 $wpdb->delete( $table_name, array( 'user_email' => $user->user_email ), array( '%s' ) );
813 $wpdb->delete( $table_name, array( 'user_login' => $user->user_login ), array( '%s' ) );
814 }
815 }
816 }
817
818 $wppb_generalSettings = get_option( 'wppb_general_settings' );
819 if ( !empty( $wppb_generalSettings['emailConfirmation'] ) && ( $wppb_generalSettings['emailConfirmation'] == 'yes' ) ) {
820 if( is_multisite() )
821 add_action( 'wpmu_delete_user', 'wppb_delete_user_from_signups_table' );
822 else
823 add_action('delete_user', 'wppb_delete_user_from_signups_table');
824 }
825
826
827
828 // This function offers compatibility with the all in one event calendar plugin
829 function wppb_aioec_compatibility(){
830
831 wp_deregister_script( 'jquery.tools-form');
832 }
833 add_action('admin_print_styles-users_page_ProfileBuilderOptionsAndSettings', 'wppb_aioec_compatibility');
834
835
836 function wppb_user_meta_exists( $id, $meta_name ){
837 global $wpdb;
838
839 return apply_filters( 'wppb_user_meta_exists_meta_name', $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $id, $meta_name ) ), $id, $meta_name );
840 }
841
842
843 // function to check if there is a need to add the http:// prefix
844 function wppb_check_missing_http( $redirectLink ) {
845 return preg_match( '#^(?:[a-z\d]+(?:-+[a-z\d]+)*\.)+[a-z]+(?::\d+)?(?:/|$)#i', $redirectLink );
846 }
847
848 //function that adds missing http to a link
849 function wppb_add_missing_http( $link ){
850 $http = '';
851 if ( wppb_check_missing_http( $link ) ) { //if missing http(s)
852 $http = 'http';
853 if ((isset($_SERVER["HTTPS"])) && ($_SERVER["HTTPS"] == "on"))
854 $http .= "s";
855 $http .= "://";
856 }
857
858 return $http . $link;
859 }
860
861
862 //function to output the password strength checker on frontend forms
863 function wppb_password_strength_checker_html(){
864 $wppb_generalSettings = get_option( 'wppb_general_settings' );
865 if( !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
866 $password_strength = '<span id="pass-strength-result">'.__('Strength indicator', 'profile-builder' ).'</span>
867 <input type="hidden" value="" name="wppb_password_strength" id="wppb_password_strength"/>';
868 return $password_strength;
869 }
870 return '';
871 }
872
873 //function to check password length check
874 function wppb_check_password_length( $password ){
875 $wppb_generalSettings = get_option( 'wppb_general_settings' );
876 if( !empty( $wppb_generalSettings['minimum_password_length'] ) ){
877 if( strlen( $password ) < $wppb_generalSettings['minimum_password_length'] ){
878 return true;
879 }
880 else
881 return false;
882 }
883 return false;
884 }
885
886 //function to check password strength
887 function wppb_check_password_strength(){
888 $wppb_generalSettings = get_option( 'wppb_general_settings' );
889 if( isset( $_POST['wppb_password_strength'] ) && sanitize_text_field( $_POST['wppb_password_strength'] ) != '' && !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
890 $wppb_password_strength = sanitize_text_field( $_POST['wppb_password_strength'] );
891 $password_strength_array = array( 'short' => 0, 'bad' => 1, 'good' => 2, 'strong' => 3 );
892 $password_strength_text = array( 'short' => __( 'Very Weak', 'profile-builder' ), 'bad' => __( 'Weak', 'profile-builder' ), 'good' => __( 'Medium', 'profile-builder' ), 'strong' => __( 'Strong', 'profile-builder' ) );
893 if( $password_strength_array[$wppb_password_strength] < $password_strength_array[$wppb_generalSettings['minimum_password_strength']] ){
894 return $password_strength_text[$wppb_generalSettings['minimum_password_strength']];
895 }
896 else
897 return false;
898 }
899 return false;
900 }
901
902 /* function to output password length requirements text */
903 function wppb_password_length_text(){
904 $wppb_generalSettings = get_option( 'wppb_general_settings' );
905 if( !empty( $wppb_generalSettings['minimum_password_length'] ) ){
906 return sprintf(__('Minimum length of %d characters.', 'profile-builder'), $wppb_generalSettings['minimum_password_length']);
907 }
908 return '';
909 }
910
911 /* function to output password strength requirements text */
912 function wppb_password_strength_description() {
913 $wppb_generalSettings = get_option( 'wppb_general_settings' );
914
915 if( ! empty( $wppb_generalSettings['minimum_password_strength'] ) ) {
916 $password_strength_text = array( 'short' => __( 'Very Weak', 'profile-builder' ), 'bad' => __( 'Weak', 'profile-builder' ), 'good' => __( 'Medium', 'profile-builder' ), 'strong' => __( 'Strong', 'profile-builder' ) );
917 $password_strength_description = '<br>'. sprintf( __( 'The password must have a minimum strength of %s', 'profile-builder' ), $password_strength_text[$wppb_generalSettings['minimum_password_strength']] );
918
919 return $password_strength_description;
920 } else {
921 return '';
922 }
923 }
924
925 /**
926 * Include password strength check scripts on frontend where we have shortcodes present
927 */
928 add_action( 'elementor/frontend/after_enqueue_scripts', 'wppb_enqueue_password_strength_check' );
929 add_action( 'wp_footer', 'wppb_enqueue_password_strength_check' );
930 function wppb_enqueue_password_strength_check() {
931 global $wppb_shortcode_on_front;
932 if( $wppb_shortcode_on_front ){
933 $wppb_generalSettings = get_option( 'wppb_general_settings' );
934 if( !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
935 wp_enqueue_script( 'password-strength-meter' );
936 }
937 }
938 }
939 add_action( 'wp_footer', 'wppb_password_strength_check', 102 );
940 function wppb_password_strength_check(){
941 global $wppb_shortcode_on_front;
942 if( $wppb_shortcode_on_front ){
943 $wppb_generalSettings = get_option( 'wppb_general_settings' );
944 if( !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
945 ?>
946 <script type="text/javascript">
947 function check_pass_strength(form) {
948 var pass1 = jQuery(form).find('#passw1').val(),
949 pass2 = jQuery(form).find('#passw2').val(),
950 strength;
951
952 jQuery(form).find('#pass-strength-result').removeClass('short bad good strong');
953 if (!pass1) {
954 jQuery(form).find('#pass-strength-result').html(pwsL10n.empty);
955 return;
956 }
957 <?php
958 global $wp_version;
959
960 if ( version_compare( $wp_version, "4.9.0", ">=" ) ) {
961 ?>
962 strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputDisallowedList(), pass2 );
963 <?php
964 }
965 else {
966 ?>
967 strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputBlacklist(), pass2);
968 <?php
969 }
970 ?>
971 switch ( strength ) {
972 case 2:
973 jQuery(form).find('#pass-strength-result').addClass('bad').html( pwsL10n.bad );
974 jQuery(form).find('#wppb_password_strength').val('bad');
975 break;
976 case 3:
977 jQuery(form).find('#pass-strength-result').addClass('good').html( pwsL10n.good );
978 jQuery(form).find('#wppb_password_strength').val('good');
979 break;
980 case 4:
981 jQuery(form).find('#pass-strength-result').addClass('strong').html( pwsL10n.strong );
982 jQuery(form).find('#wppb_password_strength').val('strong');
983 break;
984 case 5:
985 jQuery(form).find('#pass-strength-result').addClass('short').html( pwsL10n.mismatch );
986 jQuery(form).find('#wppb_password_strength').val('short');
987 break;
988 default:
989 jQuery(form).find('#pass-strength-result').addClass('short').html( pwsL10n['short'] );
990 jQuery(form).find('#wppb_password_strength').val('short');
991 }
992 }
993 jQuery( document ).ready( function() {
994 // Binding to trigger checkPasswordStrength
995 jQuery('.wppb-user-forms').each(function() {
996 var form = this;
997 jQuery(form).find('#passw1, #passw2').val('').on('keyup change', function() {
998 check_pass_strength(form);
999 });
1000 jQuery(form).find('#pass-strength-result').show();
1001 });
1002 });
1003 </script>
1004 <?php
1005 }
1006 }
1007 }
1008
1009 /**
1010 * Include toggle password visibility script on frontend where we have shortcodes present
1011 */
1012 function wppb_password_visibility_toggle_html(){
1013 if( apply_filters( 'wppb_show_password_visibility_toggle', false ) ){
1014 return '
1015 <button type="button" class="wppb-toggle-pw wppb-show-pw hide-if-no-js" data-toggle="0" aria-label="Show password" tabindex="-1">
1016 <img src="'.WPPB_PLUGIN_URL.'/assets/images/eye-outline.svg" title="'. esc_html__( 'Show password', 'profile-builder' ) .'" width="20px" height="20px" />
1017 </button>';
1018 }
1019 return '';
1020 }
1021
1022 /**
1023 * Include toggle password visibility script on frontend where we have shortcodes present
1024 */
1025 add_action( 'elementor/frontend/after_enqueue_scripts', 'wppb_enqueue_password_visibility_toggle' );
1026 add_action( 'wp_footer', 'wppb_enqueue_password_visibility_toggle' );
1027 function wppb_enqueue_password_visibility_toggle() {
1028 global $wppb_shortcode_on_front;
1029 static $enqueued = false;
1030 if( $wppb_shortcode_on_front && apply_filters( 'wppb_show_password_visibility_toggle', false ) && !$enqueued ){
1031
1032 //load jQuery if needed
1033 if( !wp_script_is('jquery', 'done') ){
1034 wp_print_scripts('jquery');
1035 }
1036
1037 ?>
1038 <script type="text/javascript">
1039 jQuery( document ).ready( function() {
1040
1041 jQuery( "button.wppb-toggle-pw" ).on( "click", wppb_password_visibility_toggle );
1042
1043 jQuery( 'button.wppb-toggle-pw' ).each( function( index, toggle ){
1044
1045 var parent = jQuery( toggle ).parent()
1046
1047 if( parent.hasClass( 'wppb-form-field' ) && jQuery( '.wppb-description-delimiter', parent ) ){
1048
1049 jQuery( toggle ).css( 'top', parseInt( jQuery( toggle ).css('top') ) - ( jQuery( '.wppb-description-delimiter', parent ).outerHeight() / 2 ) )
1050
1051 }
1052
1053 })
1054
1055 });
1056 function wppb_password_visibility_toggle() {
1057 var button = jQuery( this );
1058 var container = button.closest( '.wppb-password-field-container' );
1059 var input = container.find( 'input' ).first();
1060 var icon = button.find( 'img' );
1061
1062 if ( ! input.length ) {
1063 return;
1064 }
1065
1066 if ( "password" === input.attr( "type" ) ) {
1067 input.attr( "type", "text" );
1068 button.removeClass( "wppb-show-pw" ).addClass( "wppb-hide-pw" );
1069 icon.attr( "src", "<?php echo esc_attr( WPPB_PLUGIN_URL ); ?>/assets/images/eye-off-outline.svg" );
1070 icon.attr( "title", "<?php esc_html_e( 'Hide password', 'profile-builder' ); ?>" );
1071 } else {
1072 input.attr( "type", "password" );
1073 button.removeClass( "wppb-hide-pw" ).addClass( "wppb-show-pw" );
1074 icon.attr( "src", "<?php echo esc_attr( WPPB_PLUGIN_URL ); ?>/assets/images/eye-outline.svg" );
1075 icon.attr( "title", "<?php esc_html_e( 'Show password', 'profile-builder' ); ?>" );
1076 }
1077 }
1078 </script>
1079 <?php
1080 $enqueued = true;
1081 }
1082 }
1083
1084 /**
1085 * Create functions for repeating error messages in front-end forms
1086 */
1087 function wppb_required_field_error($field_title='') {
1088 $required_error = apply_filters('wppb_required_error' , __('This field is required','profile-builder') , $field_title);
1089
1090 return $required_error;
1091
1092 }
1093
1094 /**
1095 * Function that returns a certain field (from manage_fields) by a given id or meta_name
1096 */
1097 function wppb_get_field_by_id_or_meta( $id_or_meta ){
1098
1099 $id = 0;
1100 $meta = '';
1101
1102 if ( is_numeric($id_or_meta) )
1103 $id = $id_or_meta;
1104 else
1105 $meta = $id_or_meta;
1106
1107 $fields = get_option('wppb_manage_fields', 'not_found');
1108
1109 if ($fields != 'not_found') {
1110
1111 foreach ($fields as $key => $field) {
1112 if ( (!empty($id)) && ($field['id'] == $id) )
1113 return $field;
1114 if ( (!empty($meta)) && ($field['meta-name'] == $meta) )
1115 return $field;
1116 }
1117
1118 }
1119
1120 return '';
1121 }
1122
1123
1124 /* Function for displaying reCAPTCHA error on Login and Recover Password forms */
1125 function wppb_recaptcha_field_error($field_title='') {
1126
1127 $recaptcha_field = wppb_get_recaptcha_field();
1128
1129 if( $recaptcha_field['recaptcha-type'] === 'v2' ) {
1130 $recaptcha_error = apply_filters('wppb_recaptcha_error' , __('Please enter a (valid) reCAPTCHA value','profile-builder') , $field_title);
1131 } else {
1132 $recaptcha_error = apply_filters('wppb_recaptcha_error' , __('reCaptcha could not be verified. Please try again.','profile-builder') , $field_title);
1133 }
1134
1135 return $recaptcha_error;
1136
1137 }
1138 /* Function for displaying phone field error */
1139 function wppb_phone_field_error( $field_title = '' ) {
1140 $phone_error = apply_filters( 'wppb_phone_error' , __( 'Incorrect phone number', 'profile-builder' ) , $field_title );
1141
1142 return $phone_error;
1143 }
1144
1145 /* Create a wrapper function for get_query_var */
1146 function wppb_get_query_var( $varname ){
1147 //if we want the userlisting on front page ( is_front_page() ) apparently the way we register query vars does not work so we will just use a simple GET var
1148 if($varname === 'username' && !get_query_var( $varname ) && isset($_GET['wppb_username'])){
1149 return apply_filters( 'wppb_get_query_var_'.$varname, sanitize_user( $_GET['wppb_username'] ) );
1150 }
1151
1152 return apply_filters( 'wppb_get_query_var_'.$varname, get_query_var( $varname ) );
1153 }
1154
1155 /** @param string|array $key Query key or keys to remove.
1156 */
1157 function wppb_remove_query_arg( $key, $url = false ){
1158 $striped_url = remove_query_arg( $key, $url);
1159
1160 //treat page key on frontpage case where it is transformed into a pretty permalink
1161 if( ( is_array($key) && in_array('wppb_page', $key) ) || ( !is_array($key) && 'wppb_page' === $key ) ){
1162 $striped_url = preg_replace( '/\/'.wppb_get_users_pagination_slug().'\/\d+\//', '/', $striped_url );
1163 $striped_url = preg_replace( '/\/'.wppb_get_users_pagination_slug().'\//', '/', $striped_url );
1164 }
1165
1166 return $striped_url;
1167 }
1168
1169 //function that generates tha pagination slug for userlisting
1170 function wppb_get_users_pagination_slug(){
1171 return apply_filters('wppb_users_pagination_slug', 'users-page');
1172 }
1173
1174 /* Filter the "Save Changes" button text, to make it translatable */
1175 function wppb_change_save_changes_button($value){
1176 $value = __('Save Changes','profile-builder');
1177 return $value;
1178 }
1179 add_filter( 'wck_save_changes_button', 'wppb_change_save_changes_button', 10, 2);
1180
1181 /* Filter the "Cancel" button text, to make it translatable */
1182 function wppb_change_cancel_button($value){
1183 $value = __('Cancel','profile-builder');
1184 return $value;
1185 }
1186 add_filter( 'wck_cancel_button', 'wppb_change_cancel_button', 10, 2);
1187
1188 /* ilter the "Delete" button text, to make it translatable */
1189 function wppb_change_delete_button($value){
1190 $value = __('Delete','profile-builder');
1191 return $value;
1192 }
1193 add_filter( 'wck_delete_button', 'wppb_change_delete_button', 10, 2);
1194
1195 /*Filter the "Edit" button text, to make it translatable*/
1196 function wppb_change_edit_button($value){
1197 $value = __('Edit','profile-builder');
1198 return $value;
1199 }
1200 add_filter( 'wck_edit_button', 'wppb_change_edit_button', 10, 2);
1201
1202 /*Filter the User Listing, Register Forms and Edit Profile forms metabox header content, to make it translatable*/
1203 function wppb_change_metabox_content_header(){
1204 return '<thead><tr><th class="wck-number">#</th><th class="wck-content">'. __( 'Content', 'profile-builder' ) .'</th><th class="wck-edit">'. __( 'Edit', 'profile-builder' ) .'</th><th class="wck-delete">'. __( 'Delete', 'profile-builder' ) .'</th></tr></thead>';
1205 }
1206 add_filter('wck_metabox_content_header_wppb_ul_page_settings', 'wppb_change_metabox_content_header', 1);
1207 add_filter('wck_metabox_content_header_wppb_rf_page_settings', 'wppb_change_metabox_content_header', 1);
1208 add_filter('wck_metabox_content_header_wppb_epf_page_settings', 'wppb_change_metabox_content_header', 1);
1209
1210
1211 /*Filter default WordPress notices ("Post published. Post updated."), add post type name for User Listing, Registration Forms and Edit Profile Forms*/
1212 function wppb_change_default_post_updated_messages($messages){
1213 global $post;
1214 $post_type = get_post_type($post->ID);
1215 $object = get_post_type_object($post_type);
1216
1217 if ( ($post_type == 'wppb-rf-cpt')||($post_type == 'wppb-epf-cpt')||($post_type == 'wppb-ul-cpt') ){
1218 $messages['post'][1] = $object->labels->name . ' updated.';
1219 $messages['post'][6] = $object->labels->name . ' published.';
1220 }
1221 return $messages;
1222 }
1223 add_filter('post_updated_messages','wppb_change_default_post_updated_messages', 2);
1224
1225
1226 /* for meta-names with spaces in them PHP converts the space to underline in the $_POST */
1227 function wppb_handle_meta_name( $meta_name ){
1228 $meta_name = trim( $meta_name );
1229 $meta_name = str_replace( ' ', '_', $meta_name );
1230 $meta_name = str_replace( '.', '_', $meta_name );
1231 return $meta_name;
1232 }
1233
1234 /**
1235 * Function that checks if a field type exists in a form
1236 * @return bool
1237 */
1238 function wppb_field_exists_in_form( $field_type, $form_args ){
1239 if( !empty( $form_args ) && !empty( $form_args['form_fields'] ) ){
1240 foreach( $form_args['form_fields'] as $field ){
1241 if( $field['field'] === $field_type ){
1242 return true;
1243 }
1244 }
1245 }
1246
1247 return false;
1248 }
1249
1250 // change User Registered date and time according to timezone selected in WordPress settings
1251 function wppb_get_register_date() {
1252
1253 $time_format = "Y-m-d G:i:s";
1254 $wppb_get_date = date_i18n( $time_format, false, true );
1255
1256 if( apply_filters( 'wppb_return_local_time_for_register', false ) ){
1257 $wppb_get_date = date_i18n( $time_format );
1258 }
1259
1260 return $wppb_get_date;
1261 }
1262
1263 /**
1264 * Function that ads the gmt offset from the general settings to a unix timestamp
1265 * @param $timestamp
1266 * @return mixed
1267 */
1268 function wppb_add_gmt_offset( $timestamp ) {
1269 if( apply_filters( 'wppb_add_gmt_offset', true ) ){
1270 $timestamp = $timestamp + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
1271 }
1272 return $timestamp;
1273 }
1274
1275 /**
1276 * Add HTML tag 'required' to fields
1277 *
1278 * Add HTML tag 'required' for each field if the field is required. For browsers that don't support this HTML tag, we will still have the fallback.
1279 * Field type 'Checkbox' is explicitly excluded because there is no HTML support to check if at least one option is selected.
1280 * Other fields excluded are Avatar, Upload, Heading, ReCaptcha, WYSIWYG, Map.
1281 *
1282 * @since
1283 *
1284 * @param string $extra_attributes Extra attributes attached to the field HTML tag.
1285 * @param array $field Field description.
1286 * @return string $extra_attributes
1287 */
1288 function wppb_add_html_tag_required_to_fields( $extra_attributes, $field, $form_location = '' ) {
1289 if ( isset( $field['required'] ) && $field['required'] == 'Yes' ){
1290
1291 if( !in_array( $field['field'], array( 'Checkbox', 'Default - Password', 'Default - Repeat Password', 'GDPR Communication Preferences' ) ) && $form_location == 'edit_profile' )
1292 $extra_attributes .= ' required ';
1293
1294 }
1295 return $extra_attributes;
1296 }
1297 add_filter( 'wppb_extra_attribute', 'wppb_add_html_tag_required_to_fields', 10, 3 );
1298
1299 /**
1300 * Add HTML tag 'required' to WooCommerce fields
1301 *
1302 * Add HTML tag 'required' for each WooCommerce field if the field is required. For browsers that don't support this HTML tag, we will still have the fallback.
1303 * Does not work on 'State / County' field, if it becomes required later depending on the Country Value
1304 *
1305 * @since
1306 *
1307 * @param string $extra_attributes Extra attributes attached to the field HTML tag.
1308 * @param array $field Field description.
1309 * @return string $extra_attributes
1310 */
1311 function wppb_add_html_tag_required_to_woo_fields( $extra_attributes, $field ) {
1312 if ( isset( $field['required'] ) && $field['required'] == 'Yes' ){
1313 $extra_attributes .= ' required ';
1314 }
1315 return $extra_attributes;
1316 }
1317 add_filter( 'wppb_woo_extra_attribute', 'wppb_add_html_tag_required_to_woo_fields', 10, 2 );
1318
1319
1320 /**
1321 * Add jQuery script to remove required attribute for hidden fields
1322 *
1323 * If a field is hidden dynamically via conditional fields or WooSync 'Ship to a different address' checkbox, then the required field needs to be removed.
1324 * If a field is made visible again, add the required field back again.
1325 *
1326 * @since
1327 *
1328 * @param string $extra_attributes Extra attributes attached to the field HTML tag.
1329 * @param array $field Field description.
1330 * @return string $extra_attributes
1331 */
1332 function wppb_manage_required_attribute() {
1333 global $wppb_shortcode_on_front;
1334 if ($wppb_shortcode_on_front) {
1335 //check if jquery has been loaded yet because we need it at this point
1336 // we're checking if it's not admin because it brakes elementor otherwise.
1337 if( !wp_script_is('jquery', 'done') && !is_admin() ){
1338 wp_print_scripts('jquery');
1339 }
1340 ?>
1341 <script type="text/javascript">
1342 jQuery(document).on( "wppbAddRequiredAttributeEvent", wppbAddRequired );
1343 function wppbAddRequired(event) {
1344 var element = wppbEventTargetRequiredElement( event.target );
1345 if( jQuery( element ).attr( "wppb_cf_temprequired" ) ){
1346 jQuery( element ).removeAttr( "wppb_cf_temprequired" );
1347 jQuery( element ).attr( "required", "required" );
1348 }
1349 }
1350
1351 jQuery(document).on( "wppbRemoveRequiredAttributeEvent", wppbRemoveRequired );
1352 function wppbRemoveRequired(event) {
1353 var element = wppbEventTargetRequiredElement( event.target );
1354 if ( jQuery( element ).attr( "required" ) ) {
1355 jQuery( element ).removeAttr( "required" );
1356 jQuery( element ).attr( "wppb_cf_temprequired", "wppb_cf_temprequired" );
1357 }
1358 }
1359
1360 jQuery(document).on( "wppbToggleRequiredAttributeEvent", wppbToggleRequired );
1361 function wppbToggleRequired(event) {
1362 if ( jQuery( event.target ).attr( "required" ) ) {
1363 jQuery( event.target ).removeAttr( "required" );
1364 jQuery( event.target ).attr( "wppb_cf_temprequired", "wppb_cf_temprequired" );
1365 }else if( jQuery( event.target ).attr( "wppb_cf_temprequired" ) ){
1366 jQuery( event.target ).removeAttr( "wppb_cf_temprequired" );
1367 jQuery( event.target ).attr( "required", "required" );
1368 }
1369 }
1370
1371 function wppbEventTargetRequiredElement( htmlElement ){
1372 if ( htmlElement.nodeName == "OPTION" ){
1373 // <option> is the target element, so we need to get the parent <select>, in order to apply the required attribute
1374 return htmlElement.parentElement;
1375 }else{
1376 return htmlElement;
1377 }
1378 }
1379
1380 </script>
1381 <?php
1382 }
1383 }
1384 add_action( 'wp_footer', 'wppb_manage_required_attribute', 99 );
1385
1386 function wpbb_specify_blog_details_on_signup_email( $message, $user_email, $user, $activation_key, $registration_page_url, $meta, $from_name, $context ){
1387 $meta = unserialize($meta);
1388
1389 if ( is_multisite() && isset( $meta['wppb_create_new_site_checkbox'] ) && $meta['wppb_create_new_site_checkbox'] == 'yes' ) {
1390 $blog_details = wpmu_validate_blog_signup( $meta['wppb_blog_url'], $meta['wppb_blog_title'] );
1391
1392 if ( empty($blog_details['errors']->errors['blogname']) && empty($blog_details['errors']->errors['blog_title'])) {
1393 $blog_path = $blog_details['domain'] . $blog_details['path'];
1394 $message .= __( '<br><br>Also, you will be able to visit your site at ', 'profile-builder' ) . '<a href="' . $blog_path . '">' . $blog_path . '</a>.';
1395 }
1396 }
1397 return $message;
1398 }
1399 add_filter( 'wppb_signup_user_notification_email_content', 'wpbb_specify_blog_details_on_signup_email', 5, 8 );
1400
1401 function wpbb_specify_blog_details_on_registration_email( $user_message_content, $email, $password, $user_message_subject, $context ){
1402
1403 if ( is_multisite() ) {
1404 $user = get_user_by( 'email', $email );
1405 $blog_path = wppb_get_blog_url_of_user_id( $user->ID );
1406 if ( ! empty ( $blog_path ) ) {
1407 $user_message_content .= __( '<br><br>You can visit your site at ', 'profile-builder' ) . '<a href="' . $blog_path . '">' . $blog_path . '</a>.';
1408 }
1409 }
1410 return $user_message_content;
1411
1412 }
1413 add_filter( 'wppb_register_user_email_message_without_admin_approval', 'wpbb_specify_blog_details_on_registration_email', 5, 5 );
1414 add_filter( 'wppb_register_user_email_message_with_admin_approval', 'wpbb_specify_blog_details_on_registration_email', 5, 5 );
1415
1416
1417 function wppb_get_blog_url_of_user_id( $user_id, $ignore_privacy = true ){
1418 $blog_id = get_user_meta( $user_id, 'primary_blog', true );
1419 if ( is_multisite() && !empty( $blog_id ) ){
1420 $blog_details = get_blog_details( $blog_id );
1421 if ( $ignore_privacy || $blog_details->public ) {
1422 return $blog_details->domain . $blog_details->path;
1423 }
1424 }
1425 return '';
1426 }
1427
1428 function wppb_can_users_signup_blog(){
1429 if ( ! is_multisite() )
1430 return false;
1431 global $wpdb;
1432 $current_site = get_current_site();
1433 $sitemeta_options_query = $wpdb->prepare( "SELECT meta_value FROM {$wpdb->sitemeta} WHERE meta_key = 'registration' AND site_id = %d", $current_site->id );
1434 $network_options_meta = $wpdb->get_results( $sitemeta_options_query );
1435
1436 if ( $network_options_meta[0]->meta_value == 'all' ){
1437 return true;
1438 }
1439 return false;
1440 }
1441
1442 /**
1443 * Function that handle redirect URL
1444 *
1445 * @param string $redirect_priority - it can be normal or top priority
1446 * @param string $redirect_type - type of the redirect
1447 * @param null|string $redirect_url - redirect URL if already set
1448 * @param null|string|object $user - username, user email or user data
1449 * @param null|string $user_role - user role
1450 *
1451 * @return null|string $redirect_url
1452 */
1453 function wppb_get_redirect_url( $redirect_priority, $redirect_type, $redirect_url = NULL, $user = NULL, $user_role = NULL ) {
1454 if( empty($redirect_priority) ) {
1455 $redirect_priority = 'normal';
1456 }
1457
1458 $versions = array( 'Profile Builder Pro', 'Profile Builder Agency', 'Profile Builder Unlimited', 'Profile Builder Dev' );
1459
1460 if( in_array( PROFILE_BUILDER, $versions ) ) {
1461 $wppb_module_settings = get_option( 'wppb_module_settings' );
1462
1463 if( isset( $wppb_module_settings['wppb_customRedirect'] ) && $wppb_module_settings['wppb_customRedirect'] == 'show' && $redirect_priority != 'top' && function_exists( 'wppb_custom_redirect_url' ) ) {
1464 $redirect_url = wppb_custom_redirect_url( $redirect_type, $redirect_url, $user, $user_role );
1465 }
1466 }
1467
1468 if( ! empty( $redirect_url ) ) {
1469 $redirect_url = ( wppb_check_missing_http( $redirect_url ) ? wppb_add_missing_http( $redirect_url ) : $redirect_url );
1470 }
1471
1472 return $redirect_url;
1473 }
1474
1475 /**
1476 * Bind an autologin nonce to a user ID server-side (one-time use).
1477 *
1478 * @param int $user_id User ID to log in.
1479 * @param string $nonce Autologin nonce.
1480 */
1481 function wppb_store_autologin_user( $user_id, $nonce ) {
1482 $user_id = absint( $user_id );
1483
1484 if ( ! $user_id || empty( $nonce ) ) {
1485 return;
1486 }
1487
1488 set_transient( 'wppb_autologin_' . md5( $nonce ), $user_id, 2 * MINUTE_IN_SECONDS );
1489 }
1490
1491 /**
1492 * Resolve the user bound to an autologin nonce.
1493 *
1494 * @param string $nonce Autologin nonce.
1495 * @param bool $consume Whether to delete the stored mapping.
1496 *
1497 * @return int User ID, or 0 when not found.
1498 */
1499 function wppb_get_autologin_user_id( $nonce, $consume = true ) {
1500 if ( empty( $nonce ) ) {
1501 return 0;
1502 }
1503
1504 $key = 'wppb_autologin_' . md5( $nonce );
1505 $user_id = absint( get_transient( $key ) );
1506
1507 if ( $user_id && $consume ) {
1508 delete_transient( $key );
1509 }
1510
1511 return $user_id;
1512 }
1513
1514 /**
1515 * Build autologin query args for a user.
1516 *
1517 * @param int $user_id User ID to log in.
1518 *
1519 * @return array Query args for add_query_arg().
1520 */
1521 function wppb_get_autologin_query_args( $user_id ) {
1522 $user_id = absint( $user_id );
1523 $nonce = wp_create_nonce( 'autologin-' . $user_id . '-' . (int) ( time() / 60 ) );
1524
1525 wppb_store_autologin_user( $user_id, $nonce );
1526
1527 return array(
1528 'autologin' => 'true',
1529 '_wpnonce' => $nonce,
1530 );
1531 }
1532
1533 /**
1534 * Verify an autologin nonce for the given user ID.
1535 *
1536 * @param string $nonce Autologin nonce.
1537 * @param int $user_id User ID bound to the nonce.
1538 *
1539 * @return bool
1540 */
1541 function wppb_verify_autologin_nonce( $nonce, $user_id ) {
1542 $user_id = absint( $user_id );
1543
1544 if ( ! $user_id || empty( $nonce ) ) {
1545 return false;
1546 }
1547
1548 $nonce_action = 'autologin-' . $user_id . '-';
1549
1550 return wp_verify_nonce( $nonce, $nonce_action . (int) ( time() / 60 ) )
1551 || wp_verify_nonce( $nonce, $nonce_action . (int) ( time() / 60 - 1 ) );
1552 }
1553
1554 /**
1555 * Function that builds the redirect
1556 *
1557 * @param string $redirect_url - redirect URL
1558 * @param int $redirect_delay - redirect delay in seconds
1559 * @param null|string $redirect_type - the type of the redirect
1560 * @param null|array $form_args - form args if set
1561 *
1562 * @return string $redirect_message
1563 */
1564 function wppb_build_redirect( $redirect_url, $redirect_delay, $redirect_type = NULL, $form_args = NULL ) {
1565 if( isset( $redirect_type ) ) {
1566 $redirect_url = apply_filters( 'wppb_'. $redirect_type .'_redirect', $redirect_url );
1567 }
1568
1569 $redirect_message = '';
1570
1571 if( ! empty( $redirect_url ) ) {
1572 $redirect_url = ( wppb_check_missing_http( $redirect_url ) ? wppb_add_missing_http( $redirect_url ) : $redirect_url );
1573
1574 if( $redirect_delay == 0 ) {
1575 $redirect_message = '<meta http-equiv="Refresh" content="'. $redirect_delay .';url='. $redirect_url .'" />';
1576 } else {
1577 $redirect_url_href = apply_filters( 'wppb_redirect_url', '<a href="'. esc_url( $redirect_url ) .'">'. __( 'here', 'profile-builder' ) .'</a>', $redirect_url, $redirect_type, $form_args );
1578 $redirect_message = apply_filters( 'wppb_redirect_message_before_returning', '<p class="redirect_message">'. sprintf( wp_slash( __( 'You will soon be redirected automatically. If you see this page for more than %1$d seconds, please click %2$s.%3$s', 'profile-builder' ) ), $redirect_delay, $redirect_url_href, '<meta http-equiv="Refresh" content="'. $redirect_delay .';url='. $redirect_url .'" />' ) .'</p>', $redirect_url, $redirect_delay, $redirect_url_href, $redirect_type, $form_args );
1579 }
1580 }
1581
1582 return $redirect_message;
1583 }
1584
1585 /**
1586 * Function that strips the script tags from an input
1587 * @param $string
1588 * @return mixed
1589 */
1590 function wppb_sanitize_value( $string ){
1591 return preg_replace( '/<script\b[^>]*>(.*?)<\/script>/is', '', $string );
1592 }
1593
1594 /**
1595 * Function that receives a user role and returns its label.
1596 * Returns the original role if not found.
1597 *
1598 * @since v.2.7.1
1599 *
1600 * @param string $role
1601 *
1602 * @return string
1603 */
1604 function wppb_get_role_name($role){
1605 global $wp_roles;
1606
1607 if ( array_key_exists( $role, $wp_roles->role_names ) )
1608 return $wp_roles->role_names[$role];
1609
1610 return $role;
1611 }
1612
1613 /**
1614 * Function that receives a user role label and returns its slug.
1615 * Returns the original role label if not found.
1616 *
1617 * @since v.3.5.6
1618 *
1619 * @param string $role
1620 *
1621 * @return string
1622 */
1623 function wppb_get_role_slug($role) {
1624 global $wp_roles;
1625
1626 foreach ( $wp_roles->role_names as $slug => $label ) {
1627 if ( $label === $role) {
1628 return $slug;
1629 }
1630 }
1631
1632 return $role;
1633 }
1634
1635 /**
1636 * Functionality for Private Website start
1637 */
1638 add_action( 'template_redirect', 'wppb_private_website_functionality' );
1639 add_action( 'login_init', 'wppb_private_website_functionality', 1 );
1640 function wppb_private_website_functionality(){
1641 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1642 if( $wppb_private_website_settings != 'not_found' ){
1643 if( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ){
1644 if( !is_user_logged_in() ){
1645
1646 if( is_404() )
1647 return;
1648
1649 // force wp-login.php if you accidentally get locked out
1650 global $pagenow;
1651 if( $pagenow === 'wp-login.php' && ( isset( $_GET['wppb_force_wp_login'] ) || ( isset( $_SERVER['HTTP_REFERER'] ) && strpos( esc_url_raw( $_SERVER['HTTP_REFERER'] ), 'wppb_force_wp_login=true' ) !== false ) || ( isset($_REQUEST['redirect_to']) && strpos( sanitize_text_field( $_REQUEST['redirect_to'] ), 'wppb_force_wp_login=true' ) !== false ) ) )
1652 return;
1653
1654 // bypass requests that enter the password of a password protected post
1655 if( $pagenow === 'wp-login.php' && isset( $_GET['action'] ) && $_GET['action'] == 'postpass' && isset( $_POST['post_password'] ) )
1656 return;
1657
1658 // go through paths first if they are set
1659 if( isset( $wppb_private_website_settings['allowed_paths'] ) && !empty( $wppb_private_website_settings['allowed_paths'] ) ){
1660 $allowed_paths = explode( "\r\n", $wppb_private_website_settings['allowed_paths'] );
1661 $parsed_url = wp_parse_url( wppb_curpageurl() );
1662 if( !empty( $parsed_url['path'] ) ) {
1663 $path = $parsed_url['path'];
1664
1665 foreach ($allowed_paths as $allowed_path) {
1666 if (strpos($allowed_path, '*') === false) {
1667 if (trim($path, "/") === trim($allowed_path, "/")) {
1668 return;
1669 }
1670 } else {
1671 if (strpos(ltrim($path, "/"), trailingslashit(trim(str_replace('*', '', $allowed_path), "/"))) === 0) {
1672 return;
1673 }
1674 }
1675 }
1676 }
1677 }
1678
1679 if( isset( $wppb_private_website_settings['allowed_query_strings'] ) && !empty( $wppb_private_website_settings['allowed_query_strings'] ) ){
1680 $allowed_query_strings = explode( "\r\n", $wppb_private_website_settings['allowed_query_strings'] );
1681 $parsed_url_parameters = wp_parse_url( wppb_curpageurl() );
1682
1683 if( !empty( $parsed_url_parameters['query'] ) ) {
1684 parse_str( $parsed_url_parameters['query'], $query_params );
1685
1686 foreach ( $allowed_query_strings as $allowed_query ) {
1687 if ( array_key_exists( $allowed_query, $query_params ) ) {
1688 return;
1689 }
1690 }
1691 }
1692 }
1693
1694 if( isset( $wppb_private_website_settings['allowed_pages'] ) )
1695 $allowed_pages = $wppb_private_website_settings['allowed_pages'];
1696 else{
1697 $allowed_pages = array();
1698 }
1699
1700 $redirect_to_id = $wppb_private_website_settings['redirect_to'];
1701 if( !empty( $redirect_to_id ) ) {
1702 $redirect_url = get_permalink($redirect_to_id);
1703 $allowed_pages[] = $redirect_to_id;
1704 }
1705 else {
1706 //don't redirect if we are already on the wp-login.php page
1707 if( $pagenow === 'wp-login.php' ){
1708 return;
1709 }
1710 else
1711 $redirect_url = wp_login_url(wppb_curpageurl());
1712 }
1713
1714 $redirect_url = apply_filters( 'wppb_private_website_redirect_url', $redirect_url );
1715 $allowed_pages = apply_filters( 'wppb_private_website_allowed_pages', $allowed_pages );
1716
1717 global $post;
1718 if( !isset( $post ) || ( isset($post) && $post->ID == 0 ) ) {//added || ( isset($post) && $post->ID == 0 ) for a compatibility issue with BuddyPress where the ID was 0 for a page
1719 if( function_exists('url_to_postid') ) {
1720 $post_id = url_to_postid(wppb_curpageurl());//try to get the id from the actual url
1721 }else {
1722 $post_id = 0;
1723 }
1724 }
1725 else
1726 $post_id = $post->ID;
1727
1728 if( ( !in_array( $post_id, $allowed_pages ) && $redirect_url !== strtok( wppb_curpageurl(), '?' ) ) || is_search() ){
1729 nocache_headers();
1730 if( apply_filters( 'wppb_private_website_redirect_add_query_args', true ) && current_filter() == 'template_redirect' ) {
1731 $redirect_url = add_query_arg( 'wppb_referer_url', urlencode( esc_url( wppb_curpageurl() ) ), $redirect_url );
1732 }
1733 wp_safe_redirect( $redirect_url );
1734 exit;
1735 }
1736
1737 }
1738 }
1739 }
1740
1741 }
1742
1743 //add classes on the body to know if we have enabled private website options
1744 add_filter( 'body_class', 'wppb_private_website_body_classes' );
1745 function wppb_private_website_body_classes( $classes ){
1746 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1747 if( $wppb_private_website_settings != 'not_found' ) {
1748 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1749 if (!is_user_logged_in()) {
1750 $classes[] = 'wppb-private-website';
1751 if ( !empty( $wppb_private_website_settings['hide_menus'] ) && $wppb_private_website_settings['hide_menus'] == 'yes' ) {
1752 $classes[] = 'wppb-private-website-hide-menus';
1753 }
1754 }
1755 }
1756 }
1757
1758 return $classes;
1759 }
1760
1761
1762 /**
1763 * Disable RSS
1764 */
1765 add_action('do_feed', 'wppb_disable_feed', 1);
1766 add_action('do_feed_rdf', 'wppb_disable_feed', 1);
1767 add_action('do_feed_rss', 'wppb_disable_feed', 1);
1768 add_action('do_feed_rss2', 'wppb_disable_feed', 1);
1769 add_action('do_feed_atom', 'wppb_disable_feed', 1);
1770 add_action('do_feed_rss2_comments', 'wppb_disable_feed', 1);
1771 add_action('do_feed_atom_comments', 'wppb_disable_feed', 1);
1772 function wppb_disable_feed() {
1773 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1774 if( $wppb_private_website_settings != 'not_found' ) {
1775 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1776 if (!is_user_logged_in()) {
1777 wp_die( wp_kses_post( sprintf( __('No feed available,please visit our <a href="%s">homepage</a>!', 'profile-builder' ), get_bloginfo('url') ) ) );
1778 }
1779 }
1780 }
1781 }
1782
1783
1784 /**
1785 * Disable REST
1786 */
1787 //add_filter('rest_enabled', 'wppb_disable_rest'); // this is depracated
1788 add_filter('rest_jsonp_enabled', 'wppb_disable_rest');
1789 function wppb_disable_rest( $bool ){
1790 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1791 if( $wppb_private_website_settings != 'not_found' ) {
1792 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1793 if ( !isset( $wppb_private_website_settings[ 'disable_rest_api' ] ) || $wppb_private_website_settings[ 'disable_rest_api' ] !== 'yes' ) {
1794 return $bool;
1795 }
1796 if (!is_user_logged_in()) {
1797 return false;
1798 }
1799 }
1800 }
1801 return $bool;
1802 }
1803
1804 /* I should test this to not create any problems */
1805 add_filter('rest_authentication_errors', 'wppb_disable_rest_api_authentication', 10, 1 );
1806 function wppb_disable_rest_api_authentication($result) {
1807 if (!empty($result)) {
1808 return $result;
1809 }
1810
1811 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1812 if( $wppb_private_website_settings != 'not_found' ) {
1813 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1814 if ( !isset( $wppb_private_website_settings[ 'disable_rest_api' ] ) || $wppb_private_website_settings[ 'disable_rest_api' ] !== 'yes' ) {
1815 return $result;
1816 }
1817
1818 // THE EVENTS CALENDAR EXCEPTION
1819 // They do some rest API calls in the front-end for their event view but due to their usage, they are breaking the authenticated user
1820 // and WordPress thinks the user is not authenticated (is_user_logged_in() == false)
1821 // This makes things break for logged in users whe the Private Website + Rest API functionality is enabled
1822 // We are going to ignore requests that contain their nonces so we can exlude them from our restrictions
1823 if( isset( $_REQUEST['_tec_view_rest_nonce_primary'] ) || isset( $_REQUEST['_tec_view_rest_nonce_secondary'] ) )
1824 return $result;
1825
1826 if (!is_user_logged_in() && isset( $_SERVER['REQUEST_URI'] ) && $_SERVER['REQUEST_URI'] !== "/wp-json/jwt-auth/v1/token" && $_SERVER['REQUEST_URI'] !== "/wp-json/jwt-auth/v1/token/validate") {
1827 return new WP_Error('rest_not_logged_in', __( 'You are not currently logged in.', 'profile-builder' ), array('status' => 401));
1828 }
1829 }
1830 }
1831
1832 return $result;
1833 }
1834
1835 /**
1836 * We can hide all menu items
1837 */
1838 add_filter('wp_nav_menu', 'wppb_hide_menus');
1839 add_filter('wp_page_menu', 'wppb_hide_menus');
1840 function wppb_hide_menus( $menu ){
1841 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1842 if( $wppb_private_website_settings != 'not_found' ) {
1843 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1844 if ( !is_user_logged_in() && ( !empty($wppb_private_website_settings['hide_menus']) && $wppb_private_website_settings['hide_menus'] == 'yes' ) ) {
1845 return '';
1846 }
1847 }
1848 }
1849 return $menu;
1850 }
1851
1852 /**
1853 * Functionality for Private Website end
1854 */
1855
1856 /**
1857 * Functionality GDPR compliance start
1858 */
1859
1860 //hook into the wp export compatibility
1861 add_filter( 'wp_privacy_personal_data_exporters', 'wppb_register_profile_builder_wp_exporter', 10 );
1862 function wppb_register_profile_builder_wp_exporter( $exporters ) {
1863 $exporters['profile-builder'] = array(
1864 'exporter_friendly_name' => __( 'Profile Builder', 'profile-builder' ),
1865 'callback' => 'wppb_profile_builder_wp_exporter',
1866 );
1867 return $exporters;
1868 }
1869 /* function to add aour user meta to wp exporter */
1870 function wppb_profile_builder_wp_exporter( $email_address, $page = 1 ) {
1871
1872 $export_items = array();
1873
1874 $form_fields = get_option( 'wppb_manage_fields' );
1875
1876 if( !empty( $form_fields ) ) {
1877 $user = get_user_by( 'email', $email_address );
1878 if( $user ) {
1879
1880 $item_id = "user-meta-{$user->ID}";
1881 $group_id = 'user-meta';
1882 $group_label = __('User Meta' , 'profile-builder' );
1883 $data = array();
1884
1885 $all_meta_for_user = get_user_meta( $user->ID );
1886 if( !empty( $all_meta_for_user ) ) {
1887 foreach ($form_fields as $form_field) {
1888
1889 if (!empty($form_field['meta-name']) && strpos($form_field['field'], 'Default') === false) {
1890 $user_meta_value = $all_meta_for_user[$form_field['meta-name']][0];
1891 if( !empty( $user_meta_value ) ){
1892
1893
1894 $data[] = array(
1895 'name' => $form_field['field-title'],
1896 'value' => $user_meta_value
1897 );
1898 }
1899 }
1900 }
1901
1902 $export_items[] = array(
1903 'group_id' => $group_id,
1904 'group_label' => $group_label,
1905 'item_id' => $item_id,
1906 'data' => $data,
1907 );
1908
1909 }
1910 }
1911 }
1912
1913
1914 return array(
1915 'data' => $export_items,
1916 'done' => true,
1917 );
1918 }
1919
1920 /**
1921 * Hook to delete a user through the GDPR Delete button
1922 */
1923 add_action( 'template_redirect', 'wppb_gdpr_delete_user') ;
1924 function wppb_gdpr_delete_user() {
1925
1926 if( isset( $_GET['wppb_user'] ) && ! empty( $_GET['wppb_user'] ) ) {
1927 $edited_user_id = get_current_user_id();
1928 if ( ( ! is_multisite() && current_user_can( 'edit_users' ) ) || ( is_multisite() && current_user_can( 'manage_network' ) ) ) {
1929 $edited_user_id = absint( $_GET['wppb_user'] );
1930 }
1931
1932 if ( isset( $_REQUEST['wppb_action'] ) && $_REQUEST['wppb_action'] == 'wppb_delete_user' && isset( $_REQUEST['wppb_nonce'] ) && wp_verify_nonce( sanitize_text_field( $_REQUEST['wppb_nonce'] ), 'wppb-user-own-account-deletion' ) && isset( $_REQUEST['wppb_user'] ) && $edited_user_id == $_REQUEST['wppb_user'] ) {
1933 require_once( ABSPATH . 'wp-admin/includes/user.php' );
1934 $user = new WP_User( absint( $_REQUEST['wppb_user'] ) );
1935
1936 if ( ! empty( $user->roles ) ) {
1937 if ( ! in_array( 'administrator', $user->roles ) ) {
1938 wp_delete_user( absint( $_REQUEST['wppb_user'] ) );
1939
1940 do_action( 'wppb_gdpr_user_deleted', absint( $_REQUEST['wppb_user'] ) );
1941 }
1942 }
1943
1944 $args = array( 'wppb_user', 'wppb_action', 'wppb_nonce' );
1945 nocache_headers();
1946 wp_redirect( remove_query_arg( $args ) );
1947 }
1948 }
1949 }
1950
1951 /**
1952 * Function that removes user information from comments when the User Account is deleted using Edit Profile Form
1953 */
1954 function wppb_gdpr_remove_user_info_from_comments( $user_id ) {
1955 $user_comments = get_comments('user_id='.$user_id);
1956 foreach ( $user_comments as $comment ) {
1957 $comment_data = array();
1958 $comment_data['comment_ID'] = $comment->comment_ID;
1959 $comment_data['comment_author'] = '';
1960 $comment_data['comment_author_email'] = '';
1961 $comment_data['comment_author_url'] = '';
1962 wp_update_comment( $comment_data );
1963 }
1964 }
1965 add_action( 'wppb_gdpr_user_deleted', 'wppb_gdpr_remove_user_info_from_comments' );
1966
1967
1968 /**
1969 * Functionality GDPR compliance end
1970 */
1971
1972 /**
1973 * Function that checks if Admin Approval is enabled
1974 */
1975 function wppb_get_admin_approval_option_value(){
1976 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
1977 if( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists( WPPB_PAID_PLUGIN_DIR . '/features/admin-approval/admin-approval.php' ) && $wppb_general_settings != 'not_found' && !empty( $wppb_general_settings['adminApproval'] ) && $wppb_general_settings['adminApproval'] === 'yes' )
1978 return 'yes';
1979 else
1980 return 'no';
1981 }
1982
1983 /**
1984 * Function that checks if conditional fields feature exists
1985 * @return bool
1986 */
1987 function wppb_conditional_fields_exists(){
1988 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists( WPPB_PAID_PLUGIN_DIR . '/features/conditional-fields/conditional-fields.php' ) )
1989 return true;
1990 else
1991 return false;
1992 }
1993
1994 /**
1995 * Add support for [wppb-embed] shortcode inside userlisting as the default [embed] is weird and doesn't work outside the_content
1996 */
1997 add_shortcode('wppb-embed', 'wppb_embed');
1998 function wppb_embed($atts, $content){
1999 $atts = shortcode_atts( array(
2000 'width' => '',
2001 'height' => ''
2002 ), $atts, 'wppb-embed' );
2003
2004 global $wp_embed;
2005 if(empty($atts['width']) || empty($atts['height'])){
2006 $content = $wp_embed->run_shortcode('[embed]'.$content.'[/embed]');
2007 } else {
2008 $content = $wp_embed->run_shortcode('[embed width="'.esc_attr($atts['width']).'" height="'.esc_attr($atts['height']).'"]'.$content.'[/embed]');
2009 }
2010
2011 return $content;
2012 }
2013
2014 /**
2015 * Function to determine if an add-on is active
2016 */
2017
2018 function wppb_check_if_add_on_is_active( $slug ){
2019 //the old modules part
2020 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists(WPPB_PAID_PLUGIN_DIR . '/add-ons/add-ons.php')) {
2021 $wppb_module_settings = get_option('wppb_module_settings', 'not_found');
2022 if ($wppb_module_settings != 'not_found') {
2023 foreach ($wppb_module_settings as $add_on_slug => $status) {
2024 if ($slug == $add_on_slug) {
2025 if ($status === 'hide')
2026 return false;
2027 elseif ($status === 'show')
2028 return true;
2029 }
2030 }
2031 }
2032 }
2033
2034 //the free addons part
2035 $wppb_free_add_ons_settings = get_option( 'wppb_free_add_ons_settings', array() );
2036 if ( !empty( $wppb_free_add_ons_settings ) ){
2037 foreach( $wppb_free_add_ons_settings as $add_on_slug => $status ){
2038 if( $slug == $add_on_slug ){
2039 return $status;
2040 }
2041 }
2042 }
2043
2044 //the advanced addons part
2045 $wppb_advanced_add_ons_settings = get_option( 'wppb_advanced_add_ons_settings', array() );
2046 if ( !empty( $wppb_advanced_add_ons_settings ) ){
2047 foreach( $wppb_advanced_add_ons_settings as $add_on_slug => $status ){
2048 if( $slug == $add_on_slug ){
2049 return $status;
2050 }
2051 }
2052 }
2053
2054 return false;
2055 }
2056
2057 /**
2058 * Function that checks if Two-Factor Authentication is active
2059 */
2060
2061 function wppb_is_2fa_active(){
2062 $wppb_two_factor_authentication_settings = get_option( 'wppb_two_factor_authentication_settings', 'not_found' );
2063 if( isset( $wppb_two_factor_authentication_settings['enabled'] ) && $wppb_two_factor_authentication_settings['enabled'] === 'yes' ) {
2064 return true;
2065 }
2066
2067 return false;
2068 }
2069
2070 /**
2071 * Function that returns an array containing the User Listing names
2072 */
2073
2074 function wppb_get_userlisting_names(){
2075 $ul_names = array();
2076 $userlisting_posts = get_posts( array( 'posts_per_page' => -1, 'post_status' =>'publish', 'post_type' => 'wppb-ul-cpt', 'orderby' => 'post_date', 'order' => 'ASC' ) );
2077 if( !empty( $userlisting_posts ) ){
2078 foreach ( $userlisting_posts as $post ){
2079 $ul_names[ $post->post_name ] = $post->post_title;
2080 }
2081 }
2082 reset($ul_names);
2083 return $ul_names;
2084 }
2085