BP_REST_Account_Settings_Options_Endpoint::update_general_fields( WP_REST_Request $request )
Update general fields.
Description
- from bp-settings\actions\general.php.
Parameters
- $request
-
(Required) Full details about the request.
Return
(array|bool|void)
Source
File: bp-settings/classes/class-bp-rest-account-settings-options-endpoint.php
public function update_general_fields( $request ) {
$post_fields = $request->get_param( 'fields' );
// Define local defaults.
$bp = buddypress(); // The instance.
$email_error = false;
$pass_error = false;
$pass_changed = false; // true if the user changes their password .
$email_changed = false; // true if the user changes their email.
$feedback = array(); // array of strings for feedback.
add_filter( 'bp_displayed_user_id', array( $this, 'bp_rest_get_displayed_user' ), 999 );
// The core userdata of the user who is currently being displayed.
$bp->displayed_user->userdata = bp_core_get_core_userdata( bp_displayed_user_id() );
// Fetch the full name displayed user.
$bp->displayed_user->fullname = isset( $bp->displayed_user->userdata->display_name ) ? $bp->displayed_user->userdata->display_name : '';
// The domain for the user currently being displayed.
$bp->displayed_user->domain = bp_core_get_user_domain( bp_displayed_user_id() );
if (
( is_super_admin() )
|| (
isset( $post_fields['current_password'] )
&& ! empty( $post_fields['current_password'] )
&& wp_check_password(
$post_fields['current_password'],
$bp->displayed_user->userdata->user_pass,
bp_displayed_user_id()
)
)
) {
$update_user = get_userdata( bp_displayed_user_id() );
/* Email Change Attempt ******************************************/
if ( ! empty( $post_fields['account_email'] ) ) {
// What is missing from the profile page vs signup.
// let's double check the goodies.
$user_email = sanitize_email( esc_html( trim( $post_fields['account_email'] ) ) );
$old_user_email = $bp->displayed_user->userdata->user_email;
// User is changing email address.
if ( $old_user_email !== $user_email ) {
// Run some tests on the email address.
$email_checks = bp_core_validate_email_address( $user_email );
if ( true !== $email_checks ) {
if ( isset( $email_checks['invalid'] ) ) {
$email_error = 'invalid';
}
if ( isset( $email_checks['domain_banned'] ) || isset( $email_checks['domain_not_allowed'] ) ) {
$email_error = 'blocked';
}
if ( isset( $email_checks['in_use'] ) ) {
$email_error = 'taken';
}
}
// Store a hash to enable email validation.
if ( false === $email_error ) {
$hash = wp_generate_password( 32, false );
$pending_email = array(
'hash' => $hash,
'newemail' => $user_email,
);
bp_update_user_meta( bp_displayed_user_id(), 'pending_email_change', $pending_email );
$verify_link = bp_displayed_user_domain() . bp_get_settings_slug() . '/?verify_email_change=' . $hash;
// Send the verification email.
$args = array(
'tokens' => array(
'displayname' => bp_core_get_user_displayname( bp_displayed_user_id() ),
'old-user.email' => $old_user_email,
'user.email' => $user_email,
'verify.url' => esc_url( $verify_link ),
),
);
bp_send_email( 'settings-verify-email-change', bp_displayed_user_id(), $args );
// We mark that the change has taken place so as to ensure a.
// success message, even though verification is still required.
$post_fields['account_email'] = $update_user->user_email;
$email_changed = true;
}
// No change.
} else {
$email_error = false;
}
// Email address cannot be empty.
} else {
$email_error = 'empty';
}
/* Password Change Attempt ***************************************/
if (
! empty( $post_fields['pass1'] )
&& ! empty( $post_fields['pass2'] )
) {
if (
( $post_fields['pass1'] === $post_fields['pass2'] )
&& ! strpos( ' ' . wp_unslash( $post_fields['pass1'] ), '\\' )
) {
// Password change attempt is successful.
if (
( ! empty( $post_fields['current_password'] ) && $post_fields['current_password'] !== $post_fields['pass1'] )
|| is_super_admin()
) {
$update_user->user_pass = $post_fields['pass1'];
$pass_changed = true;
// The new password is the same as the current password.
} else {
$pass_error = 'same';
}
// Password change attempt was unsuccessful.
} else {
$pass_error = 'mismatch';
}
// Both password fields were empty.
} elseif (
empty( $post_fields['pass1'] )
&& empty( $post_fields['pass2'] )
) {
$pass_error = false;
// One of the password boxes was left empty.
} elseif (
( empty( $post_fields['pass1'] ) && ! empty( $post_fields['pass2'] ) )
|| ( ! empty( $post_fields['pass1'] ) && empty( $post_fields['pass2'] ) )
) {
$pass_error = 'empty';
}
// The structure of the $update_user object changed in WP 3.3, but wp_update_user() still expects the old format.
if ( isset( $update_user->data ) && is_object( $update_user->data ) ) {
$update_user = $update_user->data;
$update_user = get_object_vars( $update_user );
// Unset the password field to prevent it from emptying out the user's user_pass field in the database.
// @see wp_update_user().
if ( false === $pass_changed ) {
unset( $update_user['user_pass'] );
}
}
// Clear cached data, so that the changed settings take effect on the current page load.
if (
( false === $email_error )
&& ( false === $pass_error )
&& ( wp_update_user( $update_user ) )
) {
$bp->displayed_user->userdata = bp_core_get_core_userdata( bp_displayed_user_id() );
}
// Password Error.
} else {
$pass_error = 'invalid';
}
// Email feedback.
switch ( $email_error ) {
case 'invalid':
$feedback['email_invalid'] = __( 'That email address is invalid. Check the formatting and try again.', 'buddyboss' );
break;
case 'blocked':
$feedback['email_blocked'] = __( 'That email address is currently unavailable for use.', 'buddyboss' );
break;
case 'taken':
$feedback['email_taken'] = __( 'That email address is already taken.', 'buddyboss' );
break;
case 'empty':
$feedback['email_empty'] = __( 'Email address cannot be empty.', 'buddyboss' );
break;
case false:
// No change.
break;
}
// Password feedback.
switch ( $pass_error ) {
case 'invalid':
$feedback['pass_error'] = __( 'Your current password is invalid.', 'buddyboss' );
break;
case 'mismatch':
$feedback['pass_mismatch'] = __( 'The new password fields did not match.', 'buddyboss' );
break;
case 'empty':
$feedback['pass_empty'] = __( 'One of the password fields was empty.', 'buddyboss' );
break;
case 'same':
$feedback['pass_same'] = __( 'The new password must be different from the current password.', 'buddyboss' );
break;
case false:
// No change.
break;
}
// Some kind of errors occurred.
if (
( ( false === $email_error ) || ( false === $pass_error ) )
&& ( ( true !== $pass_changed ) && ( true !== $email_changed ) )
) {
$feedback['nochange'] = __( 'No changes were made to your account.', 'buddyboss' );
}
$notice = $this->bp_rest_settings_pending_email_notice();
remove_filter( 'bp_displayed_user_id', array( $this, 'bp_rest_get_displayed_user' ), 999 );
if ( empty( $feedback ) ) {
return array(
'error' => false,
'notice' => $notice,
);
} else {
return array(
'error' => $feedback,
'notice' => $notice,
);
}
return false;
}
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.