/**
 * 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();
}