PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 4.0.0
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v4.0.0
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 4.0.0, at features/email-confirmation/email-confirmation.php

819 lines 38.0 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 wppb_save_attachment_id( trim( $meta[$value['meta-name']] ), $value, $user_id );
303 } else {
304 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
305
306 $file = trim($meta[$value['meta-name']]);
307 $file_name = substr($file, strpos($file, '_attachment_') + 12);
308
309 $random_user_number = apply_filters('wppb_register_wpmu_upload_random_user_number2', substr(md5($user->data->user_email), 0, 12), $user, $meta);
310
311 $old_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/attachments/' . substr($file, strpos($file, 'wpmuRandomID_'));
312 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
313 $old_path_on_disk = str_replace('\\', '/', $old_path_on_disk);
314
315 $new_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/attachments/userID_' . $user_id . '_attachment_' . $file_name;
316 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
317 $new_path_on_disk = str_replace('\\', '/', $new_path_on_disk);
318
319 if (rename($old_path_on_disk, $new_path_on_disk))
320 update_user_meta($user_id, $value['meta-name'], $wp_upload_array['baseurl'] . '/profile_builder/attachments/userID_' . $user_id . '_attachment_' . $file_name);
321 }
322 }
323 else{
324 update_user_meta( $user_id, $value['meta-name'], '' );
325 }
326 }
327 break;
328 }
329 case 'Avatar':{
330 if ( isset( $meta[$value['meta-name']] ) ) {
331 if( !empty( $meta[$value['meta-name']] ) ) {
332 if (is_numeric($meta[$value['meta-name']])) {
333 wppb_save_attachment_id( trim( $meta[$value['meta-name']] ), $value, $user_id );
334 } else {
335 $wp_upload_array = wp_upload_dir(); // Array of key => value pairs
336
337 $file = trim($meta[$value['meta-name']]);
338 $file_name = substr($file, strpos($file, '_originalAvatar_') + 16);
339
340 $random_user_number = apply_filters('wppb_register_wpmu_avatar_random_user_number2', substr(md5($user->data->user_email), 0, 12), $user, $meta);
341
342 $old_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/avatars/' . substr($file, strpos($file, 'wpmuRandomID_'));
343 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
344 $old_path_on_disk = str_replace('\\', '/', $old_path_on_disk);
345
346 $new_path_on_disk = $wp_upload_array['basedir'] . '/profile_builder/avatars/userID_' . $user_id . '_originalAvatar_' . $file_name;
347 if (PHP_OS == "WIN32" || PHP_OS == "WINNT")
348 $new_path_on_disk = str_replace('\\', '/', $new_path_on_disk);
349
350 if (rename($old_path_on_disk, $new_path_on_disk)) {
351 $wp_filetype = wp_check_filetype(basename($file_name), null);
352 $attachment = array('post_mime_type' => $wp_filetype['type'],
353 'post_title' => $file_name,
354 'post_content' => '',
355 'post_status' => 'inherit'
356 );
357
358 $attach_id = wp_insert_attachment($attachment, $new_path_on_disk);
359
360 $avatar = image_downsize($attach_id, 'thumbnail');
361
362 update_user_meta($user_id, $value['meta-name'], $avatar[0]);
363 update_user_meta($user_id, 'avatar_directory_path_' . $value['id'], $new_path_on_disk);
364 update_user_meta($user_id, 'resized_avatar_' . $value['id'] . '_relative_path', $new_path_on_disk);
365 wppb_resize_avatar($user_id);
366 }
367 }
368 }
369 else{
370 update_user_meta( $user_id, $value['meta-name'], '' );
371 }
372 break;
373 }
374 }
375 case 'Default - Blog Details':{
376 if ( is_multisite() && isset( $meta['wppb_create_new_site_checkbox'] ) && $meta['wppb_create_new_site_checkbox'] == 'yes' ) {
377 $blog_url = $meta['wppb_blog_url'];
378 $blog_title = $meta['wppb_blog_title'];
379
380 $privacy['public'] = ( isset( $meta['wppb_blog_privacy'] ) && 'Yes' == $meta['wppb_blog_privacy'] ) ? true : false;
381 $blog_details = wpmu_validate_blog_signup( $blog_url, $blog_title );
382 if ( empty($blog_details['errors']->errors['blogname']) && empty($blog_details['errors']->errors['blog_title'])) {
383 wpmu_create_blog( $blog_details['domain'], $blog_details['path'], $blog_details['blog_title'], $user_id, $privacy );
384 }
385 }
386 }
387 case 'Select2 (Multiple)':{
388
389 $selected_values = '';
390 if (!empty($meta[wppb_handle_meta_name($value['meta-name'])]) && is_array($meta[wppb_handle_meta_name($value['meta-name'])])) {
391 foreach ($meta[wppb_handle_meta_name($value['meta-name'])] as $selected_key => $selected_value)
392 $selected_values .= sanitize_text_field($selected_value) . ',';
393 }
394
395 update_user_meta( $user_id, $value['meta-name'], trim( $selected_values, ',' ) );
396 }
397 case 'GDPR Checkbox':{
398 if ( isset($meta[wppb_handle_meta_name($value['meta-name'])]) ) {
399 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') {
400 update_user_meta($user_id, $value['meta-name'], $meta[$value['meta-name']]);
401 if (isset($meta['gdpr_agreement_time']) && !empty($meta['gdpr_agreement_time'])) {
402 update_user_meta($user_id, 'gdpr_agreement_time', $meta['gdpr_agreement_time']);
403 }
404 }
405 }
406 }
407 default: {
408 if ( isset( $meta[$value['meta-name']] ) ) {
409 update_user_meta($user_id, $value['meta-name'], $meta[$value['meta-name']]);
410 }
411 do_action('wppb_add_meta_on_user_activation_' . Wordpress_Creation_Kit_PB::wck_generate_slug($value['field']), $user_id, $password, $meta, $value);
412 }
413 }
414 }
415 }
416 do_action( 'wppb_add_other_meta_on_user_activation', $user_id, $meta );
417 }
418
419
420 // function to add the new user to the signup table if email confirmation is selected as active or it is a wpmu installation
421 function wppb_signup_user( $username, $user_email, $login_after_register, $meta = '' ) {
422 global $wpdb;
423
424 // check for automatic login
425 // using case-insensitive string comparison to allow for both 'Yes' and 'yes'
426 if( strcasecmp($login_after_register, 'Yes') === 0 ) {
427 $login_after_register = true;
428 } else {
429 $login_after_register = false;
430 }
431 $meta [ 'wppb_login_after_register_'.$meta['user_login'] ] = $login_after_register;
432
433 // save the gdpr_agreement_time if necessary
434 if ( array_key_exists('user_consent_gdpr', $meta) && $meta [ 'user_consent_gdpr' ] === 'agree' ) {
435 $meta [ 'gdpr_agreement_time' ] = time();
436 }
437
438 // Format data
439 $user = sanitize_user( $username, true );
440 if( is_multisite() )
441 $user = preg_replace( '/\s+/', '', $user );
442
443 $user_email = sanitize_email( $user_email );
444 $activation_key = substr( md5( time() . rand() . $user_email ), 0, 16 );
445 $meta = serialize( $meta );
446
447 // change User Registered date and time according to timezone selected in WordPress settings
448 $wppb_get_date = wppb_get_register_date();
449
450 if( isset( $wppb_get_date ) ) {
451 $wppb_user_registered = $wppb_get_date;
452 } else {
453 $wppb_user_registered = current_time( 'mysql', true );
454 }
455
456 if ( is_multisite() )
457 $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 ) );
458 else
459 $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 ) );
460
461 do_action ( 'wppb_signup_user', $username, $user_email, $activation_key, $meta );
462
463 wppb_signup_user_notification( $username, $user_email, $activation_key, $meta );
464 }
465
466 /**
467 * Notify user of signup success.
468 *
469 * Filter 'wppb_signup_user_notification_filter' to bypass this function or
470 * replace it with your own notification behavior.
471 *
472 * Filter 'wppb_signup_user_notification_email' and
473 * 'wppb_signup_user_notification_subject' to change the content
474 * and subject line of the email sent to newly registered users.
475 *
476 * @param string $user The user's login name.
477 * @param string $user_email The user's email address.
478 * @param array $meta By default, an empty array.
479 * @param string $activation_key The activation key created in wppb_signup_user()
480 * @return bool
481 */
482 function wppb_signup_user_notification( $user, $user_email, $activation_key, $meta = '' ) {
483 if ( !apply_filters( 'wppb_signup_user_notification_filter', $user, $user_email, $activation_key, $meta ) )
484 return false;
485
486 $wppb_general_settings = get_option( 'wppb_general_settings' );
487 $admin_email = get_site_option( 'admin_email' );
488
489 $from_name = apply_filters ( 'wppb_signup_user_notification_email_from_field', get_bloginfo( 'name' ) );
490
491 //we don't use this anymore do we ?
492 /*$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" );*/
493
494 if( isset( $wppb_general_settings['activationLandingPage'] ) && !empty( $wppb_general_settings['activationLandingPage'] ) ) {
495 $registration_page_url = add_query_arg( array('activation_key' => $activation_key), get_permalink( $wppb_general_settings['activationLandingPage'] ) );
496 } else {
497 $registration_page_url = 'not_set';
498 }
499
500 $registration_page_url = apply_filters( 'wppb_ec_landing_page', $registration_page_url, $user, $activation_key, $meta );
501
502 if ( $registration_page_url == 'not_set' ){
503 global $post;
504 if( !empty( $post->ID ) )
505 $permalink = get_permalink( $post->ID );
506 else
507 $permalink = get_bloginfo( 'url' );
508
509 if( !empty( $post->post_content ) )
510 $post_content = $post->post_content;
511 else
512 $post_content = '';
513
514 $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' ) ) );
515 }
516
517 $wppb_generalSettings = get_option( 'wppb_general_settings' );
518
519 if( !empty( $wppb_generalSettings['loginWith'] ) && $wppb_generalSettings['loginWith'] == 'email' ) {
520 $display_username_email = $user_email;
521 }
522 else {
523 $display_username_email = $user;
524 }
525
526 $subject = sprintf( __( '[%1$s] Activate %2$s', 'profile-builder'), $from_name, $display_username_email );
527 $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' );
528
529 $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>' );
530 $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' );
531
532 $message_context = 'email_user_activate';
533
534 wppb_mail( $user_email, $subject, $message, $from_name, $message_context );
535
536 return true;
537 }
538
539
540 /**
541 * Activate a signup.
542 *
543 *
544 * @param string $activation_key The activation key provided to the user.
545 * @return array An array containing information about the activated user and/or blog
546 */
547 function wppb_manual_activate_signup( $activation_key ) {
548 global $wpdb;
549
550 if ( is_multisite() )
551 $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE activation_key = %s", $activation_key ) );
552 else
553 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM ".$wpdb->prefix."signups WHERE activation_key = %s", $activation_key) );
554
555 if ( !empty( $signup ) && !$signup->active ){
556 $meta = unserialize( $signup->meta );
557 $user_login = esc_sql( $signup->user_login );
558 $user_email = esc_sql( $signup->user_email );
559 /* Signup meta holds the real password hash, applied after user creation. WordPress requires a non-empty user_pass when creating users. */
560 $password = '';
561
562 $user_id = username_exists($user_login);
563
564 if ( ! $user_id ) {
565 $user_id = wppb_create_user( $user_login, wp_generate_password( 24, true, true ), $user_email );
566 }
567 else
568 $user_already_exists = true;
569
570 if ( !$user_id )
571 return __( 'Could not create user!', 'profile-builder' );
572
573 elseif ( isset( $user_already_exists ) && ( $user_already_exists == true ) )
574 return __( 'That username is already activated!', 'profile-builder' );
575
576 else{
577 $now = current_time('mysql', true);
578
579 $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) ) );
580
581 wppb_add_meta_to_user_on_activation( $user_id, '', $meta );
582
583 if( apply_filters( 'wppb_admin_email_confirmation_maybe_use_admin_approval', false ) ) {
584 // if admin approval is activated, then block the user until he gets approved
585 $wppb_generalSettings = get_option('wppb_general_settings');
586 if( wppb_get_admin_approval_option_value() === 'yes' ){
587 wppb_update_user_status_to_pending( $user_id, $wppb_generalSettings );
588 }
589 }
590
591 /* copy the hashed password from signup meta to wp user table */
592 if( !empty( $meta['user_pass'] ) ){
593 /* we might still have the base64 encoded password in signups and not the hash */
594 if( base64_encode(base64_decode($meta['user_pass'], true)) === $meta['user_pass'] )
595 $meta['user_pass'] = wp_hash_password( $meta['user_pass'] );
596
597 $wpdb->update( $wpdb->users, array('user_pass' => $meta['user_pass'] ), array('ID' => $user_id) );
598 //This is required so that the APC cached data is updated with the new password. Thanks to @foliovision
599 wp_cache_delete( $user_id, 'users' );
600 }
601
602 wppb_notify_user_registration_email( get_bloginfo( 'name' ), $user_login, $user_email, 'sending', $password, ( wppb_get_admin_approval_option_value() === 'yes' ? 'yes' : 'no' ) );
603
604 do_action('wppb_activate_user', $user_id, $password, $meta);
605 return ( $retVal ? 'ok' : __( 'There was an error while trying to activate the user', 'profile-builder' ) );
606 }
607 }
608 }
609
610 /**
611 * Create a user.
612 *
613 * @param string $user_name The new user's login name.
614 * @param string $password The new user's password.
615 * @param string $email The new user's email address.
616 * @return mixed Returns false on failure, or int $user_id on success
617 */
618 function wppb_create_user( $user_name, $password, $email) {
619 if( is_email( $user_name ) )
620 $user_name = apply_filters( 'wppb_generated_random_username', Wordpress_Creation_Kit_PB::wck_generate_slug( trim( $user_name ) ), $user_name );
621 else {
622 $user_name = sanitize_user($user_name, true);
623 if( is_multisite() )
624 $user_name = preg_replace( '/\s+/', '', $user_name );
625 }
626
627
628 $user_id = wp_create_user( $user_name, $password, $email );
629 if ( is_wp_error($user_id) )
630 return false;
631
632 // Newly created users have no roles or caps until they are added to a blog.
633 delete_user_option( $user_id, 'capabilities' );
634 delete_user_option( $user_id, 'user_level' );
635
636 do_action( 'wppb_new_user', $user_id );
637
638 return $user_id;
639 }
640
641 //send an email to the admin regarding each and every new subscriber, and - if selected - to the user himself
642 function wppb_notify_user_registration_email( $bloginfo, $user_name, $email, $send_credentials_via_email, $password, $adminApproval ){
643
644 /* if login with email is enabled user_name gets the value of the users email */
645 $wppb_general_settings = get_option( 'wppb_general_settings' );
646 if ( isset( $wppb_general_settings['loginWith'] ) && ( $wppb_general_settings['loginWith'] == 'email' ) ) {
647 $user_name = $email;
648 }
649
650 //send email to the admin
651 $message_from = apply_filters( 'wppb_register_from_email_message_admin_email', $bloginfo );
652
653 $message_subject = '['.$message_from.'] '.__( 'A new subscriber has (been) registered!', 'profile-builder' );
654 $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' );
655
656 $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 );
657
658 $message_context = 'email_admin_new_subscriber';
659
660 if ( $adminApproval == 'yes' ) {
661 $user_data = get_user_by( 'email', $email );
662
663 $wppb_generalSettings = get_option( 'wppb_general_settings', 'not_found' );
664
665 $adminApproval_mailAdmin = 0;
666
667 if( $wppb_generalSettings != 'not_found' && ! empty( $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
668
669 if( !empty( $user_data->roles ) ) {
670 foreach( $user_data->roles as $role ) {
671 if( in_array( $role, $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
672 if( ! current_user_can( 'delete_users' ) ) {
673 $adminApproval_mailAdmin = 1;
674 }
675 }
676 }
677 }
678
679 } else {
680 if( ! current_user_can( 'delete_users' ) ) {
681 $adminApproval_mailAdmin = 1;
682 }
683 }
684
685 if( $adminApproval_mailAdmin == 1 ) {
686 $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' );
687
688 $message_content .= wppb_adminApproval_adminEmailContent();
689 $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' );
690
691 $message_context = 'email_admin_approve';
692 }
693 else{
694 $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' );
695 }
696 } else {
697 $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' );
698 }
699
700 if ( trim( $message_content ) != '' ){
701 $admin_email = apply_filters('wppb_send_to_admin_email', get_option('admin_email'), get_user_by( 'email', $email ), $message_context);
702 wppb_mail( $admin_email, $message_subject, $message_content, $message_from, $message_context );
703 }
704
705
706
707 //send an email to the newly registered user, if this option was selected
708 if ( isset( $send_credentials_via_email ) && ( $send_credentials_via_email == 'sending' ) ){
709 $user_message_from = apply_filters( 'wppb_register_from_email_message_user_email', $bloginfo );
710
711 $user_message_subject = sprintf( __( '[%1$s] Your new account information', 'profile-builder' ), $user_message_from, $user_name, $password );
712 $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' );
713
714 if ( $password === NULL ) {
715 $password = __( 'Your selected password at signup', 'profile-builder' );
716 }
717
718 $send_password = apply_filters( 'wppb_send_password_in_default_email_message', false );
719 $site_url = '<a href="'. home_url() .'"> ' . home_url() . ' </a>';
720 if( !$send_password )
721 $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 );
722 else
723 $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 );
724
725 if ( $password === __( 'Your selected password at signup', 'profile-builder' ) ) {
726 $password = NULL;
727 }
728
729 $user_message_context = 'email_user_account_info';
730
731 if ( $adminApproval == 'yes' ){
732 $user_data = get_user_by( 'email', $email );
733
734 $wppb_generalSettings = get_option( 'wppb_general_settings', 'not_found' );
735
736 $adminApproval_mailUser = 0;
737
738 if( $wppb_generalSettings != 'not_found' && ! empty( $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
739 foreach( $user_data->roles as $role ) {
740 if( in_array( $role, $wppb_generalSettings['adminApprovalOnUserRole'] ) ) {
741 if( ! current_user_can( 'delete_users' ) ) {
742 $adminApproval_mailUser = 1;
743 }
744 }
745 }
746 } else {
747 if( ! current_user_can( 'delete_users' ) ) {
748 $adminApproval_mailUser = 1;
749 }
750 }
751
752 if( $adminApproval_mailUser == 1 ) {
753 $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' );
754
755 $user_message_content .= wppb_adminApproval_userEmailContent();
756
757 $user_message_context = 'email_user_need_approval';
758
759 $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' );
760 }
761 else{
762 $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' );
763 }
764 } else
765 $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' );
766
767 $message_sent = wppb_mail( $email, $user_message_subject, $user_message_content, $user_message_from, $user_message_context );
768
769 return ( ( $message_sent ) ? 2 : 1 );
770 }
771 }
772
773
774 // function with content to be added in email sent to admin if "Admin Approval" is on
775 function wppb_adminApproval_adminEmailContent() {
776 $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";
777
778 return $emailContent;
779 }
780
781
782 // function with content to be added in email sent to user if "Admin Approval" is on
783 function wppb_adminApproval_userEmailContent() {
784 $emailContent = '<br/><br/>' . __( 'Before you can access your account, an administrator needs to approve it. You will be notified via email.', 'profile-builder' );
785
786 return $emailContent;
787 }
788 // END FUNCTIONS USED BOTH ON THE REGISTRATION PAGE AND THE EMAIL CONFIRMATION TABLE
789
790
791 // Set up the AJAX hooks
792 add_action( 'wp_ajax_wppb_get_unconfirmed_email_number', 'wppb_get_unconfirmed_email_number' );
793 add_action( 'wp_ajax_wppb_handle_email_confirmation_cases', 'wppb_handle_email_confirmation_cases' );
794
795
796 $wppb_general_settings = get_option( 'wppb_general_settings', 'not_found' );
797 if( $wppb_general_settings != 'not_found' ){
798
799 if( !empty($wppb_general_settings['emailConfirmation'] ) && ( $wppb_general_settings['emailConfirmation'] == 'yes' ) ){
800 if ( is_multisite() ){
801 /* don't display on network admin */
802 if( isset($_SERVER['SCRIPT_NAME']) && strpos( sanitize_text_field( $_SERVER['SCRIPT_NAME'] ), 'users.php') && !is_network_admin() ){ //global $pagenow doesn't seem to work
803 add_action( 'admin_head', 'wppb_add_pending_users_header_script' );
804 }
805 }else{
806 global $pagenow;
807 // the Unconfirmed Email Address submenu page is added to profile.php if the user does not have the
808 // list_users capability so we also check for it
809 if ( $pagenow == 'users.php' || $pagenow == 'profile.php' ){
810 add_action( 'admin_head', 'wppb_add_pending_users_header_script' );
811 }
812 }
813
814 if ( defined( 'WPPB_PAID_PLUGIN_DIR' ) && file_exists ( WPPB_PAID_PLUGIN_DIR . '/features/admin-approval/admin-approval.php' ) )
815 add_action( 'user_register', 'wppb_update_user_status_on_admin_registration' );
816 }
817
818 }
819