PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 3.16.3
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v3.16.3
4.0.3 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 All 341 releases
profile-builder / features / functions.php

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

2,006 lines 81.1 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 * Function that builds the redirect
1477 *
1478 * @param string $redirect_url - redirect URL
1479 * @param int $redirect_delay - redirect delay in seconds
1480 * @param null|string $redirect_type - the type of the redirect
1481 * @param null|array $form_args - form args if set
1482 *
1483 * @return string $redirect_message
1484 */
1485 function wppb_build_redirect( $redirect_url, $redirect_delay, $redirect_type = NULL, $form_args = NULL ) {
1486 if( isset( $redirect_type ) ) {
1487 $redirect_url = apply_filters( 'wppb_'. $redirect_type .'_redirect', $redirect_url );
1488 }
1489
1490 $redirect_message = '';
1491
1492 if( ! empty( $redirect_url ) ) {
1493 $redirect_url = ( wppb_check_missing_http( $redirect_url ) ? wppb_add_missing_http( $redirect_url ) : $redirect_url );
1494
1495 if( $redirect_delay == 0 ) {
1496 $redirect_message = '<meta http-equiv="Refresh" content="'. $redirect_delay .';url='. $redirect_url .'" />';
1497 } else {
1498 $redirect_url_href = apply_filters( 'wppb_redirect_url', '<a href="'. esc_url( $redirect_url ) .'">'. __( 'here', 'profile-builder' ) .'</a>', $redirect_url, $redirect_type, $form_args );
1499 $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 );
1500 }
1501 }
1502
1503 return $redirect_message;
1504 }
1505
1506 /**
1507 * Function that strips the script tags from an input
1508 * @param $string
1509 * @return mixed
1510 */
1511 function wppb_sanitize_value( $string ){
1512 return preg_replace( '/<script\b[^>]*>(.*?)<\/script>/is', '', $string );
1513 }
1514
1515 /**
1516 * Function that receives a user role and returns its label.
1517 * Returns the original role if not found.
1518 *
1519 * @since v.2.7.1
1520 *
1521 * @param string $role
1522 *
1523 * @return string
1524 */
1525 function wppb_get_role_name($role){
1526 global $wp_roles;
1527
1528 if ( array_key_exists( $role, $wp_roles->role_names ) )
1529 return $wp_roles->role_names[$role];
1530
1531 return $role;
1532 }
1533
1534 /**
1535 * Function that receives a user role label and returns its slug.
1536 * Returns the original role label if not found.
1537 *
1538 * @since v.3.5.6
1539 *
1540 * @param string $role
1541 *
1542 * @return string
1543 */
1544 function wppb_get_role_slug($role) {
1545 global $wp_roles;
1546
1547 foreach ( $wp_roles->role_names as $slug => $label ) {
1548 if ( $label === $role) {
1549 return $slug;
1550 }
1551 }
1552
1553 return $role;
1554 }
1555
1556 /**
1557 * Functionality for Private Website start
1558 */
1559 add_action( 'template_redirect', 'wppb_private_website_functionality' );
1560 add_action( 'login_init', 'wppb_private_website_functionality', 1 );
1561 function wppb_private_website_functionality(){
1562 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1563 if( $wppb_private_website_settings != 'not_found' ){
1564 if( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ){
1565 if( !is_user_logged_in() ){
1566
1567 if( is_404() )
1568 return;
1569
1570 // force wp-login.php if you accidentally get locked out
1571 global $pagenow;
1572 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 ) ) )
1573 return;
1574
1575 // bypass requests that enter the password of a password protected post
1576 if( $pagenow === 'wp-login.php' && isset( $_GET['action'] ) && $_GET['action'] == 'postpass' && isset( $_POST['post_password'] ) )
1577 return;
1578
1579 // go through paths first if they are set
1580 if( isset( $wppb_private_website_settings['allowed_paths'] ) && !empty( $wppb_private_website_settings['allowed_paths'] ) ){
1581 $allowed_paths = explode( "\r\n", $wppb_private_website_settings['allowed_paths'] );
1582 $parsed_url = wp_parse_url( wppb_curpageurl() );
1583 if( !empty( $parsed_url['path'] ) ) {
1584 $path = $parsed_url['path'];
1585
1586 foreach ($allowed_paths as $allowed_path) {
1587 if (strpos($allowed_path, '*') === false) {
1588 if (trim($path, "/") === trim($allowed_path, "/")) {
1589 return;
1590 }
1591 } else {
1592 if (strpos(ltrim($path, "/"), trailingslashit(trim(str_replace('*', '', $allowed_path), "/"))) === 0) {
1593 return;
1594 }
1595 }
1596 }
1597 }
1598 }
1599
1600 if( isset( $wppb_private_website_settings['allowed_query_strings'] ) && !empty( $wppb_private_website_settings['allowed_query_strings'] ) ){
1601 $allowed_query_strings = explode( "\r\n", $wppb_private_website_settings['allowed_query_strings'] );
1602 $parsed_url_parameters = wp_parse_url( wppb_curpageurl() );
1603
1604 if( !empty( $parsed_url_parameters['query'] ) ) {
1605 parse_str( $parsed_url_parameters['query'], $query_params );
1606
1607 foreach ( $allowed_query_strings as $allowed_query ) {
1608 if ( array_key_exists( $allowed_query, $query_params ) ) {
1609 return;
1610 }
1611 }
1612 }
1613 }
1614
1615 if( isset( $wppb_private_website_settings['allowed_pages'] ) )
1616 $allowed_pages = $wppb_private_website_settings['allowed_pages'];
1617 else{
1618 $allowed_pages = array();
1619 }
1620
1621 $redirect_to_id = $wppb_private_website_settings['redirect_to'];
1622 if( !empty( $redirect_to_id ) ) {
1623 $redirect_url = get_permalink($redirect_to_id);
1624 $allowed_pages[] = $redirect_to_id;
1625 }
1626 else {
1627 //don't redirect if we are already on the wp-login.php page
1628 if( $pagenow === 'wp-login.php' ){
1629 return;
1630 }
1631 else
1632 $redirect_url = wp_login_url(wppb_curpageurl());
1633 }
1634
1635 $redirect_url = apply_filters( 'wppb_private_website_redirect_url', $redirect_url );
1636 $allowed_pages = apply_filters( 'wppb_private_website_allowed_pages', $allowed_pages );
1637
1638 global $post;
1639 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
1640 if( function_exists('url_to_postid') ) {
1641 $post_id = url_to_postid(wppb_curpageurl());//try to get the id from the actual url
1642 }else {
1643 $post_id = 0;
1644 }
1645 }
1646 else
1647 $post_id = $post->ID;
1648
1649 if( ( !in_array( $post_id, $allowed_pages ) && $redirect_url !== strtok( wppb_curpageurl(), '?' ) ) || is_search() ){
1650 nocache_headers();
1651 if( apply_filters( 'wppb_private_website_redirect_add_query_args', true ) && current_filter() == 'template_redirect' ) {
1652 $redirect_url = add_query_arg( 'wppb_referer_url', urlencode( esc_url( wppb_curpageurl() ) ), $redirect_url );
1653 }
1654 wp_safe_redirect( $redirect_url );
1655 exit;
1656 }
1657
1658 }
1659 }
1660 }
1661
1662 }
1663
1664 //add classes on the body to know if we have enabled private website options
1665 add_filter( 'body_class', 'wppb_private_website_body_classes' );
1666 function wppb_private_website_body_classes( $classes ){
1667 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1668 if( $wppb_private_website_settings != 'not_found' ) {
1669 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1670 if (!is_user_logged_in()) {
1671 $classes[] = 'wppb-private-website';
1672 if ( !empty( $wppb_private_website_settings['hide_menus'] ) && $wppb_private_website_settings['hide_menus'] == 'yes' ) {
1673 $classes[] = 'wppb-private-website-hide-menus';
1674 }
1675 }
1676 }
1677 }
1678
1679 return $classes;
1680 }
1681
1682
1683 /**
1684 * Disable RSS
1685 */
1686 add_action('do_feed', 'wppb_disable_feed', 1);
1687 add_action('do_feed_rdf', 'wppb_disable_feed', 1);
1688 add_action('do_feed_rss', 'wppb_disable_feed', 1);
1689 add_action('do_feed_rss2', 'wppb_disable_feed', 1);
1690 add_action('do_feed_atom', 'wppb_disable_feed', 1);
1691 add_action('do_feed_rss2_comments', 'wppb_disable_feed', 1);
1692 add_action('do_feed_atom_comments', 'wppb_disable_feed', 1);
1693 function wppb_disable_feed() {
1694 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1695 if( $wppb_private_website_settings != 'not_found' ) {
1696 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1697 if (!is_user_logged_in()) {
1698 wp_die( wp_kses_post( sprintf( __('No feed available,please visit our <a href="%s">homepage</a>!', 'profile-builder' ), get_bloginfo('url') ) ) );
1699 }
1700 }
1701 }
1702 }
1703
1704
1705 /**
1706 * Disable REST
1707 */
1708 //add_filter('rest_enabled', 'wppb_disable_rest'); // this is depracated
1709 add_filter('rest_jsonp_enabled', 'wppb_disable_rest');
1710 function wppb_disable_rest( $bool ){
1711 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1712 if( $wppb_private_website_settings != 'not_found' ) {
1713 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1714 if ( !isset( $wppb_private_website_settings[ 'disable_rest_api' ] ) || $wppb_private_website_settings[ 'disable_rest_api' ] !== 'yes' ) {
1715 return $bool;
1716 }
1717 if (!is_user_logged_in()) {
1718 return false;
1719 }
1720 }
1721 }
1722 return $bool;
1723 }
1724
1725 /* I should test this to not create any problems */
1726 add_filter('rest_authentication_errors', 'wppb_disable_rest_api_authentication', 10, 1 );
1727 function wppb_disable_rest_api_authentication($result) {
1728 if (!empty($result)) {
1729 return $result;
1730 }
1731
1732 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1733 if( $wppb_private_website_settings != 'not_found' ) {
1734 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1735 if ( !isset( $wppb_private_website_settings[ 'disable_rest_api' ] ) || $wppb_private_website_settings[ 'disable_rest_api' ] !== 'yes' ) {
1736 return $result;
1737 }
1738
1739 // THE EVENTS CALENDAR EXCEPTION
1740 // 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
1741 // and WordPress thinks the user is not authenticated (is_user_logged_in() == false)
1742 // This makes things break for logged in users whe the Private Website + Rest API functionality is enabled
1743 // We are going to ignore requests that contain their nonces so we can exlude them from our restrictions
1744 if( isset( $_REQUEST['_tec_view_rest_nonce_primary'] ) || isset( $_REQUEST['_tec_view_rest_nonce_secondary'] ) )
1745 return $result;
1746
1747 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") {
1748 return new WP_Error('rest_not_logged_in', __( 'You are not currently logged in.', 'profile-builder' ), array('status' => 401));
1749 }
1750 }
1751 }
1752
1753 return $result;
1754 }
1755
1756 /**
1757 * We can hide all menu items
1758 */
1759 add_filter('wp_nav_menu', 'wppb_hide_menus');
1760 add_filter('wp_page_menu', 'wppb_hide_menus');
1761 function wppb_hide_menus( $menu ){
1762 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1763 if( $wppb_private_website_settings != 'not_found' ) {
1764 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1765 if ( !is_user_logged_in() && ( !empty($wppb_private_website_settings['hide_menus']) && $wppb_private_website_settings['hide_menus'] == 'yes' ) ) {
1766 return '';
1767 }
1768 }
1769 }
1770 return $menu;
1771 }
1772
1773 /**
1774 * Functionality for Private Website end
1775 */
1776
1777 /**
1778 * Functionality GDPR compliance start
1779 */
1780
1781 //hook into the wp export compatibility
1782 add_filter( 'wp_privacy_personal_data_exporters', 'wppb_register_profile_builder_wp_exporter', 10 );
1783 function wppb_register_profile_builder_wp_exporter( $exporters ) {
1784 $exporters['profile-builder'] = array(
1785 'exporter_friendly_name' => __( 'Profile Builder', 'profile-builder' ),
1786 'callback' => 'wppb_profile_builder_wp_exporter',
1787 );
1788 return $exporters;
1789 }
1790 /* function to add aour user meta to wp exporter */
1791 function wppb_profile_builder_wp_exporter( $email_address, $page = 1 ) {
1792
1793 $export_items = array();
1794
1795 $form_fields = get_option( 'wppb_manage_fields' );
1796
1797 if( !empty( $form_fields ) ) {
1798 $user = get_user_by( 'email', $email_address );
1799 if( $user ) {
1800
1801 $item_id = "user-meta-{$user->ID}";
1802 $group_id = 'user-meta';
1803 $group_label = __('User Meta' , 'profile-builder' );
1804 $data = array();
1805
1806 $all_meta_for_user = get_user_meta( $user->ID );
1807 if( !empty( $all_meta_for_user ) ) {
1808 foreach ($form_fields as $form_field) {
1809
1810 if (!empty($form_field['meta-name']) && strpos($form_field['field'], 'Default') === false) {
1811 $user_meta_value = $all_meta_for_user[$form_field['meta-name']][0];
1812 if( !empty( $user_meta_value ) ){
1813
1814
1815 $data[] = array(
1816 'name' => $form_field['field-title'],
1817 'value' => $user_meta_value
1818 );
1819 }
1820 }
1821 }
1822
1823 $export_items[] = array(
1824 'group_id' => $group_id,
1825 'group_label' => $group_label,
1826 'item_id' => $item_id,
1827 'data' => $data,
1828 );
1829
1830 }
1831 }
1832 }
1833
1834
1835 return array(
1836 'data' => $export_items,
1837 'done' => true,
1838 );
1839 }
1840
1841 /**
1842 * Hook to delete a user through the GDPR Delete button
1843 */
1844 add_action( 'template_redirect', 'wppb_gdpr_delete_user') ;
1845 function wppb_gdpr_delete_user() {
1846
1847 if( isset( $_GET['wppb_user'] ) && ! empty( $_GET['wppb_user'] ) ) {
1848 $edited_user_id = get_current_user_id();
1849 if ( ( ! is_multisite() && current_user_can( 'edit_users' ) ) || ( is_multisite() && current_user_can( 'manage_network' ) ) ) {
1850 $edited_user_id = absint( $_GET['wppb_user'] );
1851 }
1852
1853 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'] ) {
1854 require_once( ABSPATH . 'wp-admin/includes/user.php' );
1855 $user = new WP_User( absint( $_REQUEST['wppb_user'] ) );
1856
1857 if ( ! empty( $user->roles ) ) {
1858 if ( ! in_array( 'administrator', $user->roles ) ) {
1859 wp_delete_user( absint( $_REQUEST['wppb_user'] ) );
1860
1861 do_action( 'wppb_gdpr_user_deleted', absint( $_REQUEST['wppb_user'] ) );
1862 }
1863 }
1864
1865 $args = array( 'wppb_user', 'wppb_action', 'wppb_nonce' );
1866 nocache_headers();
1867 wp_redirect( remove_query_arg( $args ) );
1868 }
1869 }
1870 }
1871
1872 /**
1873 * Function that removes user information from comments when the User Account is deleted using Edit Profile Form
1874 */
1875 function wppb_gdpr_remove_user_info_from_comments( $user_id ) {
1876 $user_comments = get_comments('user_id='.$user_id);
1877 foreach ( $user_comments as $comment ) {
1878 $comment_data = array();
1879 $comment_data['comment_ID'] = $comment->comment_ID;
1880 $comment_data['comment_author'] = '';
1881 $comment_data['comment_author_email'] = '';
1882 $comment_data['comment_author_url'] = '';
1883 wp_update_comment( $comment_data );
1884 }
1885 }
1886 add_action( 'wppb_gdpr_user_deleted', 'wppb_gdpr_remove_user_info_from_comments' );
1887
1888
1889 /**
1890 * Functionality GDPR compliance end
1891 */
1892
1893 /**
1894 * Function that checks if Admin Approval is enabled
1895 */
1896 function wppb_get_admin_approval_option_value(){
1897 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
1898 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' )
1899 return 'yes';
1900 else
1901 return 'no';
1902 }
1903
1904 /**
1905 * Function that checks if conditional fields feature exists
1906 * @return bool
1907 */
1908 function wppb_conditional_fields_exists(){
1909 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists( WPPB_PAID_PLUGIN_DIR . '/features/conditional-fields/conditional-fields.php' ) )
1910 return true;
1911 else
1912 return false;
1913 }
1914
1915 /**
1916 * Add support for [wppb-embed] shortcode inside userlisting as the default [embed] is weird and doesn't work outside the_content
1917 */
1918 add_shortcode('wppb-embed', 'wppb_embed');
1919 function wppb_embed($atts, $content){
1920 $atts = shortcode_atts( array(
1921 'width' => '',
1922 'height' => ''
1923 ), $atts, 'wppb-embed' );
1924
1925 global $wp_embed;
1926 if(empty($atts['width']) || empty($atts['height'])){
1927 $content = $wp_embed->run_shortcode('[embed]'.$content.'[/embed]');
1928 } else {
1929 $content = $wp_embed->run_shortcode('[embed width="'.esc_attr($atts['width']).'" height="'.esc_attr($atts['height']).'"]'.$content.'[/embed]');
1930 }
1931
1932 return $content;
1933 }
1934
1935 /**
1936 * Function to determine if an add-on is active
1937 */
1938
1939 function wppb_check_if_add_on_is_active( $slug ){
1940 //the old modules part
1941 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists(WPPB_PAID_PLUGIN_DIR . '/add-ons/add-ons.php')) {
1942 $wppb_module_settings = get_option('wppb_module_settings', 'not_found');
1943 if ($wppb_module_settings != 'not_found') {
1944 foreach ($wppb_module_settings as $add_on_slug => $status) {
1945 if ($slug == $add_on_slug) {
1946 if ($status === 'hide')
1947 return false;
1948 elseif ($status === 'show')
1949 return true;
1950 }
1951 }
1952 }
1953 }
1954
1955 //the free addons part
1956 $wppb_free_add_ons_settings = get_option( 'wppb_free_add_ons_settings', array() );
1957 if ( !empty( $wppb_free_add_ons_settings ) ){
1958 foreach( $wppb_free_add_ons_settings as $add_on_slug => $status ){
1959 if( $slug == $add_on_slug ){
1960 return $status;
1961 }
1962 }
1963 }
1964
1965 //the advanced addons part
1966 $wppb_advanced_add_ons_settings = get_option( 'wppb_advanced_add_ons_settings', array() );
1967 if ( !empty( $wppb_advanced_add_ons_settings ) ){
1968 foreach( $wppb_advanced_add_ons_settings as $add_on_slug => $status ){
1969 if( $slug == $add_on_slug ){
1970 return $status;
1971 }
1972 }
1973 }
1974
1975 return false;
1976 }
1977
1978 /**
1979 * Function that checks if Two-Factor Authentication is active
1980 */
1981
1982 function wppb_is_2fa_active(){
1983 $wppb_two_factor_authentication_settings = get_option( 'wppb_two_factor_authentication_settings', 'not_found' );
1984 if( isset( $wppb_two_factor_authentication_settings['enabled'] ) && $wppb_two_factor_authentication_settings['enabled'] === 'yes' ) {
1985 return true;
1986 }
1987
1988 return false;
1989 }
1990
1991 /**
1992 * Function that returns an array containing the User Listing names
1993 */
1994
1995 function wppb_get_userlisting_names(){
1996 $ul_names = array();
1997 $userlisting_posts = get_posts( array( 'posts_per_page' => -1, 'post_status' =>'publish', 'post_type' => 'wppb-ul-cpt', 'orderby' => 'post_date', 'order' => 'ASC' ) );
1998 if( !empty( $userlisting_posts ) ){
1999 foreach ( $userlisting_posts as $post ){
2000 $ul_names[ $post->post_name ] = $post->post_title;
2001 }
2002 }
2003 reset($ul_names);
2004 return $ul_names;
2005 }
2006