BP_XProfile_User_Admin::user_admin_load( string $doaction = '', int $user_id, array $request = array(), string $redirect_to = '' )
Save the profile fields in Members community profile page.
Description
Loaded before the page is rendered, this function is processing form requests.
Parameters
- $doaction
-
(Optional) Action being run.
Default value: ''
- $user_id
-
(Required) ID for the user whose profile is being saved.
- $request
-
(Optional) Request being made.
Default value: array()
- $redirect_to
-
(Optional) Where to redirect user to.
Default value: ''
Source
File: bp-xprofile/classes/class-bp-xprofile-user-admin.php
public function user_admin_load( $doaction = '', $user_id = 0, $request = array(), $redirect_to = '' ) {
// Eventually delete avatar.
if ( 'delete_avatar' === $doaction ) {
check_admin_referer( 'delete_avatar' );
$redirect_to = remove_query_arg( '_wpnonce', $redirect_to );
if ( bp_core_delete_existing_avatar( array( 'item_id' => $user_id ) ) ) {
$redirect_to = add_query_arg( 'updated', 'avatar', $redirect_to );
} else {
$redirect_to = add_query_arg( 'error', 'avatar', $redirect_to );
}
bp_core_redirect( $redirect_to );
} elseif ( isset( $_POST['field_ids'] ) ) {
// Update profile fields.
// Check the nonce.
check_admin_referer( 'edit-bp-profile_' . $user_id );
// Check we have field ID's.
if ( empty( $_POST['field_ids'] ) ) {
$redirect_to = add_query_arg( 'error', '1', $redirect_to );
bp_core_redirect( $redirect_to );
}
/**
* Unlike front-end edit-fields screens, the wp-admin/profile
* displays all groups of fields on a single page, so the list of
* field ids is an array gathering for each group of fields a
* distinct comma separated list of ids.
*
* As a result, before using the wp_parse_id_list() function, we
* must ensure that these ids are "merged" into a single comma
* separated list.
*/
$merge_ids = join( ',', $_POST['field_ids'] );
// Explode the posted field IDs into an array so we know which fields have been submitted.
$posted_field_ids = wp_parse_id_list( $merge_ids );
$is_required = array();
// Loop through the posted fields formatting any datebox values then validate the field.
foreach ( (array) $posted_field_ids as $field_id ) {
bp_xprofile_maybe_format_datebox_post_data( $field_id );
$is_required[ $field_id ] = xprofile_check_is_required_field( $field_id ) && ! bp_current_user_can( 'bp_moderate' );
if ( $is_required[ $field_id ] && empty( $_POST['field_' . $field_id ] ) ) {
$redirect_to = add_query_arg( 'error', '2', $redirect_to );
bp_core_redirect( $redirect_to );
}
// Validate xprofile
if ( $message = xprofile_validate_field( $field_id, $_POST[ 'field_' . $field_id ], $user_id ) ) {
$redirect_to = add_query_arg( [
'error' => '4',
'message' => urlencode($message)
], $redirect_to );
bp_core_redirect( $redirect_to );
}
}
// Set the errors var.
$errors = false;
// Now we've checked for required fields, let's save the values.
$old_values = $new_values = array();
foreach ( (array) $posted_field_ids as $field_id ) {
/*
* Certain types of fields (checkboxes, multiselects) may come
* through empty. Save them as an empty array so that they don't
* get overwritten by the default on the next edit.
*/
$value = isset( $_POST['field_' . $field_id] ) ? $_POST['field_' . $field_id] : '';
$visibility_level = ! empty( $_POST['field_' . $field_id . '_visibility'] ) ? $_POST['field_' . $field_id . '_visibility'] : 'public';
/*
* Save the old and new values. They will be
* passed to the filter and used to determine
* whether an activity item should be posted.
*/
$old_values[ $field_id ] = array(
'value' => xprofile_get_field_data( $field_id, $user_id ),
'visibility' => xprofile_get_field_visibility_level( $field_id, $user_id ),
);
// Update the field data and visibility level.
xprofile_set_field_visibility_level( $field_id, $user_id, $visibility_level );
$field_updated = xprofile_set_field_data( $field_id, $user_id, $value, $is_required[ $field_id ] );
$value = xprofile_get_field_data( $field_id, $user_id );
$new_values[ $field_id ] = array(
'value' => $value,
'visibility' => xprofile_get_field_visibility_level( $field_id, $user_id ),
);
if ( ! $field_updated ) {
$errors = true;
} else {
/**
* Fires after the saving of each profile field, if successful.
*
* @since BuddyPress 1.1.0
*
* @param int $field_id ID of the field being updated.
* @param string $value Value that was saved to the field.
*/
do_action( 'xprofile_profile_field_data_updated', $field_id, $value );
}
}
/**
* Fires after all XProfile fields have been saved for the current profile.
*
* @since BuddyPress 1.0.0
* @since BuddyPress 2.6.0 Added $old_values and $new_values parameters.
*
* @param int $user_id ID for the user whose profile is being saved.
* @param array $posted_field_ids Array of field IDs that were edited.
* @param bool $errors Whether or not any errors occurred.
* @param array $old_values Array of original values before update.
* @param array $new_values Array of newly saved values after update.
*/
do_action( 'xprofile_updated_profile', $user_id, $posted_field_ids, $errors, $old_values, $new_values );
// Set the feedback messages.
if ( ! empty( $errors ) ) {
$redirect_to = add_query_arg( 'error', '3', $redirect_to );
} else {
$redirect_to = add_query_arg( 'updated', '1', $redirect_to );
}
bp_core_redirect( $redirect_to );
}
}
Changelog
| Version | Description |
|---|---|
| BuddyPress 2.0.0 | Introduced. |
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.