PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / trunk
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor vtrunk
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 2.0.8 All 339 releases
profile-builder / features / functions.php

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

2,100 lines 83.4 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 wp_localize_script( 'wppb-epf-rf', 'wppbEpfRf', array( 'nonce' => wp_create_nonce( 'wppb-epf-rf-id-change' ) ) );
484 }
485 else if( 'wppb-roles-editor' == $post_type ){
486 wp_enqueue_style( 'wppb-back-end-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end.css', array(), PROFILE_BUILDER_VERSION );
487 }
488 }
489 else if ( isset( $_GET['page'] ) ) {
490 wp_enqueue_style( 'wppb-back-end-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end.css', array(), PROFILE_BUILDER_VERSION );
491 }
492
493 if ( $hook == 'user-edit.php' ) {
494 wp_enqueue_style( 'wppb-back-end-edit-user-style', WPPB_PLUGIN_URL . 'assets/css/style-back-end-edit-user.css', array(), PROFILE_BUILDER_VERSION );
495 }
496
497 wp_enqueue_script( 'wppb-sitewide', WPPB_PLUGIN_URL . 'assets/js/jquery-pb-sitewide.js', array(), PROFILE_BUILDER_VERSION, true );
498 wp_localize_script( 'wppb-sitewide', 'wppbDeactivationData', array(
499 'deactivationReasonNonce' => wp_create_nonce( 'wppb_deactivation_reason' ),
500 'deactivationReasonRequired' => __( 'Please select a reason before deactivating.', 'profile-builder' ),
501 'deactivationReasonInput' => __( 'Please complete the required field before deactivating.', 'profile-builder' ),
502 'deactivationReasonSaveError' => __( 'We could not save your feedback. Please try again.', 'profile-builder' ),
503 ) );
504
505 wp_enqueue_style( 'wppb-serial-notice-css', WPPB_PLUGIN_URL . 'assets/css/serial-notice.css', false, PROFILE_BUILDER_VERSION );
506 }
507 add_action( 'admin_enqueue_scripts', 'wppb_print_cpt_script', 9 );
508
509 /**
510 * Highlight the settings page under Profile Builder in the admin menu for these pages
511 */
512 //add add_action( "admin_footer-$hook", "wppb_make_setting_menu_item_highlighted" ); for other pages that don't have a parent
513 add_action( "admin_footer-profile-builder_page_profile-builder-private-website", "wppb_make_setting_menu_item_highlighted" );
514 add_action( "admin_footer-profile-builder_page_profile-builder-admin-bar-settings", "wppb_make_setting_menu_item_highlighted" );
515 add_action( "admin_footer-profile-builder_page_profile-builder-content_restriction", "wppb_make_setting_menu_item_highlighted" );
516 add_action( "admin_footer-profile-builder_page_admin-email-customizer", "wppb_make_setting_menu_item_highlighted" );
517 add_action( "admin_footer-profile-builder_page_user-email-customizer", "wppb_make_setting_menu_item_highlighted" );
518 add_action( "admin_footer-profile-builder_page_profile-builder-toolbox-settings", "wppb_make_setting_menu_item_highlighted" );
519 add_action( "admin_footer-profile-builder_page_profile-builder-two-factor-authentication", "wppb_make_setting_menu_item_highlighted" );
520 function wppb_make_setting_menu_item_highlighted(){
521 echo'<script type="text/javascript">
522 jQuery(document).ready( function($) {
523 $("#toplevel_page_profile-builder").addClass("current wp-has-current-submenu wp-menu-open");
524 $("a[href=\'admin.php?page=profile-builder-general-settings\']").closest("li").addClass("current");
525 });
526 </script>';
527 }
528
529
530 //the function used to overwrite the avatar across the wp installation
531 function wppb_changeDefaultAvatar( $avatar, $id_or_email, $size, $default, $alt ){
532 /* Get user info. */
533 if(is_object($id_or_email)){
534 $my_user_id = $id_or_email->user_id;
535
536 if ($id_or_email instanceof WP_User){
537 $my_user_id = $id_or_email->ID;
538 }
539
540 }elseif(is_numeric($id_or_email)){
541 $my_user_id = $id_or_email;
542
543 }elseif(!is_integer($id_or_email)){
544 $user_info = get_user_by( 'email', $id_or_email );
545 $my_user_id = ( is_object( $user_info ) ? $user_info->ID : '' );
546 }else
547 $my_user_id = $id_or_email;
548
549 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
550 if ( $wppb_manage_fields != 'not_found' ){
551 foreach( $wppb_manage_fields as $value ){
552 if ( $value['field'] == 'Avatar'){
553 $avatar_field = $value;
554 }
555 }
556 }
557
558 /* for multisite if we don't have an avatar try to get it from the main blog */
559 if( is_multisite() && empty( $avatar_field ) ){
560 switch_to_blog(1);
561 $wppb_switched_blog = true;
562 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
563 if ( $wppb_manage_fields != 'not_found' ){
564 foreach( $wppb_manage_fields as $value ){
565 if ( $value['field'] == 'Avatar'){
566 $avatar_field = $value;
567 }
568 }
569 }
570 }
571
572 if ( !empty( $avatar_field ) ){
573
574 $customUserAvatar = get_user_meta( $my_user_id, Wordpress_Creation_Kit_PB::wck_generate_slug( $avatar_field['meta-name'] ), true );
575 if( !empty( $customUserAvatar ) ){
576 if( is_numeric( $customUserAvatar ) ){
577 $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'wppb-avatar-size-'.$size );
578
579 if( is_array( $img_attr ) ){
580 if( $img_attr[3] === false ){
581 $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'thumbnail' );
582 $avatar = "<img alt='{$alt}' src='{$img_attr[0]}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
583 }
584 else
585 $avatar = "<img alt='{$alt}' src='{$img_attr[0]}' class='avatar avatar-{$size} photo avatar-default' height='{$img_attr[2]}' width='{$img_attr[1]}' />";
586 }
587 }
588 else {
589 $customUserAvatar = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'], true);
590 $customUserAvatarRelativePath = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'] . '_relative_path', true);
591
592 if ((($customUserAvatar != '') || ($customUserAvatar != null)) && file_exists($customUserAvatarRelativePath)) {
593 $avatar = "<img alt='{$alt}' src='{$customUserAvatar}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
594 }
595 }
596 }
597
598 }
599
600 /* if we switched the blog restore it */
601 if( is_multisite() && !empty( $wppb_switched_blog ) && $wppb_switched_blog )
602 restore_current_blog();
603
604 return $avatar;
605 }
606 add_filter( 'get_avatar', 'wppb_changeDefaultAvatar', 21, 5 );
607
608
609 //the function used to overwrite the avatar across the wp installation
610 function wppb_changeDefaultAvatarUrl( $url, $id_or_email, $args ){
611 /* Get user info. */
612 if(is_object($id_or_email)){
613 $my_user_id = $id_or_email->user_id;
614
615 if ($id_or_email instanceof WP_User){
616 $my_user_id = $id_or_email->ID;
617 }
618
619 }elseif(is_numeric($id_or_email)){
620 $my_user_id = $id_or_email;
621
622 }elseif(!is_integer($id_or_email)){
623 $user_info = get_user_by( 'email', $id_or_email );
624 $my_user_id = ( is_object( $user_info ) ? $user_info->ID : '' );
625 }else
626 $my_user_id = $id_or_email;
627
628 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
629 if ( $wppb_manage_fields != 'not_found' ){
630 foreach( $wppb_manage_fields as $value ){
631 if ( $value['field'] == 'Avatar'){
632 $avatar_field = $value;
633 }
634 }
635 }
636
637 /* for multisite if we don't have an avatar try to get it from the main blog */
638 if( is_multisite() && empty( $avatar_field ) ){
639 switch_to_blog(1);
640 $wppb_switched_blog = true;
641 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
642 if ( $wppb_manage_fields != 'not_found' ){
643 foreach( $wppb_manage_fields as $value ){
644 if ( $value['field'] == 'Avatar'){
645 $avatar_field = $value;
646 }
647 }
648 }
649 }
650
651 $avatar_url = $url;
652
653 if ( !empty( $avatar_field ) ){
654
655 $customUserAvatar = get_user_meta( $my_user_id, Wordpress_Creation_Kit_PB::wck_generate_slug( $avatar_field['meta-name'] ), true );
656 if( !empty( $customUserAvatar ) ){
657 if( is_numeric( $customUserAvatar ) ){
658 if( $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'wppb-avatar-size-'.$args['size'] ) ) {
659 if ( $img_attr[3] === false ) {
660 $img_attr = wp_get_attachment_image_src( $customUserAvatar, 'thumbnail' );
661 }
662 $avatar_url = $img_attr[0];
663 }
664 }
665 else {
666 $customUserAvatar = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'], true);
667 $customUserAvatarRelativePath = get_user_meta($my_user_id, 'resized_avatar_' . $avatar_field['id'] . '_relative_path', true);
668
669 if ((($customUserAvatar != '') || ($customUserAvatar != null)) && file_exists($customUserAvatarRelativePath)) {
670 $avatar_url = $customUserAvatar;
671 }
672 }
673 }
674
675 }
676
677 /* if we switched the blog restore it */
678 if( is_multisite() && !empty( $wppb_switched_blog ) && $wppb_switched_blog )
679 restore_current_blog();
680
681 return $avatar_url;
682 }
683 add_filter( 'get_avatar_url', 'wppb_changeDefaultAvatarUrl', 21, 5 );
684
685
686 //the function used to resize the avatar image; the new function uses a user ID as parameter to make pages load faster
687 function wppb_resize_avatar( $userID, $userlisting_size = null, $userlisting_crop = null ){
688 // include the admin image API
689 require_once( ABSPATH . '/wp-admin/includes/image.php' );
690
691 // retrieve first a list of all the current custom fields
692 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
693 if ( $wppb_manage_fields != 'not_found' ){
694 foreach( $wppb_manage_fields as $value ){
695 if ( $value['field'] == 'Avatar'){
696 $avatar_field = $value;
697 }
698 }
699 }
700
701 /* for multisite if we don't have an avatar try to get it from the main blog */
702 if( is_multisite() && empty( $avatar_field ) ){
703 switch_to_blog(1);
704 $wppb_switched_blog = true;
705 $wppb_manage_fields = get_option( 'wppb_manage_fields', 'not_found' );
706 if ( $wppb_manage_fields != 'not_found' ){
707 foreach( $wppb_manage_fields as $value ){
708 if ( $value['field'] == 'Avatar'){
709 $avatar_field = $value;
710 }
711 }
712 }
713 }
714
715
716 if ( !empty( $avatar_field ) ){
717
718 // retrieve width and height of the image
719 $width = $height = '';
720
721 //this checks if it only has 1 component
722 if ( is_numeric( $avatar_field['avatar-size'] ) ){
723 $width = $height = $avatar_field['avatar-size'];
724
725 }else{
726 //this checks if the entered value has 2 components
727 $sentValue = explode( ',', $avatar_field['avatar-size'] );
728 $width = $sentValue[0];
729 $height = $sentValue[1];
730 }
731
732 $width = ( !empty( $userlisting_size ) ? $userlisting_size : $width );
733 $height = ( !empty( $userlisting_size ) ? $userlisting_size : $height );
734
735 if( !strpos( get_user_meta( $userID, 'resized_avatar_'.$avatar_field['id'], true ), $width . 'x' . $height ) ) {
736 // retrieve the original image (in original size)
737 $avatar_directory_path = get_user_meta( $userID, 'avatar_directory_path_'.$avatar_field['id'], true );
738
739 $image = wp_get_image_editor( $avatar_directory_path );
740 if ( !is_wp_error( $image ) ) {
741 do_action( 'wppb_before_avatar_resizing', $image, $userID, Wordpress_Creation_Kit_PB::wck_generate_slug( $avatar_field['meta-name'] ), $avatar_field['avatar-size'] );
742
743 $crop = apply_filters( 'wppb_avatar_crop_resize', ( !empty( $userlisting_crop ) ? $userlisting_crop : false ) );
744
745 $resize = $image->resize( $width, $height, $crop );
746
747 if ($resize !== FALSE) {
748 do_action( 'wppb_avatar_resizing', $image, $resize );
749
750 $fileType = apply_filters( 'wppb_resized_file_extension', 'png' );
751
752 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
753
754 //create file(name); both with directory and url
755 $fileName_dir = $image->generate_filename( NULL, $wp_upload_array['basedir'].'/profile_builder/avatars/', $fileType );
756
757 if ( PHP_OS == "WIN32" || PHP_OS == "WINNT" )
758 $fileName_dir = str_replace( '\\', '/', $fileName_dir );
759
760 $fileName_url = str_replace( str_replace( '\\', '/', $wp_upload_array['basedir'] ), $wp_upload_array['baseurl'], $fileName_dir );
761
762 //save the newly created (resized) avatar on the disc
763 $saved_image = $image->save( $fileName_dir );
764
765 if ( !is_wp_error( $saved_image ) ) {
766 /* the image save sometimes doesn't save with the desired extension so we need to see with what extension it saved it with and
767 if it differs replace the extension in the path and url that we save as meta */
768 $validate_saved_image = wp_check_filetype_and_ext( $saved_image['path'], $saved_image['path'] );
769 $ext = substr( $fileName_dir,strrpos( $fileName_dir, '.', -1 ), strlen($fileName_dir) );
770 if( !empty( $validate_saved_image['ext'] ) && $validate_saved_image['ext'] != $ext ){
771 $fileName_url = str_replace( $ext, '.'.$validate_saved_image['ext'], $fileName_url );
772 $fileName_dir = str_replace( $ext, '.'.$validate_saved_image['ext'], $fileName_dir );
773 }
774
775 update_user_meta( $userID, 'resized_avatar_'.$avatar_field['id'], $fileName_url );
776 update_user_meta( $userID, 'resized_avatar_'.$avatar_field['id'].'_relative_path', $fileName_dir );
777
778 do_action( 'wppb_after_avatar_resizing', $image, $fileName_dir, $fileName_url );
779 }
780 }
781 }
782 }
783 }
784
785 /* if we switched the blog restore it */
786 if( is_multisite() && !empty( $wppb_switched_blog ) && $wppb_switched_blog )
787 restore_current_blog();
788
789 }
790
791
792 // add a hook to delete the user from the _signups table if either the email confirmation is activated, or it is a wpmu installation
793 function wppb_delete_user_from_signups_table($user_id) {
794 global $wpdb;
795
796 $user = get_userdata( $user_id );
797
798 if ( empty( $user ) ) {
799 return;
800 }
801
802 // Delete signup rows by both email and login so activated entries do not remain orphaned in the signups table
803 // - 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
804 // - the signup row can also preserve the email address used at registration time, while the actual WP user_email may later change after activation
805 // - deleting by both keys covers both mismatch cases and keeps stale signups rows from blocking future registrations or other flows
806 if ( is_multisite() ) {
807 $wpdb->delete( $wpdb->signups, array( 'user_email' => $user->user_email ), array( '%s' ) );
808 $wpdb->delete( $wpdb->signups, array( 'user_login' => $user->user_login ), array( '%s' ) );
809 } else {
810 $table_name = $wpdb->prefix . 'signups';
811 $val = $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name ) );
812 if ( $val ) {
813 $wpdb->delete( $table_name, array( 'user_email' => $user->user_email ), array( '%s' ) );
814 $wpdb->delete( $table_name, array( 'user_login' => $user->user_login ), array( '%s' ) );
815 }
816 }
817 }
818
819 $wppb_generalSettings = get_option( 'wppb_general_settings' );
820 if ( !empty( $wppb_generalSettings['emailConfirmation'] ) && ( $wppb_generalSettings['emailConfirmation'] == 'yes' ) ) {
821 if( is_multisite() )
822 add_action( 'wpmu_delete_user', 'wppb_delete_user_from_signups_table' );
823 else
824 add_action('delete_user', 'wppb_delete_user_from_signups_table');
825 }
826
827
828
829 // This function offers compatibility with the all in one event calendar plugin
830 function wppb_aioec_compatibility(){
831
832 wp_deregister_script( 'jquery.tools-form');
833 }
834 add_action('admin_print_styles-users_page_ProfileBuilderOptionsAndSettings', 'wppb_aioec_compatibility');
835
836
837 function wppb_user_meta_exists( $id, $meta_name ){
838 global $wpdb;
839
840 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 );
841 }
842
843
844 /**
845 * Sanitize a URL from request input. Non-string values (e.g. arrays from bracket notation) return ''.
846 *
847 * @param mixed $url Candidate URL.
848 * @return string
849 */
850 function wppb_sanitize_request_url( $url ) {
851 if ( ! is_string( $url ) || $url === '' ) {
852 return '';
853 }
854
855 return esc_url_raw( wp_unslash( $url ) );
856 }
857
858 // function to check if there is a need to add the http:// prefix
859 function wppb_check_missing_http( $redirectLink ) {
860 return preg_match( '#^(?:[a-z\d]+(?:-+[a-z\d]+)*\.)+[a-z]+(?::\d+)?(?:/|$)#i', $redirectLink );
861 }
862
863 //function that adds missing http to a link
864 function wppb_add_missing_http( $link ){
865 $http = '';
866 if ( wppb_check_missing_http( $link ) ) { //if missing http(s)
867 $http = 'http';
868 if ((isset($_SERVER["HTTPS"])) && ($_SERVER["HTTPS"] == "on"))
869 $http .= "s";
870 $http .= "://";
871 }
872
873 return $http . $link;
874 }
875
876
877 //function to output the password strength checker on frontend forms
878 function wppb_password_strength_checker_html(){
879 $wppb_generalSettings = get_option( 'wppb_general_settings' );
880 if( !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
881 $password_strength = '<span id="pass-strength-result">'.__('Strength indicator', 'profile-builder' ).'</span>
882 <input type="hidden" value="" name="wppb_password_strength" id="wppb_password_strength"/>';
883 return $password_strength;
884 }
885 return '';
886 }
887
888 //function to check password length check
889 function wppb_check_password_length( $password ){
890 $wppb_generalSettings = get_option( 'wppb_general_settings' );
891 if( !empty( $wppb_generalSettings['minimum_password_length'] ) ){
892 if( strlen( $password ) < $wppb_generalSettings['minimum_password_length'] ){
893 return true;
894 }
895 else
896 return false;
897 }
898 return false;
899 }
900
901 //function to check password strength
902 function wppb_check_password_strength(){
903 $wppb_generalSettings = get_option( 'wppb_general_settings' );
904 if( isset( $_POST['wppb_password_strength'] ) && sanitize_text_field( $_POST['wppb_password_strength'] ) != '' && !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
905 $wppb_password_strength = sanitize_text_field( $_POST['wppb_password_strength'] );
906 $password_strength_array = array( 'short' => 0, 'bad' => 1, 'good' => 2, 'strong' => 3 );
907 $password_strength_text = array( 'short' => __( 'Very Weak', 'profile-builder' ), 'bad' => __( 'Weak', 'profile-builder' ), 'good' => __( 'Medium', 'profile-builder' ), 'strong' => __( 'Strong', 'profile-builder' ) );
908 if( $password_strength_array[$wppb_password_strength] < $password_strength_array[$wppb_generalSettings['minimum_password_strength']] ){
909 return $password_strength_text[$wppb_generalSettings['minimum_password_strength']];
910 }
911 else
912 return false;
913 }
914 return false;
915 }
916
917 /* function to output password length requirements text */
918 function wppb_password_length_text(){
919 $wppb_generalSettings = get_option( 'wppb_general_settings' );
920 if( !empty( $wppb_generalSettings['minimum_password_length'] ) ){
921 return sprintf(__('Minimum length of %d characters.', 'profile-builder'), $wppb_generalSettings['minimum_password_length']);
922 }
923 return '';
924 }
925
926 /* function to output password strength requirements text */
927 function wppb_password_strength_description() {
928 $wppb_generalSettings = get_option( 'wppb_general_settings' );
929
930 if( ! empty( $wppb_generalSettings['minimum_password_strength'] ) ) {
931 $password_strength_text = array( 'short' => __( 'Very Weak', 'profile-builder' ), 'bad' => __( 'Weak', 'profile-builder' ), 'good' => __( 'Medium', 'profile-builder' ), 'strong' => __( 'Strong', 'profile-builder' ) );
932 $password_strength_description = '<br>'. sprintf( __( 'The password must have a minimum strength of %s', 'profile-builder' ), $password_strength_text[$wppb_generalSettings['minimum_password_strength']] );
933
934 return $password_strength_description;
935 } else {
936 return '';
937 }
938 }
939
940 /**
941 * Include password strength check scripts on frontend where we have shortcodes present
942 */
943 add_action( 'elementor/frontend/after_enqueue_scripts', 'wppb_enqueue_password_strength_check' );
944 add_action( 'wp_footer', 'wppb_enqueue_password_strength_check' );
945 function wppb_enqueue_password_strength_check() {
946 global $wppb_shortcode_on_front;
947 if( $wppb_shortcode_on_front ){
948 $wppb_generalSettings = get_option( 'wppb_general_settings' );
949 if( !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
950 wp_enqueue_script( 'password-strength-meter' );
951 }
952 }
953 }
954 add_action( 'wp_footer', 'wppb_password_strength_check', 102 );
955 function wppb_password_strength_check(){
956 global $wppb_shortcode_on_front;
957 if( $wppb_shortcode_on_front ){
958 $wppb_generalSettings = get_option( 'wppb_general_settings' );
959 if( !empty( $wppb_generalSettings['minimum_password_strength'] ) ){
960 ?>
961 <script type="text/javascript">
962 function check_pass_strength(form) {
963 var pass1 = jQuery(form).find('#passw1').val(),
964 pass2 = jQuery(form).find('#passw2').val(),
965 strength;
966
967 jQuery(form).find('#pass-strength-result').removeClass('short bad good strong');
968 if (!pass1) {
969 jQuery(form).find('#pass-strength-result').html(pwsL10n.empty);
970 return;
971 }
972 <?php
973 global $wp_version;
974
975 if ( version_compare( $wp_version, "4.9.0", ">=" ) ) {
976 ?>
977 strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputDisallowedList(), pass2 );
978 <?php
979 }
980 else {
981 ?>
982 strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputBlacklist(), pass2);
983 <?php
984 }
985 ?>
986 switch ( strength ) {
987 case 2:
988 jQuery(form).find('#pass-strength-result').addClass('bad').html( pwsL10n.bad );
989 jQuery(form).find('#wppb_password_strength').val('bad');
990 break;
991 case 3:
992 jQuery(form).find('#pass-strength-result').addClass('good').html( pwsL10n.good );
993 jQuery(form).find('#wppb_password_strength').val('good');
994 break;
995 case 4:
996 jQuery(form).find('#pass-strength-result').addClass('strong').html( pwsL10n.strong );
997 jQuery(form).find('#wppb_password_strength').val('strong');
998 break;
999 case 5:
1000 jQuery(form).find('#pass-strength-result').addClass('short').html( pwsL10n.mismatch );
1001 jQuery(form).find('#wppb_password_strength').val('short');
1002 break;
1003 default:
1004 jQuery(form).find('#pass-strength-result').addClass('short').html( pwsL10n['short'] );
1005 jQuery(form).find('#wppb_password_strength').val('short');
1006 }
1007 }
1008 jQuery( document ).ready( function() {
1009 // Binding to trigger checkPasswordStrength
1010 jQuery('.wppb-user-forms').each(function() {
1011 var form = this;
1012 jQuery(form).find('#passw1, #passw2').val('').on('keyup change', function() {
1013 check_pass_strength(form);
1014 });
1015 jQuery(form).find('#pass-strength-result').show();
1016 });
1017 });
1018 </script>
1019 <?php
1020 }
1021 }
1022 }
1023
1024 /**
1025 * Include toggle password visibility script on frontend where we have shortcodes present
1026 */
1027 function wppb_password_visibility_toggle_html(){
1028 if( apply_filters( 'wppb_show_password_visibility_toggle', false ) ){
1029 return '
1030 <button type="button" class="wppb-toggle-pw wppb-show-pw hide-if-no-js" data-toggle="0" aria-label="Show password" tabindex="-1">
1031 <img src="'.WPPB_PLUGIN_URL.'/assets/images/eye-outline.svg" title="'. esc_html__( 'Show password', 'profile-builder' ) .'" width="20px" height="20px" />
1032 </button>';
1033 }
1034 return '';
1035 }
1036
1037 /**
1038 * Include toggle password visibility script on frontend where we have shortcodes present
1039 */
1040 add_action( 'elementor/frontend/after_enqueue_scripts', 'wppb_enqueue_password_visibility_toggle' );
1041 add_action( 'wp_footer', 'wppb_enqueue_password_visibility_toggle' );
1042 function wppb_enqueue_password_visibility_toggle() {
1043 global $wppb_shortcode_on_front;
1044 static $enqueued = false;
1045 if( $wppb_shortcode_on_front && apply_filters( 'wppb_show_password_visibility_toggle', false ) && !$enqueued ){
1046
1047 //load jQuery if needed
1048 if( !wp_script_is('jquery', 'done') ){
1049 wp_print_scripts('jquery');
1050 }
1051
1052 ?>
1053 <script type="text/javascript">
1054 jQuery( document ).ready( function() {
1055
1056 jQuery( "button.wppb-toggle-pw" ).on( "click", wppb_password_visibility_toggle );
1057
1058 jQuery( 'button.wppb-toggle-pw' ).each( function( index, toggle ){
1059
1060 var parent = jQuery( toggle ).parent()
1061
1062 if( parent.hasClass( 'wppb-form-field' ) && jQuery( '.wppb-description-delimiter', parent ) ){
1063
1064 jQuery( toggle ).css( 'top', parseInt( jQuery( toggle ).css('top') ) - ( jQuery( '.wppb-description-delimiter', parent ).outerHeight() / 2 ) )
1065
1066 }
1067
1068 })
1069
1070 });
1071 function wppb_password_visibility_toggle() {
1072 var button = jQuery( this );
1073 var container = button.closest( '.wppb-password-field-container' );
1074 var input = container.find( 'input' ).first();
1075 var icon = button.find( 'img' );
1076
1077 if ( ! input.length ) {
1078 return;
1079 }
1080
1081 if ( "password" === input.attr( "type" ) ) {
1082 input.attr( "type", "text" );
1083 button.removeClass( "wppb-show-pw" ).addClass( "wppb-hide-pw" );
1084 icon.attr( "src", "<?php echo esc_attr( WPPB_PLUGIN_URL ); ?>/assets/images/eye-off-outline.svg" );
1085 icon.attr( "title", "<?php esc_html_e( 'Hide password', 'profile-builder' ); ?>" );
1086 } else {
1087 input.attr( "type", "password" );
1088 button.removeClass( "wppb-hide-pw" ).addClass( "wppb-show-pw" );
1089 icon.attr( "src", "<?php echo esc_attr( WPPB_PLUGIN_URL ); ?>/assets/images/eye-outline.svg" );
1090 icon.attr( "title", "<?php esc_html_e( 'Show password', 'profile-builder' ); ?>" );
1091 }
1092 }
1093 </script>
1094 <?php
1095 $enqueued = true;
1096 }
1097 }
1098
1099 /**
1100 * Create functions for repeating error messages in front-end forms
1101 */
1102 function wppb_required_field_error($field_title='') {
1103 $required_error = apply_filters('wppb_required_error' , __('This field is required','profile-builder') , $field_title);
1104
1105 return $required_error;
1106
1107 }
1108
1109 /**
1110 * Function that returns a certain field (from manage_fields) by a given id or meta_name
1111 */
1112 function wppb_get_field_by_id_or_meta( $id_or_meta ){
1113
1114 $id = 0;
1115 $meta = '';
1116
1117 if ( is_numeric($id_or_meta) )
1118 $id = $id_or_meta;
1119 else
1120 $meta = $id_or_meta;
1121
1122 $fields = get_option('wppb_manage_fields', 'not_found');
1123
1124 if ($fields != 'not_found') {
1125
1126 foreach ($fields as $key => $field) {
1127 if ( (!empty($id)) && ($field['id'] == $id) )
1128 return $field;
1129 if ( (!empty($meta)) && ($field['meta-name'] == $meta) )
1130 return $field;
1131 }
1132
1133 }
1134
1135 return '';
1136 }
1137
1138
1139 /* Function for displaying reCAPTCHA error on Login and Recover Password forms */
1140 function wppb_recaptcha_field_error($field_title='') {
1141
1142 $recaptcha_field = wppb_get_recaptcha_field();
1143
1144 if( $recaptcha_field['recaptcha-type'] === 'v2' ) {
1145 $recaptcha_error = apply_filters('wppb_recaptcha_error' , __('Please enter a (valid) reCAPTCHA value','profile-builder') , $field_title);
1146 } else {
1147 $recaptcha_error = apply_filters('wppb_recaptcha_error' , __('reCaptcha could not be verified. Please try again.','profile-builder') , $field_title);
1148 }
1149
1150 return $recaptcha_error;
1151
1152 }
1153 /* Function for displaying phone field error */
1154 function wppb_phone_field_error( $field_title = '' ) {
1155 $phone_error = apply_filters( 'wppb_phone_error' , __( 'Incorrect phone number', 'profile-builder' ) , $field_title );
1156
1157 return $phone_error;
1158 }
1159
1160 /* Create a wrapper function for get_query_var */
1161 function wppb_get_query_var( $varname ){
1162 //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
1163 if($varname === 'username' && !get_query_var( $varname ) && isset($_GET['wppb_username'])){
1164 return apply_filters( 'wppb_get_query_var_'.$varname, sanitize_user( $_GET['wppb_username'] ) );
1165 }
1166
1167 return apply_filters( 'wppb_get_query_var_'.$varname, get_query_var( $varname ) );
1168 }
1169
1170 /** @param string|array $key Query key or keys to remove.
1171 */
1172 function wppb_remove_query_arg( $key, $url = false ){
1173 $striped_url = remove_query_arg( $key, $url);
1174
1175 //treat page key on frontpage case where it is transformed into a pretty permalink
1176 if( ( is_array($key) && in_array('wppb_page', $key) ) || ( !is_array($key) && 'wppb_page' === $key ) ){
1177 $striped_url = preg_replace( '/\/'.wppb_get_users_pagination_slug().'\/\d+\//', '/', $striped_url );
1178 $striped_url = preg_replace( '/\/'.wppb_get_users_pagination_slug().'\//', '/', $striped_url );
1179 }
1180
1181 return $striped_url;
1182 }
1183
1184 //function that generates tha pagination slug for userlisting
1185 function wppb_get_users_pagination_slug(){
1186 return apply_filters('wppb_users_pagination_slug', 'users-page');
1187 }
1188
1189 /* Filter the "Save Changes" button text, to make it translatable */
1190 function wppb_change_save_changes_button($value){
1191 $value = __('Save Changes','profile-builder');
1192 return $value;
1193 }
1194 add_filter( 'wck_save_changes_button', 'wppb_change_save_changes_button', 10, 2);
1195
1196 /* Filter the "Cancel" button text, to make it translatable */
1197 function wppb_change_cancel_button($value){
1198 $value = __('Cancel','profile-builder');
1199 return $value;
1200 }
1201 add_filter( 'wck_cancel_button', 'wppb_change_cancel_button', 10, 2);
1202
1203 /* ilter the "Delete" button text, to make it translatable */
1204 function wppb_change_delete_button($value){
1205 $value = __('Delete','profile-builder');
1206 return $value;
1207 }
1208 add_filter( 'wck_delete_button', 'wppb_change_delete_button', 10, 2);
1209
1210 /*Filter the "Edit" button text, to make it translatable*/
1211 function wppb_change_edit_button($value){
1212 $value = __('Edit','profile-builder');
1213 return $value;
1214 }
1215 add_filter( 'wck_edit_button', 'wppb_change_edit_button', 10, 2);
1216
1217 /*Filter the User Listing, Register Forms and Edit Profile forms metabox header content, to make it translatable*/
1218 function wppb_change_metabox_content_header(){
1219 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>';
1220 }
1221 add_filter('wck_metabox_content_header_wppb_ul_page_settings', 'wppb_change_metabox_content_header', 1);
1222 add_filter('wck_metabox_content_header_wppb_rf_page_settings', 'wppb_change_metabox_content_header', 1);
1223 add_filter('wck_metabox_content_header_wppb_epf_page_settings', 'wppb_change_metabox_content_header', 1);
1224
1225
1226 /*Filter default WordPress notices ("Post published. Post updated."), add post type name for User Listing, Registration Forms and Edit Profile Forms*/
1227 function wppb_change_default_post_updated_messages($messages){
1228 global $post;
1229 $post_type = get_post_type($post->ID);
1230 $object = get_post_type_object($post_type);
1231
1232 if ( ($post_type == 'wppb-rf-cpt')||($post_type == 'wppb-epf-cpt')||($post_type == 'wppb-ul-cpt') ){
1233 $messages['post'][1] = $object->labels->name . ' updated.';
1234 $messages['post'][6] = $object->labels->name . ' published.';
1235 }
1236 return $messages;
1237 }
1238 add_filter('post_updated_messages','wppb_change_default_post_updated_messages', 2);
1239
1240
1241 /* for meta-names with spaces in them PHP converts the space to underline in the $_POST */
1242 function wppb_handle_meta_name( $meta_name ){
1243 $meta_name = trim( $meta_name );
1244 $meta_name = str_replace( ' ', '_', $meta_name );
1245 $meta_name = str_replace( '.', '_', $meta_name );
1246 return $meta_name;
1247 }
1248
1249 /**
1250 * Function that checks if a field type exists in a form
1251 * @return bool
1252 */
1253 function wppb_field_exists_in_form( $field_type, $form_args ){
1254 if( !empty( $form_args ) && !empty( $form_args['form_fields'] ) ){
1255 foreach( $form_args['form_fields'] as $field ){
1256 if( $field['field'] === $field_type ){
1257 return true;
1258 }
1259 }
1260 }
1261
1262 return false;
1263 }
1264
1265 // change User Registered date and time according to timezone selected in WordPress settings
1266 function wppb_get_register_date() {
1267
1268 $time_format = "Y-m-d G:i:s";
1269 $wppb_get_date = date_i18n( $time_format, false, true );
1270
1271 if( apply_filters( 'wppb_return_local_time_for_register', false ) ){
1272 $wppb_get_date = date_i18n( $time_format );
1273 }
1274
1275 return $wppb_get_date;
1276 }
1277
1278 /**
1279 * Function that ads the gmt offset from the general settings to a unix timestamp
1280 * @param $timestamp
1281 * @return mixed
1282 */
1283 function wppb_add_gmt_offset( $timestamp ) {
1284 if( apply_filters( 'wppb_add_gmt_offset', true ) ){
1285 $timestamp = $timestamp + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
1286 }
1287 return $timestamp;
1288 }
1289
1290 /**
1291 * Add HTML tag 'required' to fields
1292 *
1293 * 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.
1294 * Field type 'Checkbox' is explicitly excluded because there is no HTML support to check if at least one option is selected.
1295 * Other fields excluded are Avatar, Upload, Heading, ReCaptcha, WYSIWYG, Map.
1296 *
1297 * @since
1298 *
1299 * @param string $extra_attributes Extra attributes attached to the field HTML tag.
1300 * @param array $field Field description.
1301 * @return string $extra_attributes
1302 */
1303 function wppb_add_html_tag_required_to_fields( $extra_attributes, $field, $form_location = '' ) {
1304 if ( isset( $field['required'] ) && $field['required'] == 'Yes' ){
1305
1306 if( !in_array( $field['field'], array( 'Checkbox', 'Default - Password', 'Default - Repeat Password', 'GDPR Communication Preferences' ) ) && $form_location == 'edit_profile' )
1307 $extra_attributes .= ' required ';
1308
1309 }
1310 return $extra_attributes;
1311 }
1312 add_filter( 'wppb_extra_attribute', 'wppb_add_html_tag_required_to_fields', 10, 3 );
1313
1314 /**
1315 * Add HTML tag 'required' to WooCommerce fields
1316 *
1317 * 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.
1318 * Does not work on 'State / County' field, if it becomes required later depending on the Country Value
1319 *
1320 * @since
1321 *
1322 * @param string $extra_attributes Extra attributes attached to the field HTML tag.
1323 * @param array $field Field description.
1324 * @return string $extra_attributes
1325 */
1326 function wppb_add_html_tag_required_to_woo_fields( $extra_attributes, $field ) {
1327 if ( isset( $field['required'] ) && $field['required'] == 'Yes' ){
1328 $extra_attributes .= ' required ';
1329 }
1330 return $extra_attributes;
1331 }
1332 add_filter( 'wppb_woo_extra_attribute', 'wppb_add_html_tag_required_to_woo_fields', 10, 2 );
1333
1334
1335 /**
1336 * Add jQuery script to remove required attribute for hidden fields
1337 *
1338 * 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.
1339 * If a field is made visible again, add the required field back again.
1340 *
1341 * @since
1342 *
1343 * @param string $extra_attributes Extra attributes attached to the field HTML tag.
1344 * @param array $field Field description.
1345 * @return string $extra_attributes
1346 */
1347 function wppb_manage_required_attribute() {
1348 global $wppb_shortcode_on_front;
1349 if ($wppb_shortcode_on_front) {
1350 //check if jquery has been loaded yet because we need it at this point
1351 // we're checking if it's not admin because it brakes elementor otherwise.
1352 if( !wp_script_is('jquery', 'done') && !is_admin() ){
1353 wp_print_scripts('jquery');
1354 }
1355 ?>
1356 <script type="text/javascript">
1357 jQuery(document).on( "wppbAddRequiredAttributeEvent", wppbAddRequired );
1358 function wppbAddRequired(event) {
1359 var element = wppbEventTargetRequiredElement( event.target );
1360 if( jQuery( element ).attr( "wppb_cf_temprequired" ) ){
1361 jQuery( element ).removeAttr( "wppb_cf_temprequired" );
1362 jQuery( element ).attr( "required", "required" );
1363 }
1364 }
1365
1366 jQuery(document).on( "wppbRemoveRequiredAttributeEvent", wppbRemoveRequired );
1367 function wppbRemoveRequired(event) {
1368 var element = wppbEventTargetRequiredElement( event.target );
1369 if ( jQuery( element ).attr( "required" ) ) {
1370 jQuery( element ).removeAttr( "required" );
1371 jQuery( element ).attr( "wppb_cf_temprequired", "wppb_cf_temprequired" );
1372 }
1373 }
1374
1375 jQuery(document).on( "wppbToggleRequiredAttributeEvent", wppbToggleRequired );
1376 function wppbToggleRequired(event) {
1377 if ( jQuery( event.target ).attr( "required" ) ) {
1378 jQuery( event.target ).removeAttr( "required" );
1379 jQuery( event.target ).attr( "wppb_cf_temprequired", "wppb_cf_temprequired" );
1380 }else if( jQuery( event.target ).attr( "wppb_cf_temprequired" ) ){
1381 jQuery( event.target ).removeAttr( "wppb_cf_temprequired" );
1382 jQuery( event.target ).attr( "required", "required" );
1383 }
1384 }
1385
1386 function wppbEventTargetRequiredElement( htmlElement ){
1387 if ( htmlElement.nodeName == "OPTION" ){
1388 // <option> is the target element, so we need to get the parent <select>, in order to apply the required attribute
1389 return htmlElement.parentElement;
1390 }else{
1391 return htmlElement;
1392 }
1393 }
1394
1395 </script>
1396 <?php
1397 }
1398 }
1399 add_action( 'wp_footer', 'wppb_manage_required_attribute', 99 );
1400
1401 function wpbb_specify_blog_details_on_signup_email( $message, $user_email, $user, $activation_key, $registration_page_url, $meta, $from_name, $context ){
1402 $meta = unserialize($meta);
1403
1404 if ( is_multisite() && isset( $meta['wppb_create_new_site_checkbox'] ) && $meta['wppb_create_new_site_checkbox'] == 'yes' ) {
1405 $blog_details = wpmu_validate_blog_signup( $meta['wppb_blog_url'], $meta['wppb_blog_title'] );
1406
1407 if ( empty($blog_details['errors']->errors['blogname']) && empty($blog_details['errors']->errors['blog_title'])) {
1408 $blog_path = $blog_details['domain'] . $blog_details['path'];
1409 $message .= __( '<br><br>Also, you will be able to visit your site at ', 'profile-builder' ) . '<a href="' . $blog_path . '">' . $blog_path . '</a>.';
1410 }
1411 }
1412 return $message;
1413 }
1414 add_filter( 'wppb_signup_user_notification_email_content', 'wpbb_specify_blog_details_on_signup_email', 5, 8 );
1415
1416 function wpbb_specify_blog_details_on_registration_email( $user_message_content, $email, $password, $user_message_subject, $context ){
1417
1418 if ( is_multisite() ) {
1419 $user = get_user_by( 'email', $email );
1420 $blog_path = wppb_get_blog_url_of_user_id( $user->ID );
1421 if ( ! empty ( $blog_path ) ) {
1422 $user_message_content .= __( '<br><br>You can visit your site at ', 'profile-builder' ) . '<a href="' . $blog_path . '">' . $blog_path . '</a>.';
1423 }
1424 }
1425 return $user_message_content;
1426
1427 }
1428 add_filter( 'wppb_register_user_email_message_without_admin_approval', 'wpbb_specify_blog_details_on_registration_email', 5, 5 );
1429 add_filter( 'wppb_register_user_email_message_with_admin_approval', 'wpbb_specify_blog_details_on_registration_email', 5, 5 );
1430
1431
1432 function wppb_get_blog_url_of_user_id( $user_id, $ignore_privacy = true ){
1433 $blog_id = get_user_meta( $user_id, 'primary_blog', true );
1434 if ( is_multisite() && !empty( $blog_id ) ){
1435 $blog_details = get_blog_details( $blog_id );
1436 if ( $ignore_privacy || $blog_details->public ) {
1437 return $blog_details->domain . $blog_details->path;
1438 }
1439 }
1440 return '';
1441 }
1442
1443 function wppb_can_users_signup_blog(){
1444 if ( ! is_multisite() )
1445 return false;
1446 global $wpdb;
1447 $current_site = get_current_site();
1448 $sitemeta_options_query = $wpdb->prepare( "SELECT meta_value FROM {$wpdb->sitemeta} WHERE meta_key = 'registration' AND site_id = %d", $current_site->id );
1449 $network_options_meta = $wpdb->get_results( $sitemeta_options_query );
1450
1451 if ( $network_options_meta[0]->meta_value == 'all' ){
1452 return true;
1453 }
1454 return false;
1455 }
1456
1457 /**
1458 * Function that handle redirect URL
1459 *
1460 * @param string $redirect_priority - it can be normal or top priority
1461 * @param string $redirect_type - type of the redirect
1462 * @param null|string $redirect_url - redirect URL if already set
1463 * @param null|string|object $user - username, user email or user data
1464 * @param null|string $user_role - user role
1465 *
1466 * @return null|string $redirect_url
1467 */
1468 function wppb_get_redirect_url( $redirect_priority, $redirect_type, $redirect_url = NULL, $user = NULL, $user_role = NULL ) {
1469 if( empty($redirect_priority) ) {
1470 $redirect_priority = 'normal';
1471 }
1472
1473 $versions = array( 'Profile Builder Pro', 'Profile Builder Agency', 'Profile Builder Unlimited', 'Profile Builder Dev' );
1474
1475 if( in_array( PROFILE_BUILDER, $versions ) ) {
1476 $wppb_module_settings = get_option( 'wppb_module_settings' );
1477
1478 if( isset( $wppb_module_settings['wppb_customRedirect'] ) && $wppb_module_settings['wppb_customRedirect'] == 'show' && $redirect_priority != 'top' && function_exists( 'wppb_custom_redirect_url' ) ) {
1479 $redirect_url = wppb_custom_redirect_url( $redirect_type, $redirect_url, $user, $user_role );
1480 }
1481 }
1482
1483 if( ! empty( $redirect_url ) ) {
1484 $redirect_url = ( wppb_check_missing_http( $redirect_url ) ? wppb_add_missing_http( $redirect_url ) : $redirect_url );
1485 }
1486
1487 return $redirect_url;
1488 }
1489
1490 /**
1491 * Bind an autologin nonce to a user ID server-side (one-time use).
1492 *
1493 * @param int $user_id User ID to log in.
1494 * @param string $nonce Autologin nonce.
1495 */
1496 function wppb_store_autologin_user( $user_id, $nonce ) {
1497 $user_id = absint( $user_id );
1498
1499 if ( ! $user_id || empty( $nonce ) ) {
1500 return;
1501 }
1502
1503 set_transient( 'wppb_autologin_' . md5( $nonce ), $user_id, 2 * MINUTE_IN_SECONDS );
1504 }
1505
1506 /**
1507 * Resolve the user bound to an autologin nonce.
1508 *
1509 * @param string $nonce Autologin nonce.
1510 * @param bool $consume Whether to delete the stored mapping.
1511 *
1512 * @return int User ID, or 0 when not found.
1513 */
1514 function wppb_get_autologin_user_id( $nonce, $consume = true ) {
1515 if ( empty( $nonce ) ) {
1516 return 0;
1517 }
1518
1519 $key = 'wppb_autologin_' . md5( $nonce );
1520 $user_id = absint( get_transient( $key ) );
1521
1522 if ( $user_id && $consume ) {
1523 delete_transient( $key );
1524 }
1525
1526 return $user_id;
1527 }
1528
1529 /**
1530 * Build autologin query args for a user.
1531 *
1532 * @param int $user_id User ID to log in.
1533 *
1534 * @return array Query args for add_query_arg().
1535 */
1536 function wppb_get_autologin_query_args( $user_id ) {
1537 $user_id = absint( $user_id );
1538 $nonce = wp_create_nonce( 'autologin-' . $user_id . '-' . (int) ( time() / 60 ) );
1539
1540 wppb_store_autologin_user( $user_id, $nonce );
1541
1542 return array(
1543 'autologin' => 'true',
1544 '_wpnonce' => $nonce,
1545 );
1546 }
1547
1548 /**
1549 * Verify an autologin nonce for the given user ID.
1550 *
1551 * @param string $nonce Autologin nonce.
1552 * @param int $user_id User ID bound to the nonce.
1553 *
1554 * @return bool
1555 */
1556 function wppb_verify_autologin_nonce( $nonce, $user_id ) {
1557 $user_id = absint( $user_id );
1558
1559 if ( ! $user_id || empty( $nonce ) ) {
1560 return false;
1561 }
1562
1563 $nonce_action = 'autologin-' . $user_id . '-';
1564
1565 return wp_verify_nonce( $nonce, $nonce_action . (int) ( time() / 60 ) )
1566 || wp_verify_nonce( $nonce, $nonce_action . (int) ( time() / 60 - 1 ) );
1567 }
1568
1569 /**
1570 * Function that builds the redirect
1571 *
1572 * @param string $redirect_url - redirect URL
1573 * @param int $redirect_delay - redirect delay in seconds
1574 * @param null|string $redirect_type - the type of the redirect
1575 * @param null|array $form_args - form args if set
1576 *
1577 * @return string $redirect_message
1578 */
1579 function wppb_build_redirect( $redirect_url, $redirect_delay, $redirect_type = NULL, $form_args = NULL ) {
1580 if( isset( $redirect_type ) ) {
1581 $redirect_url = apply_filters( 'wppb_'. $redirect_type .'_redirect', $redirect_url );
1582 }
1583
1584 $redirect_message = '';
1585
1586 if( ! empty( $redirect_url ) ) {
1587 $redirect_url = ( wppb_check_missing_http( $redirect_url ) ? wppb_add_missing_http( $redirect_url ) : $redirect_url );
1588
1589 if( $redirect_delay == 0 ) {
1590 $redirect_message = '<meta http-equiv="Refresh" content="'. $redirect_delay .';url='. $redirect_url .'" />';
1591 } else {
1592 $redirect_url_href = apply_filters( 'wppb_redirect_url', '<a href="'. esc_url( $redirect_url ) .'">'. __( 'here', 'profile-builder' ) .'</a>', $redirect_url, $redirect_type, $form_args );
1593 $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 );
1594 }
1595 }
1596
1597 return $redirect_message;
1598 }
1599
1600 /**
1601 * Function that strips the script tags from an input
1602 * @param $string
1603 * @return mixed
1604 */
1605 function wppb_sanitize_value( $string ){
1606 return preg_replace( '/<script\b[^>]*>(.*?)<\/script>/is', '', $string );
1607 }
1608
1609 /**
1610 * Function that receives a user role and returns its label.
1611 * Returns the original role if not found.
1612 *
1613 * @since v.2.7.1
1614 *
1615 * @param string $role
1616 *
1617 * @return string
1618 */
1619 function wppb_get_role_name($role){
1620 global $wp_roles;
1621
1622 if ( array_key_exists( $role, $wp_roles->role_names ) )
1623 return $wp_roles->role_names[$role];
1624
1625 return $role;
1626 }
1627
1628 /**
1629 * Function that receives a user role label and returns its slug.
1630 * Returns the original role label if not found.
1631 *
1632 * @since v.3.5.6
1633 *
1634 * @param string $role
1635 *
1636 * @return string
1637 */
1638 function wppb_get_role_slug($role) {
1639 global $wp_roles;
1640
1641 foreach ( $wp_roles->role_names as $slug => $label ) {
1642 if ( $label === $role) {
1643 return $slug;
1644 }
1645 }
1646
1647 return $role;
1648 }
1649
1650 /**
1651 * Functionality for Private Website start
1652 */
1653 add_action( 'template_redirect', 'wppb_private_website_functionality' );
1654 add_action( 'login_init', 'wppb_private_website_functionality', 1 );
1655 function wppb_private_website_functionality(){
1656 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1657 if( $wppb_private_website_settings != 'not_found' ){
1658 if( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ){
1659 if( !is_user_logged_in() ){
1660
1661 if( is_404() )
1662 return;
1663
1664 // force wp-login.php if you accidentally get locked out
1665 global $pagenow;
1666 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 ) ) )
1667 return;
1668
1669 // bypass requests that enter the password of a password protected post
1670 if( $pagenow === 'wp-login.php' && isset( $_GET['action'] ) && $_GET['action'] == 'postpass' && isset( $_POST['post_password'] ) )
1671 return;
1672
1673 // go through paths first if they are set
1674 if( isset( $wppb_private_website_settings['allowed_paths'] ) && !empty( $wppb_private_website_settings['allowed_paths'] ) ){
1675 $allowed_paths = explode( "\r\n", $wppb_private_website_settings['allowed_paths'] );
1676 $parsed_url = wp_parse_url( wppb_curpageurl() );
1677 if( !empty( $parsed_url['path'] ) ) {
1678 $path = $parsed_url['path'];
1679
1680 foreach ($allowed_paths as $allowed_path) {
1681 if (strpos($allowed_path, '*') === false) {
1682 if (trim($path, "/") === trim($allowed_path, "/")) {
1683 return;
1684 }
1685 } else {
1686 if (strpos(ltrim($path, "/"), trailingslashit(trim(str_replace('*', '', $allowed_path), "/"))) === 0) {
1687 return;
1688 }
1689 }
1690 }
1691 }
1692 }
1693
1694 if( isset( $wppb_private_website_settings['allowed_query_strings'] ) && !empty( $wppb_private_website_settings['allowed_query_strings'] ) ){
1695 $allowed_query_strings = explode( "\r\n", $wppb_private_website_settings['allowed_query_strings'] );
1696 $parsed_url_parameters = wp_parse_url( wppb_curpageurl() );
1697
1698 if( !empty( $parsed_url_parameters['query'] ) ) {
1699 parse_str( $parsed_url_parameters['query'], $query_params );
1700
1701 foreach ( $allowed_query_strings as $allowed_query ) {
1702 if ( array_key_exists( $allowed_query, $query_params ) ) {
1703 return;
1704 }
1705 }
1706 }
1707 }
1708
1709 if( isset( $wppb_private_website_settings['allowed_pages'] ) )
1710 $allowed_pages = $wppb_private_website_settings['allowed_pages'];
1711 else{
1712 $allowed_pages = array();
1713 }
1714
1715 $redirect_to_id = $wppb_private_website_settings['redirect_to'];
1716 if( !empty( $redirect_to_id ) ) {
1717 $redirect_url = get_permalink($redirect_to_id);
1718 $allowed_pages[] = $redirect_to_id;
1719 }
1720 else {
1721 //don't redirect if we are already on the wp-login.php page
1722 if( $pagenow === 'wp-login.php' ){
1723 return;
1724 }
1725 else
1726 $redirect_url = wp_login_url(wppb_curpageurl());
1727 }
1728
1729 $redirect_url = apply_filters( 'wppb_private_website_redirect_url', $redirect_url );
1730 $allowed_pages = apply_filters( 'wppb_private_website_allowed_pages', $allowed_pages );
1731
1732 global $post;
1733 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
1734 if( function_exists('url_to_postid') ) {
1735 $post_id = url_to_postid(wppb_curpageurl());//try to get the id from the actual url
1736 }else {
1737 $post_id = 0;
1738 }
1739 }
1740 else
1741 $post_id = $post->ID;
1742
1743 if( ( !in_array( $post_id, $allowed_pages ) && $redirect_url !== strtok( wppb_curpageurl(), '?' ) ) || is_search() ){
1744 nocache_headers();
1745 if( apply_filters( 'wppb_private_website_redirect_add_query_args', true ) && current_filter() == 'template_redirect' ) {
1746 $redirect_url = add_query_arg( 'wppb_referer_url', urlencode( esc_url( wppb_curpageurl() ) ), $redirect_url );
1747 }
1748 wp_safe_redirect( $redirect_url );
1749 exit;
1750 }
1751
1752 }
1753 }
1754 }
1755
1756 }
1757
1758 //add classes on the body to know if we have enabled private website options
1759 add_filter( 'body_class', 'wppb_private_website_body_classes' );
1760 function wppb_private_website_body_classes( $classes ){
1761 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1762 if( $wppb_private_website_settings != 'not_found' ) {
1763 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1764 if (!is_user_logged_in()) {
1765 $classes[] = 'wppb-private-website';
1766 if ( !empty( $wppb_private_website_settings['hide_menus'] ) && $wppb_private_website_settings['hide_menus'] == 'yes' ) {
1767 $classes[] = 'wppb-private-website-hide-menus';
1768 }
1769 }
1770 }
1771 }
1772
1773 return $classes;
1774 }
1775
1776
1777 /**
1778 * Disable RSS
1779 */
1780 add_action('do_feed', 'wppb_disable_feed', 1);
1781 add_action('do_feed_rdf', 'wppb_disable_feed', 1);
1782 add_action('do_feed_rss', 'wppb_disable_feed', 1);
1783 add_action('do_feed_rss2', 'wppb_disable_feed', 1);
1784 add_action('do_feed_atom', 'wppb_disable_feed', 1);
1785 add_action('do_feed_rss2_comments', 'wppb_disable_feed', 1);
1786 add_action('do_feed_atom_comments', 'wppb_disable_feed', 1);
1787 function wppb_disable_feed() {
1788 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1789 if( $wppb_private_website_settings != 'not_found' ) {
1790 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1791 if (!is_user_logged_in()) {
1792 wp_die( wp_kses_post( sprintf( __('No feed available,please visit our <a href="%s">homepage</a>!', 'profile-builder' ), get_bloginfo('url') ) ) );
1793 }
1794 }
1795 }
1796 }
1797
1798
1799 /**
1800 * Disable REST
1801 */
1802 //add_filter('rest_enabled', 'wppb_disable_rest'); // this is depracated
1803 add_filter('rest_jsonp_enabled', 'wppb_disable_rest');
1804 function wppb_disable_rest( $bool ){
1805 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1806 if( $wppb_private_website_settings != 'not_found' ) {
1807 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1808 if ( !isset( $wppb_private_website_settings[ 'disable_rest_api' ] ) || $wppb_private_website_settings[ 'disable_rest_api' ] !== 'yes' ) {
1809 return $bool;
1810 }
1811 if (!is_user_logged_in()) {
1812 return false;
1813 }
1814 }
1815 }
1816 return $bool;
1817 }
1818
1819 /* I should test this to not create any problems */
1820 add_filter('rest_authentication_errors', 'wppb_disable_rest_api_authentication', 10, 1 );
1821 function wppb_disable_rest_api_authentication($result) {
1822 if (!empty($result)) {
1823 return $result;
1824 }
1825
1826 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1827 if( $wppb_private_website_settings != 'not_found' ) {
1828 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1829 if ( !isset( $wppb_private_website_settings[ 'disable_rest_api' ] ) || $wppb_private_website_settings[ 'disable_rest_api' ] !== 'yes' ) {
1830 return $result;
1831 }
1832
1833 // THE EVENTS CALENDAR EXCEPTION
1834 // 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
1835 // and WordPress thinks the user is not authenticated (is_user_logged_in() == false)
1836 // This makes things break for logged in users whe the Private Website + Rest API functionality is enabled
1837 // We are going to ignore requests that contain their nonces so we can exlude them from our restrictions
1838 if( isset( $_REQUEST['_tec_view_rest_nonce_primary'] ) || isset( $_REQUEST['_tec_view_rest_nonce_secondary'] ) )
1839 return $result;
1840
1841 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") {
1842 return new WP_Error('rest_not_logged_in', __( 'You are not currently logged in.', 'profile-builder' ), array('status' => 401));
1843 }
1844 }
1845 }
1846
1847 return $result;
1848 }
1849
1850 /**
1851 * We can hide all menu items
1852 */
1853 add_filter('wp_nav_menu', 'wppb_hide_menus');
1854 add_filter('wp_page_menu', 'wppb_hide_menus');
1855 function wppb_hide_menus( $menu ){
1856 $wppb_private_website_settings = get_option( 'wppb_private_website_settings', 'not_found' );
1857 if( $wppb_private_website_settings != 'not_found' ) {
1858 if ( !empty( $wppb_private_website_settings['private_website'] ) && $wppb_private_website_settings['private_website'] == 'yes' ) {
1859 if ( !is_user_logged_in() && ( !empty($wppb_private_website_settings['hide_menus']) && $wppb_private_website_settings['hide_menus'] == 'yes' ) ) {
1860 return '';
1861 }
1862 }
1863 }
1864 return $menu;
1865 }
1866
1867 /**
1868 * Functionality for Private Website end
1869 */
1870
1871 /**
1872 * Functionality GDPR compliance start
1873 */
1874
1875 //hook into the wp export compatibility
1876 add_filter( 'wp_privacy_personal_data_exporters', 'wppb_register_profile_builder_wp_exporter', 10 );
1877 function wppb_register_profile_builder_wp_exporter( $exporters ) {
1878 $exporters['profile-builder'] = array(
1879 'exporter_friendly_name' => __( 'Profile Builder', 'profile-builder' ),
1880 'callback' => 'wppb_profile_builder_wp_exporter',
1881 );
1882 return $exporters;
1883 }
1884 /* function to add aour user meta to wp exporter */
1885 function wppb_profile_builder_wp_exporter( $email_address, $page = 1 ) {
1886
1887 $export_items = array();
1888
1889 $form_fields = get_option( 'wppb_manage_fields' );
1890
1891 if( !empty( $form_fields ) ) {
1892 $user = get_user_by( 'email', $email_address );
1893 if( $user ) {
1894
1895 $item_id = "user-meta-{$user->ID}";
1896 $group_id = 'user-meta';
1897 $group_label = __('User Meta' , 'profile-builder' );
1898 $data = array();
1899
1900 $all_meta_for_user = get_user_meta( $user->ID );
1901 if( !empty( $all_meta_for_user ) ) {
1902 foreach ($form_fields as $form_field) {
1903
1904 if (!empty($form_field['meta-name']) && strpos($form_field['field'], 'Default') === false) {
1905 $user_meta_value = $all_meta_for_user[$form_field['meta-name']][0];
1906 if( !empty( $user_meta_value ) ){
1907
1908
1909 $data[] = array(
1910 'name' => $form_field['field-title'],
1911 'value' => $user_meta_value
1912 );
1913 }
1914 }
1915 }
1916
1917 $export_items[] = array(
1918 'group_id' => $group_id,
1919 'group_label' => $group_label,
1920 'item_id' => $item_id,
1921 'data' => $data,
1922 );
1923
1924 }
1925 }
1926 }
1927
1928
1929 return array(
1930 'data' => $export_items,
1931 'done' => true,
1932 );
1933 }
1934
1935 /**
1936 * Hook to delete a user through the GDPR Delete button
1937 */
1938 add_action( 'template_redirect', 'wppb_gdpr_delete_user') ;
1939 function wppb_gdpr_delete_user() {
1940
1941 if( isset( $_GET['wppb_user'] ) && ! empty( $_GET['wppb_user'] ) ) {
1942 $edited_user_id = get_current_user_id();
1943 if ( ( ! is_multisite() && current_user_can( 'edit_users' ) ) || ( is_multisite() && current_user_can( 'manage_network' ) ) ) {
1944 $edited_user_id = absint( $_GET['wppb_user'] );
1945 }
1946
1947 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'] ) {
1948 require_once( ABSPATH . 'wp-admin/includes/user.php' );
1949 $user = new WP_User( absint( $_REQUEST['wppb_user'] ) );
1950
1951 if ( ! empty( $user->roles ) ) {
1952 if ( ! in_array( 'administrator', $user->roles ) ) {
1953 wp_delete_user( absint( $_REQUEST['wppb_user'] ) );
1954
1955 do_action( 'wppb_gdpr_user_deleted', absint( $_REQUEST['wppb_user'] ) );
1956 }
1957 }
1958
1959 $args = array( 'wppb_user', 'wppb_action', 'wppb_nonce' );
1960 nocache_headers();
1961 wp_redirect( remove_query_arg( $args ) );
1962 }
1963 }
1964 }
1965
1966 /**
1967 * Function that removes user information from comments when the User Account is deleted using Edit Profile Form
1968 */
1969 function wppb_gdpr_remove_user_info_from_comments( $user_id ) {
1970 $user_comments = get_comments('user_id='.$user_id);
1971 foreach ( $user_comments as $comment ) {
1972 $comment_data = array();
1973 $comment_data['comment_ID'] = $comment->comment_ID;
1974 $comment_data['comment_author'] = '';
1975 $comment_data['comment_author_email'] = '';
1976 $comment_data['comment_author_url'] = '';
1977 wp_update_comment( $comment_data );
1978 }
1979 }
1980 add_action( 'wppb_gdpr_user_deleted', 'wppb_gdpr_remove_user_info_from_comments' );
1981
1982
1983 /**
1984 * Functionality GDPR compliance end
1985 */
1986
1987 /**
1988 * Function that checks if Admin Approval is enabled
1989 */
1990 function wppb_get_admin_approval_option_value(){
1991 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
1992 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' )
1993 return 'yes';
1994 else
1995 return 'no';
1996 }
1997
1998 /**
1999 * Function that checks if conditional fields feature exists
2000 * @return bool
2001 */
2002 function wppb_conditional_fields_exists(){
2003 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists( WPPB_PAID_PLUGIN_DIR . '/features/conditional-fields/conditional-fields.php' ) )
2004 return true;
2005 else
2006 return false;
2007 }
2008
2009 /**
2010 * Add support for [wppb-embed] shortcode inside userlisting as the default [embed] is weird and doesn't work outside the_content
2011 */
2012 add_shortcode('wppb-embed', 'wppb_embed');
2013 function wppb_embed($atts, $content){
2014 $atts = shortcode_atts( array(
2015 'width' => '',
2016 'height' => ''
2017 ), $atts, 'wppb-embed' );
2018
2019 global $wp_embed;
2020 if(empty($atts['width']) || empty($atts['height'])){
2021 $content = $wp_embed->run_shortcode('[embed]'.$content.'[/embed]');
2022 } else {
2023 $content = $wp_embed->run_shortcode('[embed width="'.esc_attr($atts['width']).'" height="'.esc_attr($atts['height']).'"]'.$content.'[/embed]');
2024 }
2025
2026 return $content;
2027 }
2028
2029 /**
2030 * Function to determine if an add-on is active
2031 */
2032
2033 function wppb_check_if_add_on_is_active( $slug ){
2034 //the old modules part
2035 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists(WPPB_PAID_PLUGIN_DIR . '/add-ons/add-ons.php')) {
2036 $wppb_module_settings = get_option('wppb_module_settings', 'not_found');
2037 if ($wppb_module_settings != 'not_found') {
2038 foreach ($wppb_module_settings as $add_on_slug => $status) {
2039 if ($slug == $add_on_slug) {
2040 if ($status === 'hide')
2041 return false;
2042 elseif ($status === 'show')
2043 return true;
2044 }
2045 }
2046 }
2047 }
2048
2049 //the free addons part
2050 $wppb_free_add_ons_settings = get_option( 'wppb_free_add_ons_settings', array() );
2051 if ( !empty( $wppb_free_add_ons_settings ) ){
2052 foreach( $wppb_free_add_ons_settings as $add_on_slug => $status ){
2053 if( $slug == $add_on_slug ){
2054 return $status;
2055 }
2056 }
2057 }
2058
2059 //the advanced addons part
2060 $wppb_advanced_add_ons_settings = get_option( 'wppb_advanced_add_ons_settings', array() );
2061 if ( !empty( $wppb_advanced_add_ons_settings ) ){
2062 foreach( $wppb_advanced_add_ons_settings as $add_on_slug => $status ){
2063 if( $slug == $add_on_slug ){
2064 return $status;
2065 }
2066 }
2067 }
2068
2069 return false;
2070 }
2071
2072 /**
2073 * Function that checks if Two-Factor Authentication is active
2074 */
2075
2076 function wppb_is_2fa_active(){
2077 $wppb_two_factor_authentication_settings = get_option( 'wppb_two_factor_authentication_settings', 'not_found' );
2078 if( isset( $wppb_two_factor_authentication_settings['enabled'] ) && $wppb_two_factor_authentication_settings['enabled'] === 'yes' ) {
2079 return true;
2080 }
2081
2082 return false;
2083 }
2084
2085 /**
2086 * Function that returns an array containing the User Listing names
2087 */
2088
2089 function wppb_get_userlisting_names(){
2090 $ul_names = array();
2091 $userlisting_posts = get_posts( array( 'posts_per_page' => -1, 'post_status' =>'publish', 'post_type' => 'wppb-ul-cpt', 'orderby' => 'post_date', 'order' => 'ASC' ) );
2092 if( !empty( $userlisting_posts ) ){
2093 foreach ( $userlisting_posts as $post ){
2094 $ul_names[ $post->post_name ] = $post->post_title;
2095 }
2096 }
2097 reset($ul_names);
2098 return $ul_names;
2099 }
2100