Skip to:
Content

Ticket #6789: 6789.07.patch

File 6789.07.patch, 21.7 KB (added by boonebgorges, 5 months ago)
  • src/bp-xprofile/bp-xprofile-filters.php

    diff --git src/bp-xprofile/bp-xprofile-filters.php src/bp-xprofile/bp-xprofile-filters.php
    index dd3f7c567..33997a130 100644
    function xprofile_filter_kses( $content, $data_obj = null ) { 
    154154 * Safely runs profile field data through kses and force_balance_tags.
    155155 *
    156156 * @since 1.2.6
     157 * @since 3.0.0 The `$field_value` parameter accepts an array.
    157158 *
    158  * @param string      $field_value Field value being santized.
    159  * @param int         $field_id    Field ID being sanitized.
    160  * @param bool        $reserialize Whether to reserialize arrays before returning. Defaults to true.
    161  * @param object|null $data_obj    The BP_XProfile_ProfileData object.
     159 * @param string       $field_value Field value being santized.
     160 * @param int          $field_id    Field ID being sanitized.
     161 * @param bool         $reserialize Whether to reserialize arrays before returning. Defaults to true.
     162 * @param object|null  $data_obj    The BP_XProfile_ProfileData object.
     163 * @return string|array
    162164 * @return string
    163165 */
    164166function xprofile_sanitize_data_value_before_save( $field_value, $field_id = 0, $reserialize = true, $data_obj = null ) {
    function xprofile_sanitize_data_value_before_save( $field_value, $field_id = 0, 
    176178        // Value might be a serialized array of options.
    177179        $field_value = maybe_unserialize( $field_value );
    178180
     181        // Return if empty. Special-case support for integer 0 for the number field type.
     182        if ( empty( $field_value ) && ! is_integer( $field_value ) && $field_value !== '0' ) {
     183                return $field_value;
     184        }
     185
    179186        // Sanitize single field value.
    180         if ( ! is_array( $field_value ) ) {
     187        if ( ! $data_obj || ! bp_xprofile_field_supports_multiple_values( $data_obj->field_id ) ) {
    181188                $kses_field_value     = xprofile_filter_kses( $field_value, $data_obj );
    182189                $filtered_field_value = wp_rel_nofollow( force_balance_tags( $kses_field_value ) );
    183190
    function xprofile_sanitize_data_value_before_save( $field_value, $field_id = 0, 
    185192                 * Filters the kses-filtered data before saving to database.
    186193                 *
    187194                 * @since 1.5.0
     195                 * @since 3.0.0 The `$filtered_field_value` accepts an array.
    188196                 *
    189                  * @param string                  $filtered_field_value The filtered value.
     197                 * @param string|array            $filtered_field_value The filtered value.
    190198                 * @param string                  $field_value          The original value before filtering.
    191199                 * @param BP_XProfile_ProfileData $data_obj             The BP_XProfile_ProfileData object.
    192200                 */
    193201                $filtered_field_value = apply_filters( 'xprofile_filtered_data_value_before_save', $filtered_field_value, $field_value, $data_obj );
    194202
     203                if ( ! empty( $reserialize ) ) {
     204                        $filtered_field_value = maybe_serialize( $filtered_field_value );
     205                }
     206
    195207        // Sanitize multiple individual option values.
    196208        } else {
    197209                $filtered_values = array();
    198210                foreach ( (array) $field_value as $value ) {
    199                         $kses_field_value = xprofile_filter_kses( $value, $data_obj );
    200                         $filtered_value   = wp_rel_nofollow( force_balance_tags( $kses_field_value ) );
     211                        $unserialized_value = maybe_unserialize( $value );
     212                        $kses_field_value   = xprofile_filter_kses( $unserialized_value, $data_obj );
     213                        $filtered_value     = wp_rel_nofollow( force_balance_tags( $kses_field_value ) );
    201214
    202215                        /** This filter is documented in bp-xprofile/bp-xprofile-filters.php */
    203216                        $filtered_values[] = apply_filters( 'xprofile_filtered_data_value_before_save', $filtered_value, $value, $data_obj );
    204217                }
    205218
    206                 if ( !empty( $reserialize ) ) {
    207                         $filtered_field_value = serialize( $filtered_values );
     219                if ( ! empty( $reserialize ) ) {
     220                        $filtered_field_value = array_map( 'maybe_serialize', $filtered_values );
    208221                } else {
    209222                        $filtered_field_value = $filtered_values;
    210223                }
  • src/bp-xprofile/bp-xprofile-functions.php

    diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
    index 337d2cd79..c34625f01 100644
    function xprofile_get_field_data( $field, $user_id = 0, $multi_format = 'array' 
    362362
    363363        $values = maybe_unserialize( BP_XProfile_ProfileData::get_value_byid( $field_id, $user_id ) );
    364364
    365         if ( is_array( $values ) ) {
     365        // Consider multiple values.
     366        if ( bp_xprofile_field_supports_multiple_values( $field_id ) ) {
     367                $values = array_map( 'maybe_unserialize', $values );
    366368                $data = array();
    367369                foreach( (array) $values as $value ) {
    368370
    function xprofile_set_field_data( $field, $user_id, $value, $is_required = false 
    467469        $field->user_id  = $user_id;
    468470
    469471        // Gets un/reserialized via xprofile_sanitize_data_value_before_save()
    470         $field->value    = maybe_serialize( $value );
     472        if ( bp_xprofile_field_supports_multiple_values( $field_id ) ) {
     473                $field->value = array_map( 'maybe_serialize', $value );
     474        } else {
     475                $field->value = maybe_serialize( $value );
     476        }
    471477
    472478        return $field->save();
    473479}
    function xprofile_get_random_profile_data( $user_id, $exclude_fullname = true ) 
    641647 * Formats a profile field according to its type. [ TODO: Should really be moved to filters ]
    642648 *
    643649 * @since 1.0.0
     650 * @since 3.0.0 The `$field_value` parameter can be an array.
    644651 *
    645  * @param string $field_type  The type of field: datebox, selectbox, textbox etc.
    646  * @param string $field_value The actual value.
     652 * @param string       $field_type  The type of field: datebox, selectbox, textbox etc.
     653 * @param string|array $field_value The actual value.
    647654 * @return string|bool The formatted value, or false if value is empty.
    648655 */
    649656function xprofile_format_profile_field( $field_type, $field_value ) {
    function bp_xprofile_is_richtext_enabled_for_field( $field_id = null ) { 
    11461153        return apply_filters( 'bp_xprofile_is_richtext_enabled_for_field', $enabled, $field_id );
    11471154}
    11481155
     1156/**
     1157 * Does this profile field support multiple values?
     1158 *
     1159 * @since 3.0.0
     1160 *
     1161 * @param int|null $field_id Optional. Default current field ID.
     1162 * @return bool              Whether the field supports multiple values
     1163 */
     1164function bp_xprofile_field_supports_multiple_values( $field_id = null ) {
     1165        if ( ! $field_id ) {
     1166                $field_id = bp_get_the_profile_field_id();
     1167        }
     1168
     1169        $field = xprofile_get_field( $field_id, null, false );
     1170
     1171        $supports = false;
     1172        if ( $field instanceof BP_XProfile_Field ) {
     1173                $supports = (bool) $field->type_obj->supports_multiple_values;
     1174        }
     1175
     1176        /**
     1177         * Filters whether the given field supports multiple values.
     1178         *
     1179         * @since 3.0.0
     1180         *
     1181         * @param bool $supports True if the field supports multiple values, otherwise false.
     1182         * @param int  $field_id ID of the field.
     1183         */
     1184        return (bool) apply_filters( 'bp_xprofile_field_supports_multiple_values', $supports, $field_id );
     1185}
     1186
    11491187/**
    11501188 * Get visibility levels out of the $bp global.
    11511189 *
  • src/bp-xprofile/bp-xprofile-template.php

    diff --git src/bp-xprofile/bp-xprofile-template.php src/bp-xprofile/bp-xprofile-template.php
    index afe5162ec..e4f8ad277 100644
    function bp_the_profile_field_visibility_level_label() { 
    903903 * comma-separated string.
    904904 *
    905905 * @since 1.0.0
     906 * @since 3.0.0 The `$value` parameter can be an array.
    906907 *
    907  * @param string $value Content to maybe unserialize.
     908 * @param string|array $value Content to maybe unserialize.
    908909 * @return string
    909910 */
    910911function bp_unserialize_profile_field( $value ) {
    911         if ( is_serialized($value) ) {
    912                 $field_value = @unserialize($value);
     912        if ( is_serialized( $value ) || is_array( $value ) ) {
     913                $field_value = maybe_unserialize( $value );
    913914                $field_value = implode( ', ', $field_value );
    914915                return $field_value;
    915916        }
  • src/bp-xprofile/classes/class-bp-xprofile-field-type-checkbox.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type-checkbox.php src/bp-xprofile/classes/class-bp-xprofile-field-type-checkbox.php
    index f3717d3dc..895e07082 100644
    class BP_XProfile_Field_Type_Checkbox extends BP_XProfile_Field_Type { 
    2828                $this->category = _x( 'Multi Fields', 'xprofile field type category', 'buddypress' );
    2929                $this->name     = _x( 'Checkboxes', 'xprofile field type', 'buddypress' );
    3030
     31                $this->supports_multiple_values   = true;
    3132                $this->supports_multiple_defaults = true;
    3233                $this->accepts_null_value         = true;
    3334                $this->supports_options           = true;
  • src/bp-xprofile/classes/class-bp-xprofile-field-type-multiselectbox.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type-multiselectbox.php src/bp-xprofile/classes/class-bp-xprofile-field-type-multiselectbox.php
    index d56b25be4..718b79d2a 100644
    class BP_XProfile_Field_Type_Multiselectbox extends BP_XProfile_Field_Type { 
    2828                $this->category = _x( 'Multi Fields', 'xprofile field type category', 'buddypress' );
    2929                $this->name     = _x( 'Multi Select Box', 'xprofile field type', 'buddypress' );
    3030
     31                $this->supports_multiple_values   = true;
    3132                $this->supports_multiple_defaults = true;
    3233                $this->accepts_null_value         = true;
    3334                $this->supports_options           = true;
  • src/bp-xprofile/classes/class-bp-xprofile-field-type.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type.php src/bp-xprofile/classes/class-bp-xprofile-field-type.php
    index 65a970c68..66e451df4 100644
    abstract class BP_XProfile_Field_Type { 
    6565         */
    6666        public $supports_options = false;
    6767
     68        /**
     69         * If allowed to store multiple values.
     70         *
     71         * @since 3.0.0
     72         * @var bool Does this field support multiple values? e.g. multiselectbox, checkbox.
     73         */
     74        public $supports_multiple_values = false;
     75
    6876        /**
    6977         * If allowed to support multiple options as default.
    7078         *
  • src/bp-xprofile/classes/class-bp-xprofile-profiledata.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-profiledata.php src/bp-xprofile/classes/class-bp-xprofile-profiledata.php
    index 9db8bfc3a..b6d97e9b4 100644
    class BP_XProfile_ProfileData { 
    8989                        $bp = buddypress();
    9090
    9191                        $sql         = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id );
    92                         $profiledata = $wpdb->get_row( $sql );
     92                        $profiledata = $wpdb->get_results( $sql );
    9393
    9494                        if ( $profiledata ) {
     95
     96                                // If the field supports multiple values, an array should be returned.
     97                                if ( bp_xprofile_field_supports_multiple_values( $profiledata[0]->field_id ) ) {
     98                                        $profiledata[0]->value = wp_list_pluck( $profiledata, 'value' );
     99
     100                                        // Parse empty list
     101                                        if ( array() === maybe_unserialize( $profiledata[0]->value ) ) {
     102                                                $profiledata[0]->value = array();
     103                                        }
     104                                }
     105
     106                                // Get the first row
     107                                $profiledata = $profiledata[0];
    95108                                wp_cache_set( $cache_key, $profiledata, 'bp_xprofile_data' );
    96109                        }
    97110                }
    class BP_XProfile_ProfileData { 
    100113                        $this->id           = (int) $profiledata->id;
    101114                        $this->user_id      = (int) $profiledata->user_id;
    102115                        $this->field_id     = (int) $profiledata->field_id;
    103                         $this->value        = stripslashes( $profiledata->value );
     116                        $this->value        = is_array( $profiledata->value ) ? array_map( 'stripslashes', $profiledata->value ) : stripslashes( $profiledata->value );
    104117                        $this->last_updated = $profiledata->last_updated;
    105118
    106119                } else {
    class BP_XProfile_ProfileData { 
    239252                do_action_ref_array( 'xprofile_data_before_save', array( $this ) );
    240253
    241254                if ( $this->is_valid_field() ) {
    242                         if ( $this->exists() && strlen( trim( $this->value ) ) ) {
     255
     256                        // Special-case support for integer 0 for the number field type
     257                        $value_is_empty = empty( $this->value ) && ! is_integer( $this->value ) && '0' !== $this->value;
     258
     259                        // Store as multiple values
     260                        if ( bp_xprofile_field_supports_multiple_values( $this->field_id ) ) {
     261
     262                                // Delete previous rows.
     263                                if ( $this->exists() ) {
     264                                        $this->delete();
     265                                }
     266
     267                                // Store empty list as serialized array
     268                                if ( empty( $this->value ) ) {
     269                                        $this->value = array( serialize( array() ) );
     270                                }
     271
     272                                // Store each value in a separate row
     273                                foreach ( array_values( (array) $this->value ) as $k => $value ) {
     274                                        $result = $wpdb->query( $wpdb->prepare("INSERT INTO {$bp->profile->table_name_data} (user_id, field_id, value, last_updated) VALUES (%d, %d, %s, %s)", $this->user_id, $this->field_id, $value, $this->last_updated ) );
     275
     276                                        // Use the first inserted id as the new data identifier
     277                                        if ( 0 === $k ) {
     278                                                $this->id = $wpdb->insert_id;
     279                                        }
     280                                }
     281
     282                        // Store as single value
     283                        } elseif ( $this->exists() && ! $value_is_empty ) {
    243284                                $result   = $wpdb->query( $wpdb->prepare( "UPDATE {$bp->profile->table_name_data} SET value = %s, last_updated = %s WHERE user_id = %d AND field_id = %d", $this->value, $this->last_updated, $this->user_id, $this->field_id ) );
    244285
    245                         } elseif ( $this->exists() && empty( $this->value ) ) {
    246                                 // Data removed, delete the entry.
     286                        // Data removed, delete the entry.
     287                        } elseif ( $this->exists() && $value_is_empty ) {
    247288                                $result   = $this->delete();
    248289
    249                         } else {
     290                        } elseif ( ! $value_is_empty ) {
    250291                                $result   = $wpdb->query( $wpdb->prepare("INSERT INTO {$bp->profile->table_name_data} (user_id, field_id, value, last_updated) VALUES (%d, %d, %s, %s)", $this->user_id, $this->field_id, $this->value, $this->last_updated ) );
    251292                                $this->id = $wpdb->insert_id;
    252293                        }
    class BP_XProfile_ProfileData { 
    337378                        // Rekey.
    338379                        $queried_data = array();
    339380                        foreach ( $uncached_data as $ud ) {
    340                                 $d               = new stdClass;
    341                                 $d->id           = $ud->id;
    342                                 $d->user_id      = $ud->user_id;
    343                                 $d->field_id     = $ud->field_id;
    344                                 $d->value        = $ud->value;
    345                                 $d->last_updated = $ud->last_updated;
    346 
    347                                 $queried_data[ $ud->field_id ] = $d;
     381
     382                                // Set initial field data
     383                                if ( ! isset( $queried_data[ $ud->field_id ] ) ) {
     384                                        $d               = new stdClass;
     385                                        $d->id           = $ud->id;
     386                                        $d->user_id      = $ud->user_id;
     387                                        $d->field_id     = $ud->field_id;
     388                                        $d->last_updated = $ud->last_updated;
     389
     390                                        // Collect multiple values in array
     391                                        // TODO: no stripslashing here? See ::populate()
     392                                        if ( bp_xprofile_field_supports_multiple_values( $ud->field_id ) ) {
     393                                                $d->value = ( array() === maybe_unserialize( $ud->value ) ) ? array() : array( $ud->value );
     394                                        } else {
     395                                                $d->value = $ud->value;
     396                                        }
     397
     398                                        $queried_data[ $ud->field_id ] = $d;
     399
     400                                // Collect multiple values per field
     401                                } elseif ( bp_xprofile_field_supports_multiple_values( $ud->field_id ) ) {
     402                                        // TODO: no stripslashing here? See ::populate()
     403                                        $queried_data[ $ud->field_id ]->value[] = $ud->value;
     404                                }
    348405                        }
    349406
    350407                        // Set caches.
    class BP_XProfile_ProfileData { 
    363420                                        $d->id           = '';
    364421                                        $d->user_id      = $user_id;
    365422                                        $d->field_id     = $field_id;
    366                                         $d->value        = '';
     423                                        $d->value        = bp_xprofile_field_supports_multiple_values( $field_id ) ? array() : '';
    367424                                        $d->last_updated = '';
    368425
    369426                                        wp_cache_set( $cache_key, $d, 'bp_xprofile_data' );
    class BP_XProfile_ProfileData { 
    443500         * Get the user's field data id by the id of the xprofile field.
    444501         *
    445502         * @since 1.6.0
     503         * @since 3.0.0 Returns the first/main data id in case of multiple values.
    446504         *
    447505         * @param int $field_id Field ID being queried for.
    448506         * @param int $user_id  User ID associated with field.
    class BP_XProfile_ProfileData { 
    509567                        $bp = buddypress();
    510568                        $uncached_ids_sql = implode( ',', $uncached_ids );
    511569                        $queried_data = $wpdb->get_results( $wpdb->prepare( "SELECT id, user_id, field_id, value, last_updated FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id IN ({$uncached_ids_sql})", $field_id ) );
     570                        $multiple = bp_xprofile_field_supports_multiple_values( $field_id );
    512571
    513572                        // Rekey.
    514573                        $qd = array();
    515574                        foreach ( $queried_data as $data ) {
    516                                 $qd[ $data->user_id ] = $data;
     575
     576                                // Set initial user data
     577                                if ( ! isset( $qd[ $data->user_id ] ) ) {
     578
     579                                        // Collect multiple values in array
     580                                        if ( $multiple ) {
     581                                                // TODO: no stripslashing here? See ::populate().
     582                                                $data->value = ( array() === maybe_unserialize( $data->value ) ) ? array() : array( $data->value );
     583                                        }
     584
     585                                        $qd[ $data->user_id ] = $data;
     586
     587                                // Collect multiple values per field
     588                                } elseif ( $multiple ) {
     589                                        // TODO: no stripslashing here? See ::populate().
     590                                        $qd[ $data->user_id ]->value[] = $data->value;
     591                                }
    517592                        }
    518593
    519594                        foreach ( $uncached_ids as $id ) {
    class BP_XProfile_ProfileData { 
    528603                                        $d->id           = '';
    529604                                        $d->user_id      = $id;
    530605                                        $d->field_id     = $field_id;
    531                                         $d->value        = '';
     606                                        $d->value        = $multiple ? array() : '';
    532607                                        $d->last_updated = '';
    533608                                }
    534609
    class BP_XProfile_ProfileData { 
    604679                        $field_sql .= $wpdb->prepare( "AND f.name = %s", $fields );
    605680                }
    606681
    607                 $sql    = $wpdb->prepare( "SELECT d.value, f.name FROM {$bp->profile->table_name_data} d, {$bp->profile->table_name_fields} f WHERE d.field_id = f.id AND d.user_id = %d AND f.parent_id = 0 $field_sql", $user_id );
     682                $sql    = $wpdb->prepare( "SELECT d.value, f.name, f.id FROM {$bp->profile->table_name_data} d, {$bp->profile->table_name_fields} f WHERE d.field_id = f.id AND d.user_id = %d AND f.parent_id = 0 $field_sql", $user_id );
    608683                $values = $wpdb->get_results( $sql );
    609684
     685                // TODO: checking for empty result/WP_Error, but not in other methods?
    610686                if ( empty( $values ) || is_wp_error( $values ) ) {
    611687                        return false;
    612688                }
    class BP_XProfile_ProfileData { 
    617693                        for ( $i = 0, $count = count( $values ); $i < $count; ++$i ) {
    618694                                for ( $j = 0; $j < count( $fields ); $j++ ) {
    619695                                        if ( $values[$i]->name == $fields[$j] ) {
    620                                                 $new_values[$fields[$j]] = $values[$i]->value;
     696                                                $multiple = bp_xprofile_field_supports_multiple_values( $values[$i]->id );
     697
     698                                                // TODO: no stripslashing here? See ::populate()
     699                                                if ( ! isset( $new_values[ $fields[$j] ] ) ) {
     700                                                        if ( $multiple ) {
     701                                                                $new_values[$fields[$j]] = ( array() === $values[$i]->value ) ? array() : array( $values[$i]->value );
     702                                                        } else {
     703                                                                $new_values[$fields[$j]] = $values[$i]->value;
     704                                                        }
     705                                                } elseif ( $multiple ) {
     706                                                        $new_values[$fields[$j]][] = $values[$i]->value;
     707                                                }
    621708                                        } elseif ( !array_key_exists( $fields[$j], $new_values ) ) {
    622709                                                $new_values[$fields[$j]] = NULL;
    623710                                        }
    624711                                }
    625712                        }
    626713                } else {
    627                         $new_values = $values[0]->value;
     714
     715                        // Collect multiple values in array
     716                        // TODO: no stripslashing here? See ::populate()
     717                        if ( bp_xprofile_field_supports_multiple_values( $values[0]->id ) ) {
     718                                $new_values = wp_list_pluck( $values, 'value' );
     719
     720                                // Parse empty list
     721                                if ( array() === maybe_unserialize( $new_values[0] ) ) {
     722                                        $new_values = array();
     723                                }
     724                        } else {
     725                                $new_values = $values[0]->value;
     726                        }
    628727                }
    629728
    630729                return $new_values;
    class BP_XProfile_ProfileData { 
    689788         *
    690789         * @since 1.0.0
    691790         *
    692          * @param int    $user_id          User ID to query for.
    693          * @param string $exclude_fullname SQL portion used to exclude by field ID.
     791         * @param int  $user_id          User ID to query for.
     792         * @param bool $exclude_fullname Optional. Whether to exclude the fullname field. Defaults to false.
    694793         * @return array|null|object
    695794         */
    696         public static function get_random( $user_id, $exclude_fullname ) {
     795        public static function get_random( $user_id, $exclude_fullname = false ) {
    697796                global $wpdb;
    698797
    699798                $exclude_sql = ! empty( $exclude_fullname ) ? ' AND pf.id != 1' : '';
    700799
    701800                $bp = buddypress();
    702801
    703                 return $wpdb->get_results( $wpdb->prepare( "SELECT pf.type, pf.name, pd.value FROM {$bp->profile->table_name_data} pd INNER JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id AND pd.user_id = %d {$exclude_sql} ORDER BY RAND() LIMIT 1", $user_id ) );
     802                $rand_sql = "SELECT id FROM {$bp->profile->table_name_fields} ORDER BY RAND() LIMIT 1";
     803                $result   = $wpdb->get_results( $wpdb->prepare( "SELECT pf.type, pf.name, pd.value, pf.id FROM {$bp->profile->table_name_data} pd INNER JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id AND pd.user_id = %d {$exclude_sql} WHERE pf.id IN ($rand_sql)", $user_id ) );
     804
     805                // Collect multiple values in array
     806                if ( bp_xprofile_field_supports_multiple_values( $result[0]->id ) ) {
     807                        // TODO: no stripslashing here? See ::populate()
     808                        $result[0]->value = wp_list_pluck( $result, 'value' );
     809
     810                        // Parse empty list
     811                        if ( array() === maybe_unserialize( $result[0]->value ) ) {
     812                                $result[0]->value = array();
     813                        }
     814
     815                        $result = array( $result[0] );
     816                }
     817
     818                return $result;
    704819        }
    705820
    706821        /**
  • tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php

    diff --git tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php
    index 5f1de867d..a8fb4140e 100644
    class BP_Tests_BP_XProfile_ProfileData_TestCases extends BP_UnitTestCase { 
    422422        public function filter_time() {
    423423                return $this->last_updated;
    424424        }
     425
     426        /**
     427         * @ticket BP6789
     428         */
     429        public function test_get_data_for_user_should_properly_cache_multi_value_fields() {
     430                $u = self::factory()->user->create();
     431                $g = self::factory()->xprofile_group->create();
     432                $f = self::factory()->xprofile_field->create( array(
     433                        'type' => 'multiselectbox',
     434                        'field_group_id' => $g,
     435                ) );
     436
     437                xprofile_set_field_data( $f, $u, array( 'foo', 'bar' ) );
     438
     439                $expected = array( 'foo', 'bar' );
     440
     441                // Uncached query.
     442                $value = BP_XProfile_ProfileData::get_data_for_user( $u, array( $f ) );
     443                $this->assertEqualSets( $expected, $value[0]->value );
     444
     445                // Cached query.
     446                $value = BP_XProfile_ProfileData::get_data_for_user( $u, array( $f ) );
     447                $this->assertEqualSets( $expected, $value[0]->value );
     448        }
    425449}