Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
03/13/2014 12:58:28 AM (10 years ago)
Author:
imath
Message:

Introduce Sign Ups Management

In Users Administration Screen, a new view is now available to manage the pending accounts of a site or of the network of sites. The following actions are supported:

  • Resend the activation email
  • Delete the pending account
  • Activate the pending account

The corresponding bulk actions are also supported. A search box is available in order to let the administrator easily find some specific pending accounts.

The registration process have also been modified so that multisite and regular configs handles it in a similar way. A mechnanism is in place to ensure plugin backward compatibility concerning the regular configs.

See #5374

props boonebgorges, imath

Fixes #4651

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/bp-members/bp-members-functions.php

    r8027 r8119  
    13621362        }
    13631363
     1364        // Check into signups
     1365        $signups = BP_Signup::get( array(
     1366            'user_login' => $user_name,
     1367        ) );
     1368
     1369        $signup = isset( $signups['signups'] ) && ! empty( $signups['signups'][0] ) ? $signups['signups'][0] : false;
     1370
    13641371        // Check if the username has been used already.
    1365         if ( username_exists( $user_name ) ) {
     1372        if ( username_exists( $user_name ) || ! empty( $signup ) ) {
    13661373            $errors->add( 'user_name', __( 'Sorry, that username already exists!', 'buddypress' ) );
    13671374        }
     
    13941401
    13951402function bp_core_signup_user( $user_login, $user_password, $user_email, $usermeta ) {
    1396     global $bp, $wpdb;
     1403    global $bp;
     1404
     1405    // We need to cast $user_id to pass to the filters
     1406    $user_id = false;
    13971407
    13981408    // Multisite installs have their own install procedure
     
    14001410        wpmu_signup_user( $user_login, $user_email, $usermeta );
    14011411
    1402         // On multisite, the user id is not created until the user activates the account
    1403         // but we need to cast $user_id to pass to the filters
    1404         $user_id = false;
    1405 
    14061412    } else {
    1407         $errors = new WP_Error();
    1408 
    1409         $user_id = wp_insert_user( array(
    1410             'user_login' => $user_login,
    1411             'user_pass' => $user_password,
    1412             'display_name' => sanitize_title( $user_login ),
    1413             'user_email' => $user_email
    1414         ) );
    1415 
    1416         if ( is_wp_error( $user_id ) || empty( $user_id ) ) {
    1417             $errors->add( 'registerfail', sprintf( __('<strong>ERROR</strong>: Couldn&#8217;t register you... please contact the <a href="mailto:%s">webmaster</a> !', 'buddypress' ), bp_get_option( 'admin_email' ) ) );
    1418             return $errors;
    1419         }
    1420 
    1421         // Update the user status to '2' which we will use as 'not activated' (0 = active, 1 = spam, 2 = not active)
    1422         $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_status = 2 WHERE ID = %d", $user_id ) );
    1423 
    1424         // Set any profile data
    1425         if ( bp_is_active( 'xprofile' ) ) {
    1426             if ( !empty( $usermeta['profile_field_ids'] ) ) {
    1427                 $profile_field_ids = explode( ',', $usermeta['profile_field_ids'] );
    1428 
    1429                 foreach( (array) $profile_field_ids as $field_id ) {
    1430                     if ( empty( $usermeta["field_{$field_id}"] ) )
    1431                         continue;
    1432 
    1433                     $current_field = $usermeta["field_{$field_id}"];
    1434                     xprofile_set_field_data( $field_id, $user_id, $current_field );
    1435 
    1436                     // Save the visibility level
    1437                     $visibility_level = !empty( $usermeta['field_' . $field_id . '_visibility'] ) ? $usermeta['field_' . $field_id . '_visibility'] : 'public';
    1438                     xprofile_set_field_visibility_level( $field_id, $user_id, $visibility_level );
    1439                 }
     1413        // Format data
     1414        $user_login     = preg_replace( '/\s+/', '', sanitize_user( $user_login, true ) );
     1415        $user_email     = sanitize_email( $user_email );
     1416        $activation_key = substr( md5( time() . rand() . $user_email ), 0, 16 );
     1417
     1418        /**
     1419         * WordPress's default behavior is to create user accounts
     1420         * immediately at registration time. BuddyPress uses a system
     1421         * borrowed from WordPress Multisite, where signups are stored
     1422         * separately and accounts are only created at the time of
     1423         * activation. For backward compatibility with plugins that may
     1424         * be anticipating WP's default behavior, BP silently creates
     1425         * accounts for registrations (though it does not use them). If
     1426         * you know that you are not running any plugins dependent on
     1427         * these pending accounts, you may want to save a little DB
     1428         * clutter by defining setting the BP_SIGNUPS_SKIP_USER_CREATION
     1429         * to true in your wp-config.php file.
     1430         */
     1431        if ( ! defined( 'BP_SIGNUPS_SKIP_USER_CREATION' ) || ! BP_SIGNUPS_SKIP_USER_CREATION ) {
     1432            $user_id = BP_Signup::add_backcompat( $user_login, $user_password, $user_email, $usermeta );
     1433
     1434            if ( is_wp_error( $user_id ) ) {
     1435                return $user_id;
    14401436            }
    1441         }
    1442     }
    1443     $bp->signup->username = $user_login;
    1444 
    1445     /***
    1446      * Now generate an activation key and send an email to the user so they can activate their
    1447      * account and validate their email address. Multisite installs send their own email, so
    1448      * this is only for single blog installs.
    1449      *
    1450      * To disable sending activation emails you can user the filter
    1451      * 'bp_core_signup_send_activation_key' and return false. Note that this will only disable
    1452      * the email - a key will still be generated, and the account must still be activated
    1453      * before use.
    1454      */
    1455     if ( !is_multisite() ) {
    1456         $activation_key = wp_hash( $user_id );
    1457         update_user_meta( $user_id, 'activation_key', $activation_key );
     1437
     1438            $activation_key = wp_hash( $user_id );
     1439            update_user_meta( $user_id, 'activation_key', $activation_key );
     1440        }
     1441
     1442        $args = array(
     1443            'user_login'     => $user_login,
     1444            'user_email'     => $user_email,
     1445            'activation_key' => $activation_key,
     1446            'meta'           => $usermeta,
     1447        );
     1448
     1449        BP_Signup::add( $args );
    14581450
    14591451        if ( apply_filters( 'bp_core_signup_send_activation_key', true ) ) {
     
    14611453        }
    14621454    }
     1455
     1456    $bp->signup->username = $user_login;
    14631457
    14641458    do_action( 'bp_core_signup_user', $user_id, $user_login, $user_password, $user_email, $usermeta );
     
    14841478
    14851479        // If there were errors, add a message and redirect
    1486         if ( !empty( $user->errors ) ) {
     1480        if ( ! empty( $user->errors ) ) {
    14871481            return $user;
    14881482        }
     
    14901484        $user_id = $user['user_id'];
    14911485
    1492         // Set any profile data
    1493         if ( bp_is_active( 'xprofile' ) ) {
    1494             if ( !empty( $user['meta']['profile_field_ids'] ) ) {
    1495                 $profile_field_ids = explode( ',', $user['meta']['profile_field_ids'] );
    1496 
    1497                 foreach( (array) $profile_field_ids as $field_id ) {
    1498                     $current_field = isset( $user['meta']["field_{$field_id}"] ) ? $user['meta']["field_{$field_id}"] : false;
    1499 
    1500                     if ( !empty( $current_field ) )
    1501                         xprofile_set_field_data( $field_id, $user_id, $current_field );
    1502 
    1503                     // Save the visibility level
    1504                     $visibility_level = !empty( $user['meta']['field_' . $field_id . '_visibility'] ) ? $user['meta']['field_' . $field_id . '_visibility'] : 'public';
    1505                     xprofile_set_field_visibility_level( $field_id, $user_id, $visibility_level );
    1506                 }
     1486    } else {
     1487        $signups = BP_Signup::get( array(
     1488            'activation_key' => $key,
     1489        ) );
     1490
     1491        if ( empty( $signups['signups'] ) ) {
     1492            return new WP_Error( 'invalid_key', __( 'Invalid activation key.', 'buddypress' ) );
     1493        }
     1494
     1495        $signup = $signups['signups'][0];
     1496
     1497        if ( $signup->active ) {
     1498            if ( empty( $signup->domain ) ) {
     1499                return new WP_Error( 'already_active', __( 'The user is already active.', 'buddypress' ), $signup );
     1500            } else {
     1501                return new WP_Error( 'already_active', __( 'The site is already active.', 'buddypress' ), $signup );
    15071502            }
    15081503        }
    1509     } else {
    1510 
    1511         // Get the user_id based on the $key
    1512         $user_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'activation_key' AND meta_value = %s", $key ) );
    1513 
    1514         if ( empty( $user_id ) )
    1515             return new WP_Error( 'invalid_key', __( 'Invalid activation key', 'buddypress' ) );
    1516 
    1517         // Change the user's status so they become active
    1518         if ( !$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_status = 0 WHERE ID = %d", $user_id ) ) )
    1519             return new WP_Error( 'invalid_key', __( 'Invalid activation key', 'buddypress' ) );
     1504
     1505        // password is hashed again in wp_insert_user
     1506        $password = wp_generate_password( 12, false );
     1507
     1508        $user_id = username_exists( $signup->user_login );
     1509
     1510        // Create the user
     1511        if ( ! $user_id ) {
     1512            $user_id = wp_create_user( $signup->user_login, $password, $signup->user_email );
     1513
     1514        // If a user ID is found, this may be a legacy signup, or one
     1515        // created locally for backward compatibility. Process it.
     1516        } else if ( $key == wp_hash( $user_id ) ) {
     1517            // Change the user's status so they become active
     1518            if ( ! $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_status = 0 WHERE ID = %d", $user_id ) ) ) {
     1519                return new WP_Error( 'invalid_key', __( 'Invalid activation key', 'buddypress' ) );
     1520            }
     1521
     1522            bp_delete_user_meta( $user_id, 'activation_key' );
     1523
     1524            $member = get_userdata( $user_id );
     1525            $member->set_role( get_option('default_role') );
     1526
     1527            $user_already_created = true;
     1528
     1529        } else {
     1530            $user_already_exists = true;
     1531        }
     1532
     1533        if ( ! $user_id ) {
     1534            return new WP_Error( 'create_user', __( 'Could not create user', 'buddypress' ), $signup );
     1535        }
     1536
     1537        // Fetch the signup so we have the data later on
     1538        $signups = BP_Signup::get( array(
     1539            'activation_key' => $key,
     1540        ) );
     1541
     1542        $signup = isset( $signups['signups'] ) && ! empty( $signups['signups'][0] ) ? $signups['signups'][0] : false;
     1543
     1544        // Activate the signup
     1545        BP_Signup::validate( $key );
     1546
     1547        if ( isset( $user_already_exists ) ) {
     1548            return new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup );
     1549        }
     1550
     1551        // Set up data to pass to the legacy filter
     1552        $user = array(
     1553            'user_id'  => $user_id,
     1554            'password' => $signup->meta['password'],
     1555            'meta'     => $signup->meta,
     1556        );
    15201557
    15211558        // Notify the site admin of a new user registration
    15221559        wp_new_user_notification( $user_id );
    15231560
    1524         // Remove the activation key meta
    1525         delete_user_meta( $user_id, 'activation_key' );
     1561        if ( isset( $user_already_created ) ) {
     1562            do_action( 'bp_core_activated_user', $user_id, $key, $user );
     1563            return $user_id;
     1564        }
     1565    }
     1566
     1567    // Set any profile data
     1568    if ( bp_is_active( 'xprofile' ) ) {
     1569        if ( ! empty( $user['meta']['profile_field_ids'] ) ) {
     1570            $profile_field_ids = explode( ',', $user['meta']['profile_field_ids'] );
     1571
     1572            foreach( (array) $profile_field_ids as $field_id ) {
     1573                $current_field = isset( $user['meta']["field_{$field_id}"] ) ? $user['meta']["field_{$field_id}"] : false;
     1574
     1575                if ( !empty( $current_field ) )
     1576                    xprofile_set_field_data( $field_id, $user_id, $current_field );
     1577
     1578                // Save the visibility level
     1579                $visibility_level = ! empty( $user['meta']['field_' . $field_id . '_visibility'] ) ? $user['meta']['field_' . $field_id . '_visibility'] : 'public';
     1580                xprofile_set_field_visibility_level( $field_id, $user_id, $visibility_level );
     1581            }
     1582        }
    15261583    }
    15271584
    15281585    // Update the display_name
    1529     wp_update_user( array( 'ID' => $user_id, 'display_name' => bp_core_get_user_displayname( $user_id ) ) );
     1586    wp_update_user( array(
     1587        'ID'           => $user_id,
     1588        'display_name' => bp_core_get_user_displayname( $user_id ),
     1589    ) );
    15301590
    15311591    // Set the password on multisite installs
    1532     if ( is_multisite() && !empty( $user['meta']['password'] ) )
     1592    if ( ! empty( $user['meta']['password'] ) ) {
    15331593        $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_pass = %s WHERE ID = %d", $user['meta']['password'], $user_id ) );
     1594    }
    15341595
    15351596    do_action( 'bp_core_activated_user', $user_id, $key, $user );
Note: See TracChangeset for help on using the changeset viewer.