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

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

830 lines 38.3 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
147 jQuery(document).on('click', 'a.wppb-ec-action', function(e) {
148 e.preventDefault();
149 var link = jQuery(this);
150 confirmECAction(
151 link.attr('data-url'),
152 link.attr('data-todo'),
153 link.attr('data-email'),
154 link.attr('data-message')
155 );
156 });
157 </script>
158 <?php
159 }
160
161 function wppb_get_unconfirmed_email_number(){
162
163 if( !current_user_can( 'edit_users' ) )
164 die();
165
166 global $wpdb;
167
168 /* since version 2.0.7 for multisite we add a 'registered_for_blog_id' meta in the registration process
169 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 */
170 $number_of_users = 0;
171 $results = $wpdb->get_results("SELECT * FROM ".$wpdb->base_prefix."signups WHERE active = 0");
172 foreach ($results as $result){
173 if( !empty( $result->meta ) ){
174 $user_meta = maybe_unserialize( $result->meta );
175 if( empty( $user_meta['registered_for_blog_id'] ) || $user_meta['registered_for_blog_id'] == get_current_blog_id() ){
176 $number_of_users++;
177 }
178 }
179 }
180
181 header( 'Content-type: application/json' );
182 die( json_encode( array( 'number' => $number_of_users ) ) );
183 }
184
185
186 function wppb_handle_email_confirmation_cases() {
187 global $wpdb;
188
189 if( !isset( $_POST['nonce'] ) || !wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'wppb_handle_email_confirmation' ) )
190 die( esc_html__("You either don't have permission for that action or there was an error!", "profile-builder") );
191
192 $todo = isset( $_POST['todo'] ) ? sanitize_text_field( $_POST['todo'] ) : '';
193 $user_email = isset( $_POST['user_email'] ) ? sanitize_email($_POST['user_email']) : '';
194
195 if ( current_user_can( apply_filters( 'wppb_email_confirmation_user_capability', 'manage_options' ) ) )
196 if ( ( $todo != '' ) && ( $user_email != '' ) ){
197
198 $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $wpdb->base_prefix . "signups WHERE active = 0 AND user_email = %s", $user_email ) );
199
200 if ( count( $results ) != 1 )
201 die( esc_html__( "There was an error performing that action!", "profile-builder" ) );
202
203 elseif ( $todo == 'delete' ){
204
205 if( !empty( $results[0]->user_login ) && !empty( $results[0]->user_email ) ){
206 $sql_result = $wpdb->delete( $wpdb->base_prefix.'signups', array( 'user_login' => $results[0]->user_login, 'user_email' => $results[0]->user_email ) );
207 }
208
209 if ( $sql_result )
210 die( 'ok' );
211 else
212 die( esc_html__( "The selected user couldn't be deleted", "profile-builder" ) );
213
214 }elseif ( $todo == 'confirm' ){
215 die( wppb_manual_activate_signup( $results[0]->activation_key ) );/* phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ /* escaped inside the function */
216
217 }elseif ( $todo == 'resend' ){
218 $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 );
219
220 if ( $sql_result ){
221 wppb_signup_user_notification( trim( $sql_result['user_login'] ), trim( $sql_result['user_email'] ), $sql_result['activation_key'], $sql_result['meta'] );
222
223 die( esc_html__( "Email notification resent to user", "profile-builder" ) );
224 }
225
226 }
227 }
228
229 die( esc_html__("You either don't have permission for that action or there was an error!", "profile-builder") );
230 }
231
232
233
234 // FUNCTIONS USED BOTH ON THE REGISTRATION PAGE AND THE EMAIL CONFIRMATION TABLE
235
236 // Hook to add AP user meta after signup autentification
237 add_action( 'wpmu_activate_user', 'wppb_add_meta_to_user_on_activation', 10, 3 );
238
239 //function that adds AP user meta after signup autentification and it is also used when editing the user uprofile
240 function wppb_add_meta_to_user_on_activation( $user_id, $password, $meta ){
241 $user = new WP_User( $user_id );
242
243 //copy the data from the meta field (default fields)
244 if( !empty( $meta['first_name'] ) )
245 update_user_meta( $user_id, 'first_name', $meta['first_name'] );
246 if( !empty( $meta['last_name'] ) )
247 update_user_meta( $user_id, 'last_name', $meta['last_name'] );
248 if( !empty( $meta['nickname'] ) )
249 update_user_meta( $user_id, 'nickname', $meta['nickname'] );
250 if( !empty( $meta['user_url'] ) )
251 wp_update_user(array('ID' => $user_id, 'user_url' => $meta['user_url']));
252 if( !empty( $meta['aim'] ) )
253 update_user_meta( $user_id, 'aim', $meta['aim'] );
254 if( !empty( $meta['yim'] ) )
255 update_user_meta( $user_id, 'yim', $meta['yim'] );
256 if( !empty( $meta['jabber'] ) )
257 update_user_meta( $user_id, 'jabber', $meta['jabber'] );
258 if( !empty( $meta['description'] ) )
259 update_user_meta( $user_id, 'description', $meta['description'] );
260
261 if( !empty( $meta['role'] ) )
262 $user->set_role( $meta['role'] ); //update the users role (s)he registered for
263
264 if( !empty( $meta['first_name'] ) && !empty( $meta['last_name'] ) )
265 wp_update_user(array('ID' => $user_id, 'display_name' => $meta['first_name'].' '.$meta['last_name'] ));
266 else if( !empty( $meta['nickname'] ) )
267 wp_update_user(array('ID' => $user_id, 'display_name' => $meta['nickname'] ));
268
269 //copy the data from the meta fields (custom fields)
270 $manage_fields = apply_filters( 'wppb_form_fields', get_option( 'wppb_manage_fields', 'not_set' ), array( 'meta' => $meta, 'user_id' => $user_id, 'context' => 'user_activation' ) );
271 if ( $manage_fields != 'not_set' ){
272 foreach ( $manage_fields as $key => $value){
273 switch ( $value['field'] ) {
274 case 'Input':
275 case 'Input (Hidden)':
276 case 'Checkbox':
277 case 'Checkbox (Terms and Conditions)':
278 case 'Radio':
279 case 'Select':
280 case 'Select (Country)':
281 case 'Select (Multiple)':
282 case 'Select (Timezone)':
283 case 'Datepicker':
284 case 'Textarea':{
285 if ( isset( $meta[$value['meta-name']] ) )
286 update_user_meta( $user_id, $value['meta-name'], trim( $meta[$value['meta-name']] ) );
287 break;
288 }
289 case 'Timepicker':{
290 if ( isset( $meta[$value['meta-name']] ) ) {
291 $time = $meta[$value['meta-name']];
292 if( !empty( $time['hours'] ) && !empty( $time['minutes'] ) ) {
293 update_user_meta( $user_id, $value['meta-name'], $time['hours'] . ':' . $time['minutes'] );
294 }
295
296 }
297 break;
298 }
299 case 'Map':{
300 if ( isset( $meta[$value['meta-name']] ) ) {
301 // Add new markers
302 if( is_array( $meta[$value['meta-name']] ) ) {
303 foreach( $meta[$value['meta-name']] as $key => $position )
304 update_user_meta( $user_id, $value['meta-name'] . '_' . $key, $position );
305 }
306 }
307 break;
308 }
309 case 'Upload':{
310 if ( isset( $meta[$value['meta-name']] ) ){
311 if( !empty( $meta[$value['meta-name']] ) ) {
312 if (is_numeric($meta[$value['meta-name']])) {
313 wppb_save_attachment_id( trim( $meta[$value['meta-name']] ), $value, $user_id );
314 } else {
315 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
316
317 $file = trim($meta[$value['meta-name']]);
318 $file_name = substr($file, strpos($file, '_attachment_') + 12);
319
320 $random_user_number = apply_filters('wppb_register_wpmu_upload_random_user_number2', substr(md5($user->data->user_email), 0, 12), $user, $meta);
321
322 $old_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/attachments/' . substr($file, strpos($file, 'wpmuRandomID_'));
323 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
324 $old_path_on_disk = str_replace('\\', '/', $old_path_on_disk);
325
326 $new_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/attachments/userID_' . $user_id . '_attachment_' . $file_name;
327 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
328 $new_path_on_disk = str_replace('\\', '/', $new_path_on_disk);
329
330 if (rename($old_path_on_disk, $new_path_on_disk))
331 update_user_meta($user_id, $value['meta-name'], $wp_upload_array['baseurl'] . '/profile_builder/attachments/userID_' . $user_id . '_attachment_' . $file_name);
332 }
333 }
334 else{
335 update_user_meta( $user_id, $value['meta-name'], '' );
336 }
337 }
338 break;
339 }
340 case 'Avatar':{
341 if ( isset( $meta[$value['meta-name']] ) ) {
342 if( !empty( $meta[$value['meta-name']] ) ) {
343 if (is_numeric($meta[$value['meta-name']])) {
344 wppb_save_attachment_id( trim( $meta[$value['meta-name']] ), $value, $user_id );
345 } else {
346 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
347
348 $file = trim($meta[$value['meta-name']]);
349 $file_name = substr($file, strpos($file, '_originalAvatar_') + 16);
350
351 $random_user_number = apply_filters('wppb_register_wpmu_avatar_random_user_number2', substr(md5($user->data->user_email), 0, 12), $user, $meta);
352
353 $old_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/avatars/' . substr($file, strpos($file, 'wpmuRandomID_'));
354 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
355 $old_path_on_disk = str_replace('\\', '/', $old_path_on_disk);
356
357 $new_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/avatars/userID_' . $user_id . '_originalAvatar_' . $file_name;
358 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
359 $new_path_on_disk = str_replace('\\', '/', $new_path_on_disk);
360
361 if (rename($old_path_on_disk, $new_path_on_disk)) {
362 $wp_filetype = wp_check_filetype(basename($file_name), null);
363 $attachment = array('post_mime_type' => $wp_filetype['type'],
364 'post_title' => $file_name,
365 'post_content' => '',
366 'post_status' => 'inherit'
367 );
368
369 $attach_id = wp_insert_attachment($attachment, $new_path_on_disk);
370
371 $avatar = image_downsize($attach_id, 'thumbnail');
372
373 update_user_meta($user_id, $value['meta-name'], $avatar[0]);
374 update_user_meta($user_id, 'avatar_directory_path_' . $value['id'], $new_path_on_disk);
375 update_user_meta($user_id, 'resized_avatar_' . $value['id'] . '_relative_path', $new_path_on_disk);
376 wppb_resize_avatar($user_id);
377 }
378 }
379 }
380 else{
381 update_user_meta( $user_id, $value['meta-name'], '' );
382 }
383 break;
384 }
385 }
386 case 'Default - Blog Details':{
387 if ( is_multisite() && isset( $meta['wppb_create_new_site_checkbox'] ) && $meta['wppb_create_new_site_checkbox'] == 'yes' ) {
388 $blog_url = $meta['wppb_blog_url'];
389 $blog_title = $meta['wppb_blog_title'];
390
391 $privacy['public'] = ( isset( $meta['wppb_blog_privacy'] ) && 'Yes' == $meta['wppb_blog_privacy'] ) ? true : false;
392 $blog_details = wpmu_validate_blog_signup( $blog_url, $blog_title );
393 if ( empty($blog_details['errors']->errors['blogname']) && empty($blog_details['errors']->errors['blog_title'])) {
394 wpmu_create_blog( $blog_details['domain'], $blog_details['path'], $blog_details['blog_title'], $user_id, $privacy );
395 }
396 }
397 }
398 case 'Select2 (Multiple)':{
399
400 $selected_values = '';
401 if (!empty($meta[wppb_handle_meta_name($value['meta-name'])]) && is_array($meta[wppb_handle_meta_name($value['meta-name'])])) {
402 foreach ($meta[wppb_handle_meta_name($value['meta-name'])] as $selected_key => $selected_value)
403 $selected_values .= sanitize_text_field($selected_value) . ',';
404 }
405
406 update_user_meta( $user_id, $value['meta-name'], trim( $selected_values, ',' ) );
407 }
408 case 'GDPR Checkbox':{
409 if ( isset($meta[wppb_handle_meta_name($value['meta-name'])]) ) {
410 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') {
411 update_user_meta($user_id, $value['meta-name'], $meta[$value['meta-name']]);
412 if (isset($meta['gdpr_agreement_time']) && !empty($meta['gdpr_agreement_time'])) {
413 update_user_meta($user_id, 'gdpr_agreement_time', $meta['gdpr_agreement_time']);
414 }
415 }
416 }
417 }
418 default: {
419 if ( isset( $meta[$value['meta-name']] ) ) {
420 update_user_meta($user_id, $value['meta-name'], $meta[$value['meta-name']]);
421 }
422 do_action('wppb_add_meta_on_user_activation_' . Wordpress_Creation_Kit_PB::wck_generate_slug($value['field']), $user_id, $password, $meta, $value);
423 }
424 }
425 }
426 }
427 do_action( 'wppb_add_other_meta_on_user_activation', $user_id, $meta );
428 }
429
430
431 // function to add the new user to the signup table if email confirmation is selected as active or it is a wpmu installation
432 function wppb_signup_user( $username, $user_email, $login_after_register, $meta = '' ) {
433 global $wpdb;
434
435 // check for automatic login
436 // using case-insensitive string comparison to allow for both 'Yes' and 'yes'
437 if( strcasecmp($login_after_register, 'Yes') === 0 ) {
438 $login_after_register = true;
439 } else {
440 $login_after_register = false;
441 }
442 $meta [ 'wppb_login_after_register_'.$meta['user_login'] ] = $login_after_register;
443
444 // save the gdpr_agreement_time if necessary
445 if ( array_key_exists('user_consent_gdpr', $meta) && $meta [ 'user_consent_gdpr' ] === 'agree' ) {
446 $meta [ 'gdpr_agreement_time' ] = time();
447 }
448
449 // Format data
450 $user = sanitize_user( $username, true );
451 if( is_multisite() )
452 $user = preg_replace( '/\s+/', '', $user );
453
454 $user_email = sanitize_email( $user_email );
455 $activation_key = substr( md5( time() . rand() . $user_email ), 0, 16 );
456 $meta = serialize( $meta );
457
458 // change User Registered date and time according to timezone selected in WordPress settings
459 $wppb_get_date = wppb_get_register_date();
460
461 if( isset( $wppb_get_date ) ) {
462 $wppb_user_registered = $wppb_get_date;
463 } else {
464 $wppb_user_registered = current_time( 'mysql', true );
465 }
466
467 if ( is_multisite() )
468 $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 ) );
469 else
470 $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 ) );
471
472 do_action ( 'wppb_signup_user', $username, $user_email, $activation_key, $meta );
473
474 wppb_signup_user_notification( $username, $user_email, $activation_key, $meta );
475 }
476
477 /**
478 * Notify user of signup success.
479 *
480 * Filter 'wppb_signup_user_notification_filter' to bypass this function or
481 * replace it with your own notification behavior.
482 *
483 * Filter 'wppb_signup_user_notification_email' and
484 * 'wppb_signup_user_notification_subject' to change the content
485 * and subject line of the email sent to newly registered users.
486 *
487 * @param string $user The user's login name.
488 * @param string $user_email The user's email address.
489 * @param array $meta By default, an empty array.
490 * @param string $activation_key The activation key created in wppb_signup_user()
491 * @return bool
492 */
493 function wppb_signup_user_notification( $user, $user_email, $activation_key, $meta = '' ) {
494 if ( !apply_filters( 'wppb_signup_user_notification_filter', $user, $user_email, $activation_key, $meta ) )
495 return false;
496
497 $wppb_general_settings = get_option( 'wppb_general_settings' );
498 $admin_email = get_site_option( 'admin_email' );
499
500 $from_name = apply_filters ( 'wppb_signup_user_notification_email_from_field', get_bloginfo( 'name' ) );
501
502 //we don't use this anymore do we ?
503 /*$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" );*/
504
505 if( isset( $wppb_general_settings['activationLandingPage'] ) && !empty( $wppb_general_settings['activationLandingPage'] ) ) {
506 $registration_page_url = add_query_arg( array('activation_key' => $activation_key), get_permalink( $wppb_general_settings['activationLandingPage'] ) );
507 } else {
508 $registration_page_url = 'not_set';
509 }
510
511 $registration_page_url = apply_filters( 'wppb_ec_landing_page', $registration_page_url, $user, $activation_key, $meta );
512
513 if ( $registration_page_url == 'not_set' ){
514 global $post;
515 if( !empty( $post->ID ) )
516 $permalink = get_permalink( $post->ID );
517 else
518 $permalink = get_bloginfo( 'url' );
519
520 if( !empty( $post->post_content ) )
521 $post_content = $post->post_content;
522 else
523 $post_content = '';
524
525 $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' ) ) );
526 }
527
528 $wppb_generalSettings = get_option( 'wppb_general_settings' );
529
530 if( !empty( $wppb_generalSettings['loginWith'] ) && $wppb_generalSettings['loginWith'] == 'email' ) {
531 $display_username_email = $user_email;
532 }
533 else {
534 $display_username_email = $user;
535 }
536
537 $subject = sprintf( __( '[%1$s] Activate %2$s', 'profile-builder'), $from_name, $display_username_email );
538 $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' );
539
540 $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>' );
541 $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' );
542
543 $message_context = 'email_user_activate';
544
545 wppb_mail( $user_email, $subject, $message, $from_name, $message_context );
546
547 return true;
548 }
549
550
551 /**
552 * Activate a signup.
553 *
554 *
555 * @param string $activation_key The activation key provided to the user.
556 * @return array An array containing information about the activated user and/or blog
557 */
558 function wppb_manual_activate_signup( $activation_key ) {
559 global $wpdb;
560
561 if ( is_multisite() )
562 $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE activation_key = %s", $activation_key ) );
563 else
564 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM ".$wpdb->prefix."signups WHERE activation_key = %s", $activation_key) );
565
566 if ( !empty( $signup ) && !$signup->active ){
567 $meta = unserialize( $signup->meta );
568 $user_login = esc_sql( $signup->user_login );
569 $user_email = esc_sql( $signup->user_email );
570 /* Signup meta holds the real password hash, applied after user creation. WordPress requires a non-empty user_pass when creating users. */
571 $password = '';
572
573 $user_id = username_exists($user_login);
574
575 if ( ! $user_id ) {
576 $user_id = wppb_create_user( $user_login, wp_generate_password( 24, true, true ), $user_email );
577 }
578 else
579 $user_already_exists = true;
580
581 if ( !$user_id )
582 return __( 'Could not create user!', 'profile-builder' );
583
584 elseif ( isset( $user_already_exists ) && ( $user_already_exists == true ) )
585 return __( 'That username is already activated!', 'profile-builder' );
586
587 else{
588 $now = current_time('mysql', true);
589
590 $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) ) );
591
592 wppb_add_meta_to_user_on_activation( $user_id, '', $meta );
593
594 if( apply_filters( 'wppb_admin_email_confirmation_maybe_use_admin_approval', false ) ) {
595 // if admin approval is activated, then block the user until he gets approved
596 $wppb_generalSettings = get_option('wppb_general_settings');
597 if( wppb_get_admin_approval_option_value() === 'yes' ){
598 wppb_update_user_status_to_pending( $user_id, $wppb_generalSettings );
599 }
600 }
601
602 /* copy the hashed password from signup meta to wp user table */
603 if( !empty( $meta['user_pass'] ) ){
604 /* we might still have the base64 encoded password in signups and not the hash */
605 if( base64_encode(base64_decode($meta['user_pass'], true)) === $meta['user_pass'] )
606 $meta['user_pass'] = wp_hash_password( $meta['user_pass'] );
607
608 $wpdb->update( $wpdb->users, array('user_pass' => $meta['user_pass'] ), array('ID' => $user_id) );
609 //This is required so that the APC cached data is updated with the new password. Thanks to @foliovision
610 wp_cache_delete( $user_id, 'users' );
611 }
612
613 wppb_notify_user_registration_email( get_bloginfo( 'name' ), $user_login, $user_email, 'sending', $password, ( wppb_get_admin_approval_option_value() === 'yes' ? 'yes' : 'no' ) );
614
615 do_action('wppb_activate_user', $user_id, $password, $meta);
616 return ( $retVal ? 'ok' : __( 'There was an error while trying to activate the user', 'profile-builder' ) );
617 }
618 }
619 }
620
621 /**
622 * Create a user.
623 *
624 * @param string $user_name The new user's login name.
625 * @param string $password The new user's password.
626 * @param string $email The new user's email address.
627 * @return mixed Returns false on failure, or int $user_id on success
628 */
629 function wppb_create_user( $user_name, $password, $email) {
630 if( is_email( $user_name ) )
631 $user_name = apply_filters( 'wppb_generated_random_username', Wordpress_Creation_Kit_PB::wck_generate_slug( trim( $user_name ) ), $user_name );
632 else {
633 $user_name = sanitize_user($user_name, true);
634 if( is_multisite() )
635 $user_name = preg_replace( '/\s+/', '', $user_name );
636 }
637
638
639 $user_id = wp_create_user( $user_name, $password, $email );
640 if ( is_wp_error($user_id) )
641 return false;
642
643 // Newly created users have no roles or caps until they are added to a blog.
644 delete_user_option( $user_id, 'capabilities' );
645 delete_user_option( $user_id, 'user_level' );
646
647 do_action( 'wppb_new_user', $user_id );
648
649 return $user_id;
650 }
651
652 //send an email to the admin regarding each and every new subscriber, and - if selected - to the user himself
653 function wppb_notify_user_registration_email( $bloginfo, $user_name, $email, $send_credentials_via_email, $password, $adminApproval ){
654
655 /* if login with email is enabled user_name gets the value of the users email */
656 $wppb_general_settings = get_option( 'wppb_general_settings' );
657 if ( isset( $wppb_general_settings['loginWith'] ) && ( $wppb_general_settings['loginWith'] == 'email' ) ) {
658 $user_name = $email;
659 }
660
661 //send email to the admin
662 $message_from = apply_filters( 'wppb_register_from_email_message_admin_email', $bloginfo );
663
664 $message_subject = '['.$message_from.'] '.__( 'A new subscriber has (been) registered!', 'profile-builder' );
665 $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' );
666
667 $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 );
668
669 $message_context = 'email_admin_new_subscriber';
670
671 if ( $adminApproval == 'yes' ) {
672 $user_data = get_user_by( 'email', $email );
673
674 $wppb_generalSettings = get_option( 'wppb_general_settings', 'not_found' );
675
676 $adminApproval_mailAdmin = 0;
677
678 if( $wppb_generalSettings != 'not_found' && ! empty( $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
679
680 if( !empty( $user_data->roles ) ) {
681 foreach( $user_data->roles as $role ) {
682 if( in_array( $role, $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
683 if( ! current_user_can( 'delete_users' ) ) {
684 $adminApproval_mailAdmin = 1;
685 }
686 }
687 }
688 }
689
690 } else {
691 if( ! current_user_can( 'delete_users' ) ) {
692 $adminApproval_mailAdmin = 1;
693 }
694 }
695
696 if( $adminApproval_mailAdmin == 1 ) {
697 $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' );
698
699 $message_content .= wppb_adminApproval_adminEmailContent();
700 $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' );
701
702 $message_context = 'email_admin_approve';
703 }
704 else{
705 $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' );
706 }
707 } else {
708 $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' );
709 }
710
711 if ( trim( $message_content ) != '' ){
712 $admin_email = apply_filters('wppb_send_to_admin_email', get_option('admin_email'), get_user_by( 'email', $email ), $message_context);
713 wppb_mail( $admin_email, $message_subject, $message_content, $message_from, $message_context );
714 }
715
716
717
718 //send an email to the newly registered user, if this option was selected
719 if ( isset( $send_credentials_via_email ) && ( $send_credentials_via_email == 'sending' ) ){
720 $user_message_from = apply_filters( 'wppb_register_from_email_message_user_email', $bloginfo );
721
722 $user_message_subject = sprintf( __( '[%1$s] Your new account information', 'profile-builder' ), $user_message_from, $user_name, $password );
723 $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' );
724
725 if ( $password === NULL ) {
726 $password = __( 'Your selected password at signup', 'profile-builder' );
727 }
728
729 $send_password = apply_filters( 'wppb_send_password_in_default_email_message', false );
730 $site_url = '<a href="'. home_url() .'"> ' . home_url() . ' </a>';
731 if( !$send_password )
732 $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 );
733 else
734 $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 );
735
736 if ( $password === __( 'Your selected password at signup', 'profile-builder' ) ) {
737 $password = NULL;
738 }
739
740 $user_message_context = 'email_user_account_info';
741
742 if ( $adminApproval == 'yes' ){
743 $user_data = get_user_by( 'email', $email );
744
745 $wppb_generalSettings = get_option( 'wppb_general_settings', 'not_found' );
746
747 $adminApproval_mailUser = 0;
748
749 if( $wppb_generalSettings != 'not_found' && ! empty( $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
750 foreach( $user_data->roles as $role ) {
751 if( in_array( $role, $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
752 if( ! current_user_can( 'delete_users' ) ) {
753 $adminApproval_mailUser = 1;
754 }
755 }
756 }
757 } else {
758 if( ! current_user_can( 'delete_users' ) ) {
759 $adminApproval_mailUser = 1;
760 }
761 }
762
763 if( $adminApproval_mailUser == 1 ) {
764 $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' );
765
766 $user_message_content .= wppb_adminApproval_userEmailContent();
767
768 $user_message_context = 'email_user_need_approval';
769
770 $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' );
771 }
772 else{
773 $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' );
774 }
775 } else
776 $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' );
777
778 $message_sent = wppb_mail( $email, $user_message_subject, $user_message_content, $user_message_from, $user_message_context );
779
780 return ( ( $message_sent ) ? 2 : 1 );
781 }
782 }
783
784
785 // function with content to be added in email sent to admin if "Admin Approval" is on
786 function wppb_adminApproval_adminEmailContent() {
787 $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";
788
789 return $emailContent;
790 }
791
792
793 // function with content to be added in email sent to user if "Admin Approval" is on
794 function wppb_adminApproval_userEmailContent() {
795 $emailContent = '<br/><br/>' . __( 'Before you can access your account, an administrator needs to approve it. You will be notified via email.', 'profile-builder' );
796
797 return $emailContent;
798 }
799 // END FUNCTIONS USED BOTH ON THE REGISTRATION PAGE AND THE EMAIL CONFIRMATION TABLE
800
801
802 // Set up the AJAX hooks
803 add_action( 'wp_ajax_wppb_get_unconfirmed_email_number', 'wppb_get_unconfirmed_email_number' );
804 add_action( 'wp_ajax_wppb_handle_email_confirmation_cases', 'wppb_handle_email_confirmation_cases' );
805
806
807 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
808 if( $wppb_general_settings != 'not_found' ){
809
810 if( !empty($wppb_general_settings['emailConfirmation'] ) && ( $wppb_general_settings['emailConfirmation'] == 'yes' ) ){
811 if ( is_multisite() ){
812 /* don't display on network admin */
813 if( isset($_SERVER['SCRIPT_NAME']) && strpos( sanitize_text_field( $_SERVER['SCRIPT_NAME'] ), 'users.php') && !is_network_admin() ){ //global $pagenow doesn't seem to work
814 add_action( 'admin_head', 'wppb_add_pending_users_header_script' );
815 }
816 }else{
817 global $pagenow;
818 // the Unconfirmed Email Address submenu page is added to profile.php if the user does not have the
819 // list_users capability so we also check for it
820 if ( $pagenow == 'users.php' || $pagenow == 'profile.php' ){
821 add_action( 'admin_head', 'wppb_add_pending_users_header_script' );
822 }
823 }
824
825 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists ( WPPB_PAID_PLUGIN_DIR . '/features/admin-approval/admin-approval.php' ) )
826 add_action( 'user_register', 'wppb_update_user_status_on_admin_registration' );
827 }
828
829 }
830