/** * A simple function to set profile data for a specific field for a specific user. * * @package BuddyPress Core * @param int|string $field The ID of the field, or the $name of the field. * @param int|$user_id The ID of the user * @param mixed $value The value for the field you want to set for the user. * @param $is_required Whether or not the field is required * @uses xprofile_get_field_id_from_name() Gets the ID for the field based on the name. * @return bool True on success, false on failure. */ function xprofile_set_field_data($field, $user_id, $value, $is_required = false) { if (is_numeric($field)) { $field_id = $field; } else { $field_id = xprofile_get_field_id_from_name($field); } if (empty($field_id)) { return false; } $field = new BP_XProfile_Field($field_id); $field_type = BP_XProfile_Field::get_type($field_id); $field_type_obj = bp_xprofile_create_field_type($field_type); /** * Filter the raw submitted profile field value. * * Use this filter to modify the values submitted by users before * doing field-type-specific validation. * * @since BuddyPress (2.1.0) * * @param mixed $value Value passed to xprofile_set_field_data() * @param BP_XProfile_Field $field Field object. * @param BP_XProfile_Field_Type $field_type_obj Field type object. */ $value = apply_filters('bp_xprofile_set_field_data_pre_validate', $value, $field, $field_type_obj); // Special-case support for integer 0 for the number field type if ($is_required && !is_integer($value) && $value !== '0' && (empty($value) || !is_array($value) && !strlen(trim($value)))) { return false; } /** * Certain types of fields (checkboxes, multiselects) may come through empty. * Save as empty array so this isn't overwritten by the default on next edit. * * Special-case support for integer 0 for the number field type */ if (empty($value) && !is_integer($value) && $value !== '0' && $field_type_obj->accepts_null_value) { $value = array(); } // If the value is empty, then delete any field data that exists, unless the field is of a type where null values are semantically meaningful if (empty($value) && !is_integer($value) && $value !== '0' && !$field_type_obj->accepts_null_value) { xprofile_delete_field_data($field_id, $user_id); return true; } // For certain fields, only certain parameters are acceptable, so add them to the whitelist. if ($field_type_obj->supports_options) { $field_type_obj->set_whitelist_values(wp_list_pluck($field->get_children(), 'name')); } // Check the value is in an accepted format for this form field. if (!$field_type_obj->is_valid($value)) { return false; } $field = new BP_XProfile_ProfileData(); $field->field_id = $field_id; $field->user_id = $user_id; $field->value = maybe_serialize($value); return $field->save(); }