PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 3.16.4
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v3.16.4
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 / email-confirmation / email-confirmation.php

email-confirmation.php in User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor 3.16.4, at features/email-confirmation/email-confirmation.php

831 lines 38.7 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 //functions needed for the email-confirmation on single-sites (to create the "_signups" table)
5 function wppb_signup_schema( $oldVal, $newVal ){
6 // Declare these as global in case schema.php is included from a function.
7 global $wpdb, $wp_queries, $charset_collate;
8
9 if ( !empty( $newVal['emailConfirmation'] ) && $newVal['emailConfirmation'] == 'yes'){
10
11 //The database character collate.
12 $charset_collate = '';
13
14 if ( ! empty( $wpdb->charset ) )
15 $charset_collate = "DEFAULT CHARACTER SET ".$wpdb->charset;
16 if ( ! empty( $wpdb->collate ) )
17 $charset_collate .= " COLLATE ".$wpdb->collate;
18 $tableName = $wpdb->prefix.'signups';
19
20 // If a legacy signups table exists without the signup_id column, add the
21 // AUTO_INCREMENT column and PRIMARY KEY together. dbDelta would otherwise
22 // split this into two ALTER statements and MySQL rejects an AUTO_INCREMENT
23 // column that isn't simultaneously declared a key.
24 $table_exists = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $tableName ) );
25 if ( $table_exists ) {
26 $column_exists = $wpdb->get_results( "SHOW COLUMNS FROM `{$tableName}` LIKE 'signup_id'" );
27 if ( empty( $column_exists ) ) {
28 $wpdb->query( "ALTER TABLE `{$tableName}` ADD COLUMN signup_id bigint(20) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (signup_id)" );
29 update_option( 'wppb_signups_table_updated', 'yes' );
30 }
31 }
32
33 $sql = "
34 CREATE TABLE $tableName (
35 signup_id bigint(20) NOT NULL AUTO_INCREMENT,
36 domain varchar(191) NOT NULL default '',
37 path varchar(100) NOT NULL default '',
38 title longtext NOT NULL,
39 user_login varchar(60) NOT NULL default '',
40 user_email varchar(100) NOT NULL default '',
41 registered datetime NOT NULL default '0000-00-00 00:00:00',
42 activated datetime NOT NULL default '0000-00-00 00:00:00',
43 active tinyint(1) NOT NULL default '0',
44 activation_key varchar(50) NOT NULL default '',
45 meta longtext,
46 PRIMARY KEY (signup_id),
47 KEY activation_key (activation_key),
48 KEY domain (domain)
49 ) $charset_collate;";
50
51 require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
52 $res = dbDelta($sql);
53 }
54 }
55 add_action( 'update_option_wppb_general_settings', 'wppb_signup_schema', 10, 2 );
56
57 // Function to update existing signups table to add primary key
58 function wppb_update_signup_table_schema() {
59 // Check if we've already updated the table
60 $table_updated = get_option('wppb_signups_table_updated', 'no');
61 if ($table_updated === 'yes') {
62 return; // Table has already been updated, no need to run again
63 }
64
65 global $wpdb;
66 $tableName = $wpdb->prefix.'signups';
67
68 // Check if the table exists
69 $table_exists = $wpdb->get_var("SHOW TABLES LIKE '$tableName'");
70 if (!$table_exists) {
71 return; // Table doesn't exist, nothing to update
72 }
73
74 // Check if email confirmation is enabled
75 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
76 if( $wppb_general_settings == 'not_found' || empty($wppb_general_settings['emailConfirmation']) || $wppb_general_settings['emailConfirmation'] != 'yes' ) {
77 return; // Email confirmation is not enabled, no need to update the table
78 }
79
80 // Check if the signup_id column exists
81 $column_exists = $wpdb->get_results("SHOW COLUMNS FROM $tableName LIKE 'signup_id'");
82 if (empty($column_exists)) {
83 // Column doesn't exist, add it with PRIMARY KEY in a single operation
84 $result = $wpdb->query("ALTER TABLE $tableName ADD COLUMN signup_id bigint(20) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (signup_id)");
85
86 // Successfully updated the table
87 if ($result !== false) {
88 update_option('wppb_signups_table_updated', 'yes');
89 }
90 } else {
91 // Column exists, check if it's a primary key
92 $primary_key = $wpdb->get_results("SHOW KEYS FROM $tableName WHERE Key_name = 'PRIMARY'");
93 if (empty($primary_key)) {
94 // No primary key, add it
95 $result = $wpdb->query("ALTER TABLE $tableName ADD PRIMARY KEY (signup_id)");
96
97 // Successfully updated the table
98 if ($result !== false) {
99 update_option('wppb_signups_table_updated', 'yes');
100 }
101 } else {
102 // Table already has primary key, mark as updated
103 update_option('wppb_signups_table_updated', 'yes');
104 }
105 }
106 }
107
108 // Run the update function only when the plugin is activated
109 function wppb_run_signup_table_update_on_activation() {
110 // Delete the option to force the update to run again on activation
111 delete_option('wppb_signups_table_updated');
112 // Run the update function
113 wppb_update_signup_table_schema();
114 }
115 register_activation_hook(__FILE__, 'wppb_run_signup_table_update_on_activation');
116
117 //function to add new tab in the default WP userlisting with all the users who didn't confirm their account yet
118 function wppb_add_pending_users_header_script(){
119 ?>
120 <script type="text/javascript">
121 jQuery(document).ready(function() {
122 jQuery.post( ajaxurl , { action:"wppb_get_unconfirmed_email_number"}, function(response) {
123 jQuery('.wrap ul.subsubsub').append('<span id="separatorID"> |</span> <li class="listUsersWithUncofirmedEmail"><a class="unconfirmedEmailUsers" href="?page=unconfirmed_emails"><?php esc_html_e('Users with Unconfirmed Email Address', 'profile-builder');?></a> <font id="unconfirmedEmailNo" color="grey">('+response.number+')</font></li>');
124 });
125 });
126
127 function confirmECActionBulk( URL, message ) {
128 if ( confirm(message) )
129 window.location=URL;
130 }
131
132 // script to create a confirmation box for the user upon approving/unapproving a user
133 function confirmECAction( URL, todo, user_email, actionText ) {
134 actionText = '<?php esc_html_e( 'Do you want to', 'profile-builder' ); ?>' + ' ' + actionText;
135
136 if (confirm(actionText)) {
137 jQuery.post( ajaxurl , { action:"wppb_handle_email_confirmation_cases", URL:URL, todo:todo, user_email:user_email, nonce:"<?php echo esc_js( wp_create_nonce( 'wppb_handle_email_confirmation' ) ) ?>" }, function(response) {
138 if (response.trim() == 'ok')
139 window.location=URL;
140
141 else
142 alert( response.trim() );
143 });
144 }
145 }
146 </script>
147 <?php
148 }
149
150 function wppb_get_unconfirmed_email_number(){
151
152 if( !current_user_can( 'edit_users' ) )
153 die();
154
155 global $wpdb;
156
157 /* since version 2.0.7 for multisite we add a 'registered_for_blog_id' meta in the registration process
158 so we can count only the users registered on that blog. Also for backwards compatibility we display the users that don't have that meta at all */
159 $number_of_users = 0;
160 $results = $wpdb->get_results("SELECT * FROM ".$wpdb->base_prefix."signups WHERE active = 0");
161 foreach ($results as $result){
162 if( !empty( $result->meta ) ){
163 $user_meta = maybe_unserialize( $result->meta );
164 if( empty( $user_meta['registered_for_blog_id'] ) || $user_meta['registered_for_blog_id'] == get_current_blog_id() ){
165 $number_of_users++;
166 }
167 }
168 }
169
170 header( 'Content-type: application/json' );
171 die( json_encode( array( 'number' => $number_of_users ) ) );
172 }
173
174
175 function wppb_handle_email_confirmation_cases() {
176 global $wpdb;
177
178 if( !isset( $_POST['nonce'] ) || !wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'wppb_handle_email_confirmation' ) )
179 die( esc_html__("You either don't have permission for that action or there was an error!", "profile-builder") );
180
181 $todo = isset( $_POST['todo'] ) ? sanitize_text_field( $_POST['todo'] ) : '';
182 $user_email = isset( $_POST['user_email'] ) ? sanitize_email($_POST['user_email']) : '';
183
184 if ( current_user_can( apply_filters( 'wppb_email_confirmation_user_capability', 'manage_options' ) ) )
185 if ( ( $todo != '' ) && ( $user_email != '' ) ){
186
187 $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $wpdb->base_prefix . "signups WHERE active = 0 AND user_email = %s", $user_email ) );
188
189 if ( count( $results ) != 1 )
190 die( esc_html__( "There was an error performing that action!", "profile-builder" ) );
191
192 elseif ( $todo == 'delete' ){
193
194 if( !empty( $results[0]->user_login ) && !empty( $results[0]->user_email ) ){
195 $sql_result = $wpdb->delete( $wpdb->base_prefix.'signups', array( 'user_login' => $results[0]->user_login, 'user_email' => $results[0]->user_email ) );
196 }
197
198 if ( $sql_result )
199 die( 'ok' );
200 else
201 die( esc_html__( "The selected user couldn't be deleted", "profile-builder" ) );
202
203 }elseif ( $todo == 'confirm' ){
204 die( wppb_manual_activate_signup( $results[0]->activation_key ) );/* phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ /* escaped inside the function */
205
206 }elseif ( $todo == 'resend' ){
207 $sql_result = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->base_prefix . "signups WHERE user_login = %s AND user_email = %s", $results[0]->user_login, $results[0]->user_email ), ARRAY_A );
208
209 if ( $sql_result ){
210 wppb_signup_user_notification( trim( $sql_result['user_login'] ), trim( $sql_result['user_email'] ), $sql_result['activation_key'], $sql_result['meta'] );
211
212 die( esc_html__( "Email notification resent to user", "profile-builder" ) );
213 }
214
215 }
216 }
217
218 die( esc_html__("You either don't have permission for that action or there was an error!", "profile-builder") );
219 }
220
221
222
223 // FUNCTIONS USED BOTH ON THE REGISTRATION PAGE AND THE EMAIL CONFIRMATION TABLE
224
225 // Hook to add AP user meta after signup autentification
226 add_action( 'wpmu_activate_user', 'wppb_add_meta_to_user_on_activation', 10, 3 );
227
228 //function that adds AP user meta after signup autentification and it is also used when editing the user uprofile
229 function wppb_add_meta_to_user_on_activation( $user_id, $password, $meta ){
230 $user = new WP_User( $user_id );
231
232 //copy the data from the meta field (default fields)
233 if( !empty( $meta['first_name'] ) )
234 update_user_meta( $user_id, 'first_name', $meta['first_name'] );
235 if( !empty( $meta['last_name'] ) )
236 update_user_meta( $user_id, 'last_name', $meta['last_name'] );
237 if( !empty( $meta['nickname'] ) )
238 update_user_meta( $user_id, 'nickname', $meta['nickname'] );
239 if( !empty( $meta['user_url'] ) )
240 wp_update_user(array('ID' => $user_id, 'user_url' => $meta['user_url']));
241 if( !empty( $meta['aim'] ) )
242 update_user_meta( $user_id, 'aim', $meta['aim'] );
243 if( !empty( $meta['yim'] ) )
244 update_user_meta( $user_id, 'yim', $meta['yim'] );
245 if( !empty( $meta['jabber'] ) )
246 update_user_meta( $user_id, 'jabber', $meta['jabber'] );
247 if( !empty( $meta['description'] ) )
248 update_user_meta( $user_id, 'description', $meta['description'] );
249
250 if( !empty( $meta['role'] ) )
251 $user->set_role( $meta['role'] ); //update the users role (s)he registered for
252
253 if( !empty( $meta['first_name'] ) && !empty( $meta['last_name'] ) )
254 wp_update_user(array('ID' => $user_id, 'display_name' => $meta['first_name'].' '.$meta['last_name'] ));
255 else if( !empty( $meta['nickname'] ) )
256 wp_update_user(array('ID' => $user_id, 'display_name' => $meta['nickname'] ));
257
258 //copy the data from the meta fields (custom fields)
259 $manage_fields = apply_filters( 'wppb_form_fields', get_option( 'wppb_manage_fields', 'not_set' ), array( 'meta' => $meta, 'user_id' => $user_id, 'context' => 'user_activation' ) );
260 if ( $manage_fields != 'not_set' ){
261 foreach ( $manage_fields as $key => $value){
262 switch ( $value['field'] ) {
263 case 'Input':
264 case 'Input (Hidden)':
265 case 'Checkbox':
266 case 'Checkbox (Terms and Conditions)':
267 case 'Radio':
268 case 'Select':
269 case 'Select (Country)':
270 case 'Select (Multiple)':
271 case 'Select (Timezone)':
272 case 'Datepicker':
273 case 'Textarea':{
274 if ( isset( $meta[$value['meta-name']] ) )
275 update_user_meta( $user_id, $value['meta-name'], trim( $meta[$value['meta-name']] ) );
276 break;
277 }
278 case 'Timepicker':{
279 if ( isset( $meta[$value['meta-name']] ) ) {
280 $time = $meta[$value['meta-name']];
281 if( !empty( $time['hours'] ) && !empty( $time['minutes'] ) ) {
282 update_user_meta( $user_id, $value['meta-name'], $time['hours'] . ':' . $time['minutes'] );
283 }
284
285 }
286 break;
287 }
288 case 'Map':{
289 if ( isset( $meta[$value['meta-name']] ) ) {
290 // Add new markers
291 if( is_array( $meta[$value['meta-name']] ) ) {
292 foreach( $meta[$value['meta-name']] as $key => $position )
293 update_user_meta( $user_id, $value['meta-name'] . '_' . $key, $position );
294 }
295 }
296 break;
297 }
298 case 'Upload':{
299 if ( isset( $meta[$value['meta-name']] ) ){
300 if( !empty( $meta[$value['meta-name']] ) ) {
301 if (is_numeric($meta[$value['meta-name']])) {
302 update_user_meta($user_id, $value['meta-name'], trim($meta[$value['meta-name']]));
303
304 // use this to update the post author to the correct user
305 wp_update_post( array(
306 'ID' => trim( $meta[$value['meta-name']] ),
307 'post_author' => $user_id
308 ) );
309 } else {
310 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
311
312 $file = trim($meta[$value['meta-name']]);
313 $file_name = substr($file, strpos($file, '_attachment_') + 12);
314
315 $random_user_number = apply_filters('wppb_register_wpmu_upload_random_user_number2', substr(md5($user->data->user_email), 0, 12), $user, $meta);
316
317 $old_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/attachments/' . substr($file, strpos($file, 'wpmuRandomID_'));
318 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
319 $old_path_on_disk = str_replace('\\', '/', $old_path_on_disk);
320
321 $new_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/attachments/userID_' . $user_id . '_attachment_' . $file_name;
322 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
323 $new_path_on_disk = str_replace('\\', '/', $new_path_on_disk);
324
325 if (rename($old_path_on_disk, $new_path_on_disk))
326 update_user_meta($user_id, $value['meta-name'], $wp_upload_array['baseurl'] . '/profile_builder/attachments/userID_' . $user_id . '_attachment_' . $file_name);
327 }
328 }
329 else{
330 update_user_meta( $user_id, $value['meta-name'], '' );
331 }
332 }
333 break;
334 }
335 case 'Avatar':{
336 if ( isset( $meta[$value['meta-name']] ) ) {
337 if( !empty( $meta[$value['meta-name']] ) ) {
338 if (is_numeric($meta[$value['meta-name']])) {
339 update_user_meta($user_id, $value['meta-name'], trim($meta[$value['meta-name']]));
340
341 // use this to update the post author to the correct user
342 wp_update_post( array(
343 'ID' => trim( $meta[$value['meta-name']] ),
344 'post_author' => $user_id
345 ) );
346 } else {
347 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
348
349 $file = trim($meta[$value['meta-name']]);
350 $file_name = substr($file, strpos($file, '_originalAvatar_') + 16);
351
352 $random_user_number = apply_filters('wppb_register_wpmu_avatar_random_user_number2', substr(md5($user->data->user_email), 0, 12), $user, $meta);
353
354 $old_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/avatars/' . substr($file, strpos($file, 'wpmuRandomID_'));
355 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
356 $old_path_on_disk = str_replace('\\', '/', $old_path_on_disk);
357
358 $new_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/avatars/userID_' . $user_id . '_originalAvatar_' . $file_name;
359 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
360 $new_path_on_disk = str_replace('\\', '/', $new_path_on_disk);
361
362 if (rename($old_path_on_disk, $new_path_on_disk)) {
363 $wp_filetype = wp_check_filetype(basename($file_name), null);
364 $attachment = array('post_mime_type' => $wp_filetype['type'],
365 'post_title' => $file_name,
366 'post_content' => '',
367 'post_status' => 'inherit'
368 );
369
370 $attach_id = wp_insert_attachment($attachment, $new_path_on_disk);
371
372 $avatar = image_downsize($attach_id, 'thumbnail');
373
374 update_user_meta($user_id, $value['meta-name'], $avatar[0]);
375 update_user_meta($user_id, 'avatar_directory_path_' . $value['id'], $new_path_on_disk);
376 update_user_meta($user_id, 'resized_avatar_' . $value['id'] . '_relative_path', $new_path_on_disk);
377 wppb_resize_avatar($user_id);
378 }
379 }
380 }
381 else{
382 update_user_meta( $user_id, $value['meta-name'], '' );
383 }
384 break;
385 }
386 }
387 case 'Default - Blog Details':{
388 if ( is_multisite() && isset( $meta['wppb_create_new_site_checkbox'] ) && $meta['wppb_create_new_site_checkbox'] == 'yes' ) {
389 $blog_url = $meta['wppb_blog_url'];
390 $blog_title = $meta['wppb_blog_title'];
391
392 $privacy['public'] = ( isset( $meta['wppb_blog_privacy'] ) && 'Yes' == $meta['wppb_blog_privacy'] ) ? true : false;
393 $blog_details = wpmu_validate_blog_signup( $blog_url, $blog_title );
394 if ( empty($blog_details['errors']->errors['blogname']) && empty($blog_details['errors']->errors['blog_title'])) {
395 wpmu_create_blog( $blog_details['domain'], $blog_details['path'], $blog_details['blog_title'], $user_id, $privacy );
396 }
397 }
398 }
399 case 'Select2 (Multiple)':{
400
401 $selected_values = '';
402 if (!empty($meta[wppb_handle_meta_name($value['meta-name'])]) && is_array($meta[wppb_handle_meta_name($value['meta-name'])])) {
403 foreach ($meta[wppb_handle_meta_name($value['meta-name'])] as $selected_key => $selected_value)
404 $selected_values .= sanitize_text_field($selected_value) . ',';
405 }
406
407 update_user_meta( $user_id, $value['meta-name'], trim( $selected_values, ',' ) );
408 }
409 case 'GDPR Checkbox':{
410 if ( isset($meta[wppb_handle_meta_name($value['meta-name'])]) ) {
411 if (isset($meta[wppb_handle_meta_name($value['meta-name'])]) && !empty($meta[wppb_handle_meta_name($value['meta-name'])]) && $meta[wppb_handle_meta_name($value['meta-name'])]==='agree') {
412 update_user_meta($user_id, $value['meta-name'], $meta[$value['meta-name']]);
413 if (isset($meta['gdpr_agreement_time']) && !empty($meta['gdpr_agreement_time'])) {
414 update_user_meta($user_id, 'gdpr_agreement_time', $meta['gdpr_agreement_time']);
415 }
416 }
417 }
418 }
419 default: {
420 if ( isset( $meta[$value['meta-name']] ) ) {
421 update_user_meta($user_id, $value['meta-name'], $meta[$value['meta-name']]);
422 }
423 do_action('wppb_add_meta_on_user_activation_' . Wordpress_Creation_Kit_PB::wck_generate_slug($value['field']), $user_id, $password, $meta, $value);
424 }
425 }
426 }
427 }
428 do_action( 'wppb_add_other_meta_on_user_activation', $user_id, $meta );
429 }
430
431
432 // function to add the new user to the signup table if email confirmation is selected as active or it is a wpmu installation
433 function wppb_signup_user( $username, $user_email, $login_after_register, $meta = '' ) {
434 global $wpdb;
435
436 // check for automatic login
437 // using case-insensitive string comparison to allow for both 'Yes' and 'yes'
438 if( strcasecmp($login_after_register, 'Yes') === 0 ) {
439 $login_after_register = true;
440 } else {
441 $login_after_register = false;
442 }
443 $meta [ 'wppb_login_after_register_'.$meta['user_login'] ] = $login_after_register;
444
445 // save the gdpr_agreement_time if necessary
446 if ( array_key_exists('user_consent_gdpr', $meta) && $meta [ 'user_consent_gdpr' ] === 'agree' ) {
447 $meta [ 'gdpr_agreement_time' ] = time();
448 }
449
450 // Format data
451 $user = sanitize_user( $username, true );
452 if( is_multisite() )
453 $user = preg_replace( '/\s+/', '', $user );
454
455 $user_email = sanitize_email( $user_email );
456 $activation_key = substr( md5( time() . rand() . $user_email ), 0, 16 );
457 $meta = serialize( $meta );
458
459 // change User Registered date and time according to timezone selected in WordPress settings
460 $wppb_get_date = wppb_get_register_date();
461
462 if( isset( $wppb_get_date ) ) {
463 $wppb_user_registered = $wppb_get_date;
464 } else {
465 $wppb_user_registered = current_time( 'mysql', true );
466 }
467
468 if ( is_multisite() )
469 $wpdb->insert( $wpdb->signups, array('domain' => '', 'path' => '', 'title' => '', 'user_login' => $user, 'user_email' => $user_email, 'registered' => $wppb_user_registered, 'activation_key' => $activation_key, 'meta' => $meta ) );
470 else
471 $wpdb->insert( $wpdb->prefix.'signups', array('domain' => '', 'path' => '', 'title' => '', 'user_login' => $user, 'user_email' => $user_email, 'registered' => $wppb_user_registered, 'activation_key' => $activation_key, 'meta' => $meta ) );
472
473 do_action ( 'wppb_signup_user', $username, $user_email, $activation_key, $meta );
474
475 wppb_signup_user_notification( $username, $user_email, $activation_key, $meta );
476 }
477
478 /**
479 * Notify user of signup success.
480 *
481 * Filter 'wppb_signup_user_notification_filter' to bypass this function or
482 * replace it with your own notification behavior.
483 *
484 * Filter 'wppb_signup_user_notification_email' and
485 * 'wppb_signup_user_notification_subject' to change the content
486 * and subject line of the email sent to newly registered users.
487 *
488 * @param string $user The user's login name.
489 * @param string $user_email The user's email address.
490 * @param array $meta By default, an empty array.
491 * @param string $activation_key The activation key created in wppb_signup_user()
492 * @return bool
493 */
494 function wppb_signup_user_notification( $user, $user_email, $activation_key, $meta = '' ) {
495 if ( !apply_filters( 'wppb_signup_user_notification_filter', $user, $user_email, $activation_key, $meta ) )
496 return false;
497
498 $wppb_general_settings = get_option( 'wppb_general_settings' );
499 $admin_email = get_site_option( 'admin_email' );
500
501 $from_name = apply_filters ( 'wppb_signup_user_notification_email_from_field', get_bloginfo( 'name' ) );
502
503 //we don't use this anymore do we ?
504 /*$message_headers = apply_filters ( 'wppb_signup_user_notification_from', "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n" );*/
505
506 if( isset( $wppb_general_settings['activationLandingPage'] ) && !empty( $wppb_general_settings['activationLandingPage'] ) ) {
507 $registration_page_url = add_query_arg( array('activation_key' => $activation_key), get_permalink( $wppb_general_settings['activationLandingPage'] ) );
508 } else {
509 $registration_page_url = 'not_set';
510 }
511
512 $registration_page_url = apply_filters( 'wppb_ec_landing_page', $registration_page_url, $user, $activation_key, $meta );
513
514 if ( $registration_page_url == 'not_set' ){
515 global $post;
516 if( !empty( $post->ID ) )
517 $permalink = get_permalink( $post->ID );
518 else
519 $permalink = get_bloginfo( 'url' );
520
521 if( !empty( $post->post_content ) )
522 $post_content = $post->post_content;
523 else
524 $post_content = '';
525
526 $registration_page_url = ( ( ( strpos( $post_content, '[wppb-register' ) !== false ) || ( strpos( $post_content, '<!-- wp:wppb/register' ) !== false ) ) ? add_query_arg( array( 'activation_key' => $activation_key ), $permalink ) : add_query_arg( array( 'activation_key' => $activation_key ), get_bloginfo( 'url' ) ) );
527 }
528
529 $wppb_generalSettings = get_option( 'wppb_general_settings' );
530
531 if( !empty( $wppb_generalSettings['loginWith'] ) && $wppb_generalSettings['loginWith'] == 'email' ) {
532 $display_username_email = $user_email;
533 }
534 else {
535 $display_username_email = $user;
536 }
537
538 $subject = sprintf( __( '[%1$s] Activate %2$s', 'profile-builder'), $from_name, $display_username_email );
539 $subject = apply_filters( 'wppb_signup_user_notification_email_subject', $subject, $user_email, $user, $activation_key, $registration_page_url, $meta, $from_name, 'wppb_user_emailc_registr_w_email_confirm_email_subject' );
540
541 $message = sprintf( __( "To activate your user, please click the following link:<br><br>%s%s%s<br><br>After you activate it you will receive yet *another email* with your login.", "profile-builder" ), '<a href="'.$registration_page_url.'">', $registration_page_url, '</a>' );
542 $message = apply_filters( 'wppb_signup_user_notification_email_content', $message, $user_email, $user, $activation_key, $registration_page_url, $meta, $from_name, 'wppb_user_emailc_registr_w_email_confirm_email_content' );
543
544 $message_context = 'email_user_activate';
545
546 wppb_mail( $user_email, $subject, $message, $from_name, $message_context );
547
548 return true;
549 }
550
551
552 /**
553 * Activate a signup.
554 *
555 *
556 * @param string $activation_key The activation key provided to the user.
557 * @return array An array containing information about the activated user and/or blog
558 */
559 function wppb_manual_activate_signup( $activation_key ) {
560 global $wpdb;
561
562 if ( is_multisite() )
563 $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE activation_key = %s", $activation_key ) );
564 else
565 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM ".$wpdb->prefix."signups WHERE activation_key = %s", $activation_key) );
566
567 if ( !empty( $signup ) && !$signup->active ){
568 $meta = unserialize( $signup->meta );
569 $user_login = esc_sql( $signup->user_login );
570 $user_email = esc_sql( $signup->user_email );
571 /* Signup meta holds the real password hash, applied after user creation. WordPress requires a non-empty user_pass when creating users. */
572 $password = '';
573
574 $user_id = username_exists($user_login);
575
576 if ( ! $user_id ) {
577 $user_id = wppb_create_user( $user_login, wp_generate_password( 24, true, true ), $user_email );
578 }
579 else
580 $user_already_exists = true;
581
582 if ( !$user_id )
583 return __( 'Could not create user!', 'profile-builder' );
584
585 elseif ( isset( $user_already_exists ) && ( $user_already_exists == true ) )
586 return __( 'That username is already activated!', 'profile-builder' );
587
588 else{
589 $now = current_time('mysql', true);
590
591 $retVal = ( is_multisite() ? $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $activation_key) ) : $wpdb->update( $wpdb->base_prefix.'signups', array('active' => 1, 'activated' => $now), array('activation_key' => $activation_key) ) );
592
593 wppb_add_meta_to_user_on_activation( $user_id, '', $meta );
594
595 if( apply_filters( 'wppb_admin_email_confirmation_maybe_use_admin_approval', false ) ) {
596 // if admin approval is activated, then block the user until he gets approved
597 $wppb_generalSettings = get_option('wppb_general_settings');
598 if( wppb_get_admin_approval_option_value() === 'yes' ){
599 wppb_update_user_status_to_pending( $user_id, $wppb_generalSettings );
600 }
601 }
602
603 /* copy the hashed password from signup meta to wp user table */
604 if( !empty( $meta['user_pass'] ) ){
605 /* we might still have the base64 encoded password in signups and not the hash */
606 if( base64_encode(base64_decode($meta['user_pass'], true)) === $meta['user_pass'] )
607 $meta['user_pass'] = wp_hash_password( $meta['user_pass'] );
608
609 $wpdb->update( $wpdb->users, array('user_pass' => $meta['user_pass'] ), array('ID' => $user_id) );
610 //This is required so that the APC cached data is updated with the new password. Thanks to @foliovision
611 wp_cache_delete( $user_id, 'users' );
612 }
613
614 wppb_notify_user_registration_email( get_bloginfo( 'name' ), $user_login, $user_email, 'sending', $password, ( wppb_get_admin_approval_option_value() === 'yes' ? 'yes' : 'no' ) );
615
616 do_action('wppb_activate_user', $user_id, $password, $meta);
617 return ( $retVal ? 'ok' : __( 'There was an error while trying to activate the user', 'profile-builder' ) );
618 }
619 }
620 }
621
622 /**
623 * Create a user.
624 *
625 * @param string $user_name The new user's login name.
626 * @param string $password The new user's password.
627 * @param string $email The new user's email address.
628 * @return mixed Returns false on failure, or int $user_id on success
629 */
630 function wppb_create_user( $user_name, $password, $email) {
631 if( is_email( $user_name ) )
632 $user_name = apply_filters( 'wppb_generated_random_username', Wordpress_Creation_Kit_PB::wck_generate_slug( trim( $user_name ) ), $user_name );
633 else {
634 $user_name = sanitize_user($user_name, true);
635 if( is_multisite() )
636 $user_name = preg_replace( '/\s+/', '', $user_name );
637 }
638
639
640 $user_id = wp_create_user( $user_name, $password, $email );
641 if ( is_wp_error($user_id) )
642 return false;
643
644 // Newly created users have no roles or caps until they are added to a blog.
645 delete_user_option( $user_id, 'capabilities' );
646 delete_user_option( $user_id, 'user_level' );
647
648 do_action( 'wppb_new_user', $user_id );
649
650 return $user_id;
651 }
652
653 //send an email to the admin regarding each and every new subscriber, and - if selected - to the user himself
654 function wppb_notify_user_registration_email( $bloginfo, $user_name, $email, $send_credentials_via_email, $password, $adminApproval ){
655
656 /* if login with email is enabled user_name gets the value of the users email */
657 $wppb_general_settings = get_option( 'wppb_general_settings' );
658 if ( isset( $wppb_general_settings['loginWith'] ) && ( $wppb_general_settings['loginWith'] == 'email' ) ) {
659 $user_name = $email;
660 }
661
662 //send email to the admin
663 $message_from = apply_filters( 'wppb_register_from_email_message_admin_email', $bloginfo );
664
665 $message_subject = '['.$message_from.'] '.__( 'A new subscriber has (been) registered!', 'profile-builder' );
666 $message_subject = apply_filters ('wppb_register_admin_email_subject_without_admin_approval', $message_subject, $email, $password, $message_from, 'wppb_admin_emailc_default_registration_email_subject' );
667
668 $message_content = sprintf( __( 'New subscriber on %1$s.<br/><br/>Username:%2$s<br/>Email:%3$s<br/>', 'profile-builder'), $message_from, $user_name, $email );
669
670 $message_context = 'email_admin_new_subscriber';
671
672 if ( $adminApproval == 'yes' ) {
673 $user_data = get_user_by( 'email', $email );
674
675 $wppb_generalSettings = get_option( 'wppb_general_settings', 'not_found' );
676
677 $adminApproval_mailAdmin = 0;
678
679 if( $wppb_generalSettings != 'not_found' && ! empty( $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
680
681 if( !empty( $user_data->roles ) ) {
682 foreach( $user_data->roles as $role ) {
683 if( in_array( $role, $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
684 if( ! current_user_can( 'delete_users' ) ) {
685 $adminApproval_mailAdmin = 1;
686 }
687 }
688 }
689 }
690
691 } else {
692 if( ! current_user_can( 'delete_users' ) ) {
693 $adminApproval_mailAdmin = 1;
694 }
695 }
696
697 if( $adminApproval_mailAdmin == 1 ) {
698 $message_subject = apply_filters( 'wppb_register_admin_email_subject_with_admin_approval', $message_subject, $email, $password, $message_from, 'wppb_admin_emailc_registration_with_admin_approval_email_subject' );
699
700 $message_content .= wppb_adminApproval_adminEmailContent();
701 $message_content = apply_filters( 'wppb_register_admin_email_message_with_admin_approval', $message_content, $email, $password, $message_from, 'wppb_admin_emailc_registration_with_admin_approval_email_content' );
702
703 $message_context = 'email_admin_approve';
704 }
705 else{
706 $message_content = apply_filters( 'wppb_register_admin_email_message_without_admin_approval', $message_content, $email, $password, $message_from, 'wppb_admin_emailc_default_registration_email_content' );
707 }
708 } else {
709 $message_content = apply_filters( 'wppb_register_admin_email_message_without_admin_approval', $message_content, $email, $password, $message_from, 'wppb_admin_emailc_default_registration_email_content' );
710 }
711
712 if ( trim( $message_content ) != '' ){
713 $admin_email = apply_filters('wppb_send_to_admin_email', get_option('admin_email'), get_user_by( 'email', $email ), $message_context);
714 wppb_mail( $admin_email, $message_subject, $message_content, $message_from, $message_context );
715 }
716
717
718
719 //send an email to the newly registered user, if this option was selected
720 if ( isset( $send_credentials_via_email ) && ( $send_credentials_via_email == 'sending' ) ){
721 $user_message_from = apply_filters( 'wppb_register_from_email_message_user_email', $bloginfo );
722
723 $user_message_subject = sprintf( __( '[%1$s] Your new account information', 'profile-builder' ), $user_message_from, $user_name, $password );
724 $user_message_subject = apply_filters( 'wppb_register_user_email_subject_without_admin_approval', $user_message_subject, $email, $password, $user_message_from, 'wppb_user_emailc_default_registration_email_subject' );
725
726 if ( $password === NULL ) {
727 $password = __( 'Your selected password at signup', 'profile-builder' );
728 }
729
730 $send_password = apply_filters( 'wppb_send_password_in_default_email_message', false );
731 $site_url = '<a href="'. home_url() .'"> ' . home_url() . ' </a>';
732 if( !$send_password )
733 $user_message_content = sprintf( __( 'Welcome to %1$s!<br/><br/><br/>Your username is: %2$s and your password is the one that you have selected during registration.<br/><br/>Access your account: %3$s ', 'profile-builder' ), $user_message_from, $user_name, $site_url );
734 else
735 $user_message_content = sprintf( __( 'Welcome to %1$s!<br/><br/><br/>Your username is: %2$s and the password: %3$s<br/><br/>Access your account: %4$s ', 'profile-builder' ), $user_message_from, $user_name, $password, $site_url );
736
737 if ( $password === __( 'Your selected password at signup', 'profile-builder' ) ) {
738 $password = NULL;
739 }
740
741 $user_message_context = 'email_user_account_info';
742
743 if ( $adminApproval == 'yes' ){
744 $user_data = get_user_by( 'email', $email );
745
746 $wppb_generalSettings = get_option( 'wppb_general_settings', 'not_found' );
747
748 $adminApproval_mailUser = 0;
749
750 if( $wppb_generalSettings != 'not_found' && ! empty( $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
751 foreach( $user_data->roles as $role ) {
752 if( in_array( $role, $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
753 if( ! current_user_can( 'delete_users' ) ) {
754 $adminApproval_mailUser = 1;
755 }
756 }
757 }
758 } else {
759 if( ! current_user_can( 'delete_users' ) ) {
760 $adminApproval_mailUser = 1;
761 }
762 }
763
764 if( $adminApproval_mailUser == 1 ) {
765 $user_message_subject = apply_filters( 'wppb_register_user_email_subject_with_admin_approval', $user_message_subject, $email, $password, $user_message_subject, 'wppb_user_emailc_registration_with_admin_approval_email_subject' );
766
767 $user_message_content .= wppb_adminApproval_userEmailContent();
768
769 $user_message_context = 'email_user_need_approval';
770
771 $user_message_content = apply_filters( 'wppb_register_user_email_message_with_admin_approval', $user_message_content, $email, $password, $user_message_subject, 'wppb_user_emailc_registration_with_admin_approval_email_content' );
772 }
773 else{
774 $user_message_content = apply_filters( 'wppb_register_user_email_message_without_admin_approval', $user_message_content, $email, $password, $user_message_subject, 'wppb_user_emailc_default_registration_email_content' );
775 }
776 } else
777 $user_message_content = apply_filters( 'wppb_register_user_email_message_without_admin_approval', $user_message_content, $email, $password, $user_message_subject, 'wppb_user_emailc_default_registration_email_content' );
778
779 $message_sent = wppb_mail( $email, $user_message_subject, $user_message_content, $user_message_from, $user_message_context );
780
781 return ( ( $message_sent ) ? 2 : 1 );
782 }
783 }
784
785
786 // function with content to be added in email sent to admin if "Admin Approval" is on
787 function wppb_adminApproval_adminEmailContent() {
788 $emailContent = '<br/>' . __( 'The "Admin Approval" feature was activated at the time of registration, so please remember that you need to approve this user before he/she can log in!', 'profile-builder') ."\r\n";
789
790 return $emailContent;
791 }
792
793
794 // function with content to be added in email sent to user if "Admin Approval" is on
795 function wppb_adminApproval_userEmailContent() {
796 $emailContent = '<br/><br/>' . __( 'Before you can access your account, an administrator needs to approve it. You will be notified via email.', 'profile-builder' );
797
798 return $emailContent;
799 }
800 // END FUNCTIONS USED BOTH ON THE REGISTRATION PAGE AND THE EMAIL CONFIRMATION TABLE
801
802
803 // Set up the AJAX hooks
804 add_action( 'wp_ajax_wppb_get_unconfirmed_email_number', 'wppb_get_unconfirmed_email_number' );
805 add_action( 'wp_ajax_wppb_handle_email_confirmation_cases', 'wppb_handle_email_confirmation_cases' );
806
807
808 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
809 if( $wppb_general_settings != 'not_found' ){
810
811 if( !empty($wppb_general_settings['emailConfirmation'] ) && ( $wppb_general_settings['emailConfirmation'] == 'yes' ) ){
812 if ( is_multisite() ){
813 /* don't display on network admin */
814 if( isset($_SERVER['SCRIPT_NAME']) && strpos( sanitize_text_field( $_SERVER['SCRIPT_NAME'] ), 'users.php') && !is_network_admin() ){ //global $pagenow doesn't seem to work
815 add_action( 'admin_head', 'wppb_add_pending_users_header_script' );
816 }
817 }else{
818 global $pagenow;
819 // the Unconfirmed Email Address submenu page is added to profile.php if the user does not have the
820 // list_users capability so we also check for it
821 if ( $pagenow == 'users.php' || $pagenow == 'profile.php' ){
822 add_action( 'admin_head', 'wppb_add_pending_users_header_script' );
823 }
824 }
825
826 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists ( WPPB_PAID_PLUGIN_DIR . '/features/admin-approval/admin-approval.php' ) )
827 add_action( 'user_register', 'wppb_update_user_status_on_admin_registration' );
828 }
829
830 }
831