Skip to:
Content

BuddyPress.org

Ticket #6100: 6100.patch

File 6100.patch, 10.4 KB (added by johnjamesjacoby, 6 years ago)
  • src/bp-xprofile/bp-xprofile-cache.php

     
    1313if ( !defined( 'ABSPATH' ) ) exit;
    1414
    1515/**
     16 * Determine which xprofile fields do not have cached values for a user.
     17 *
     18 * @since BuddyPress (2.2.0)
     19 *
     20 * @param int   $user_id   User ID to check
     21 * @param array $field_ids XProfile field IDs.
     22 * @return array
     23 */
     24function bp_xprofile_get_non_cached_field_ids( $user_id = 0, $field_ids = array() ) {
     25        $uncached_fields = array();
     26
     27        foreach ( $field_ids as $field_id ) {
     28                $field_id  = (int) $field_id;
     29                $cache_key = "{$user_id}:{$field_id}";
     30                if ( false === wp_cache_get( $cache_key, 'bp_xprofile_data' ) ) {
     31                        $uncached_fields[] = $field_id;
     32                }
     33        }
     34
     35        return $uncached_fields;
     36}
     37
     38/**
    1639 * Slurp up xprofilemeta for a specified set of profile objects.
    1740 *
    1841 * We do not use bp_update_meta_cache() for the xprofile component. This is
     
    4063        $uncached_object_ids = array(
    4164                'group' => array(),
    4265                'field' => array(),
    43                 'data'   => array(),
     66                'data'  => array(),
    4467        );
    4568
    4669        $cache_groups = array(
     
    170193 * @param BP_XProfile_ProfileData $data_obj
    171194 */
    172195function xprofile_clear_profiledata_object_cache( $data_obj ) {
    173         wp_cache_delete( $data_obj->field_id, 'bp_xprofile_data_' . $data_obj->user_id );
     196        wp_cache_delete( "{$data_obj->user_id}:{$data_obj->field_id}", 'bp_xprofile_data' );
    174197}
    175 add_action( 'xprofile_data_after_save', 'xprofile_clear_profiledata_object_cache' );
     198add_action( 'xprofile_data_after_save',   'xprofile_clear_profiledata_object_cache' );
    176199add_action( 'xprofile_data_after_delete', 'xprofile_clear_profiledata_object_cache' );
    177200
    178201/**
  • src/bp-xprofile/bp-xprofile-classes.php

     
    12221222        public function populate( $field_id, $user_id )  {
    12231223                global $wpdb, $bp;
    12241224
    1225                 $cache_group = 'bp_xprofile_data_' . $user_id;
    1226                 $profiledata = wp_cache_get( $field_id, $cache_group );
     1225                $cache_key   = "{$user_id}:{$field_id}";
     1226                $profiledata = wp_cache_get( $cache_key, 'bp_xprofile_data' );
    12271227
    12281228                if ( false === $profiledata ) {
    1229                         $sql = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id );
     1229                        $sql         = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id );
    12301230                        $profiledata = $wpdb->get_row( $sql );
    12311231
    12321232                        if ( $profiledata ) {
    1233                                 wp_cache_set( $field_id, $profiledata, $cache_group );
     1233                                wp_cache_set( $cache_key, $profiledata, 'bp_xprofile_data' );
    12341234                        }
    12351235                }
    12361236
     
    12591259                global $wpdb, $bp;
    12601260
    12611261                // Check cache first
    1262                 $cached = wp_cache_get( $this->field_id, 'bp_xprofile_data_' . $this->user_id );
     1262                $cache_key = "{$this->user_id}:{$this->field_id}";
     1263                $cached    = wp_cache_get( $cache_key, 'bp_xprofile_data' );
    12631264
    12641265                if ( $cached && ! empty( $cached->id ) ) {
    12651266                        $retval = true;
     
    14001401
    14011402                $data = array();
    14021403
    1403                 $cache_group = 'bp_xprofile_data_' . $user_id;
     1404                $uncached_field_ids = bp_xprofile_get_non_cached_field_ids( $user_id, $field_ids, 'bp_xprofile_data' );
    14041405
    1405                 $uncached_field_ids = bp_get_non_cached_ids( $field_ids, $cache_group );
    1406 
    14071406                // Prime the cache
    14081407                if ( ! empty( $uncached_field_ids ) ) {
    14091408                        $bp = buddypress();
     
    14261425                        // Set caches
    14271426                        foreach ( $uncached_field_ids as $field_id ) {
    14281427
     1428                                $cache_key = "{$user_id}:{$field_id}";
     1429
    14291430                                // If a value was found, cache it
    14301431                                if ( isset( $queried_data[ $field_id ] ) ) {
    1431                                         wp_cache_set( $field_id, $queried_data[ $field_id ], $cache_group );
     1432                                        wp_cache_set( $cache_key, $queried_data[ $field_id ], 'bp_xprofile_data' );
    14321433
    14331434                                // If no value was found, cache an empty item
    14341435                                // to avoid future cache misses
     
    14401441                                        $d->value        = '';
    14411442                                        $d->last_updated = '';
    14421443
    1443                                         wp_cache_set( $field_id, $d, $cache_group );
     1444                                        wp_cache_set( $cache_key, $d, 'bp_xprofile_data' );
    14441445                                }
    14451446                        }
    14461447                }
    14471448
    14481449                // Now that all items are cached, fetch them
    14491450                foreach ( $field_ids as $field_id ) {
    1450                         $data[] = wp_cache_get( $field_id, $cache_group );
     1451                        $cache_key = "{$user_id}:{$field_id}";
     1452                        $data[]    = wp_cache_get( $cache_key, 'bp_xprofile_data' );
    14511453                }
    14521454
    14531455                return $data;
     
    14601462         * @return array
    14611463         */
    14621464        public static function get_all_for_user( $user_id ) {
    1463                 global $wpdb, $bp;
    14641465
    14651466                $groups = bp_xprofile_get_groups( array(
    14661467                        'user_id'                => $user_id,
     
    15141515                } else {
    15151516
    15161517                        // Check cache first
    1517                         $fielddata = wp_cache_get( $field_id, 'bp_xprofile_data_' . $user_id );
     1518                        $cache_key = "{$user_id}:{$field_id}";
     1519                        $fielddata = wp_cache_get( $cache_key, 'bp_xprofile_data' );
    15181520                        if ( false === $fielddata || empty( $fielddata->id ) ) {
    15191521                                $fielddata_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id ) );
    15201522                        } else {
     
    15511553                // Assemble uncached IDs
    15521554                $uncached_ids = array();
    15531555                foreach ( $user_ids as $user_id ) {
    1554                         if ( false === wp_cache_get( $field_id, 'bp_xprofile_data_' . $user_id ) ) {
     1556                        $cache_key = "{$user_id}:{$field_id}";
     1557                        if ( false === wp_cache_get( $cache_key, 'bp_xprofile_data' ) ) {
    15551558                                $uncached_ids[] = $user_id;
    15561559                        }
    15571560                }
     
    15831586                                        $d->last_updated = '';
    15841587                                }
    15851588
    1586                                 wp_cache_set( $field_id, $d, 'bp_xprofile_data_' . $d->user_id );
     1589                                $cache_key = "{$d->user_id}:{$field_id}";
     1590                                wp_cache_set( $cache_key, $d, 'bp_xprofile_data' );
    15871591                        }
    15881592                }
    15891593
    15901594                // Now that the cache is primed with all data, fetch it
    15911595                $data = array();
    15921596                foreach ( $user_ids as $user_id ) {
    1593                         $data[] = wp_cache_get( $field_id, 'bp_xprofile_data_' . $user_id );
     1597                        $cache_key = "{$user_id}:{$field_id}";
     1598                        $data[]    = wp_cache_get( $cache_key, 'bp_xprofile_data' );
    15941599                }
    15951600
    15961601                // If a single ID was passed, just return the value
  • src/bp-xprofile/bp-xprofile-loader.php

     
    353353        }
    354354
    355355        /**
     356         * Setup cache groups
     357         *
     358         * @since BuddyPress (2.2.0)
     359         */
     360        public function setup_cache_groups() {
     361
     362                // Global groups
     363                wp_cache_add_global_groups( array(
     364                        'bp_xprofile',
     365                        'bp_xprofile_data',
     366                        //'xprofile_meta'
     367                ) );
     368
     369                parent::setup_cache_groups();
     370        }
     371
     372        /**
    356373         * Adds "Settings > Profile" subnav item under the "Settings" adminbar menu.
    357374         *
    358375         * @since BuddyPress (2.0.0)
  • tests/phpunit/testcases/members/functions.php

     
    183183                global $wpdb, $bp;
    184184                $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->profile->table_name_data} WHERE user_id = %d AND field_id = 1", $u ) );
    185185                wp_cache_delete( 'bp_user_fullname_' . $u, 'bp' );
    186                 wp_cache_delete( 1, 'bp_xprofile_data_' . $u, 'bp' );
     186                wp_cache_delete( "{$u}:1", 'bp_xprofile_data', 'bp' );
    187187
    188188                $this->assertSame( '', xprofile_get_field_data( 1, $u ) );
    189189                $this->assertSame( 'Foo Foo', bp_core_get_user_displayname( $u ) );
  • tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php

     
    3636
    3737                $d = new BP_XProfile_ProfileData( $f, $u );
    3838
    39                 wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
     39                wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
    4040
    4141                $this->assertTrue( $d->exists() );
    4242        }
     
    5656                // Fake the cache
    5757                $c = new stdClass;
    5858                $c->id = 3;
    59                 wp_cache_set( $f, $c, 'bp_xprofile_data_' . $u );
     59                wp_cache_set( "{$u}:{$f}", $c, 'bp_xprofile_data' );
    6060
    6161                $this->assertTrue( $d->exists() );
    6262        }
     
    7373                ) );
    7474
    7575                // Just to be sure
    76                 wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
     76                wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
    7777
    7878                $this->assertEquals( 0, BP_XProfile_ProfileData::get_fielddataid_byid( $f, $u ) );
    7979        }
     
    9696                $d->save();
    9797
    9898                // Ensure it's deleted from cache
    99                 wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
     99                wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
    100100
    101101                $this->assertEquals( $d->id, BP_XProfile_ProfileData::get_fielddataid_byid( $f, $u ) );
    102102        }
     
    115115                // Fake the cache
    116116                $d = new stdClass;
    117117                $d->id = 5;
    118                 wp_cache_set( $f, $d, 'bp_xprofile_data_' . $u );
     118                wp_cache_set( "{$u}:{$f}", $d, 'bp_xprofile_data' );
    119119
    120120                $this->assertSame( 5, BP_XProfile_ProfileData::get_fielddataid_byid( $f, $u ) );
    121121        }
     
    138138                $d->save();
    139139
    140140                // Ensure it's deleted from cache
    141                 wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
     141                wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
    142142
    143143                $this->assertSame( 'foo', BP_XProfile_ProfileData::get_value_byid( $f, $u ) );
    144144        }
     
    179179                remove_filter( 'xprofile_data_last_updated_before_save', array( $this, 'filter_time' ) );
    180180
    181181                // Ensure it's deleted from cache
    182                 wp_cache_delete( $f, 'bp_xprofile_data_' . $u1 );
    183                 wp_cache_delete( $f, 'bp_xprofile_data_' . $u2 );
     182                wp_cache_delete( "{$u1}:{$f}", 'bp_xprofile_data' );
     183                wp_cache_delete( "{$u2}:{$f}", 'bp_xprofile_data' );
    184184
    185185                $eu1 = new stdClass;
    186186                $eu1->user_id = $u1;
     
    218218                $d = new stdClass;
    219219                $d->value = 'foo';
    220220                $d->field_id = $f;
    221                 wp_cache_set( $f, $d, 'bp_xprofile_data_' . $u );
     221                wp_cache_set( "{$u}:{$f}", $d, 'bp_xprofile_data' );
    222222
    223223                $this->assertSame( 'foo', BP_XProfile_ProfileData::get_value_byid( $f, $u ) );
    224224        }
     
    252252                $d2->value = 'bar';
    253253                $d2->last_updated = $time;
    254254
    255                 wp_cache_set( $f, $d1, 'bp_xprofile_data_' . $u1 );
    256                 wp_cache_set( $f, $d2, 'bp_xprofile_data_' . $u2 );
     255                wp_cache_set( "{$u1}:{$f}", $d1, 'bp_xprofile_data' );
     256                wp_cache_set( "{$u2}:{$f}", $d2, 'bp_xprofile_data' );
    257257
    258258                $eu1 = new stdClass;
    259259                $eu1->id = 10;
     
    313313                $d2->save();
    314314
    315315                // Ensure it's deleted from cache
    316                 wp_cache_delete( $f1, 'bp_xprofile_data_' . $u );
    317                 wp_cache_delete( $f2, 'bp_xprofile_data_' . $u );
     316                wp_cache_delete( "{$u}:{$f1}", 'bp_xprofile_data' );
     317                wp_cache_delete( "{$u}:{$f2}", 'bp_xprofile_data' );
    318318
    319319                $u_obj = new WP_User( $u );
    320320
     
    389389                $d2->last_updated = $time;
    390390                $d2->id = 2;
    391391
    392                 wp_cache_set( $f1, $d1, 'bp_xprofile_data_' . $u );
    393                 wp_cache_set( $f2, $d2, 'bp_xprofile_data_' . $u );
     392                wp_cache_set( "{$u}:{$f1}", $d1, 'bp_xprofile_data' );
     393                wp_cache_set( "{$u}:{$f2}", $d2, 'bp_xprofile_data' );
    394394
    395395                $u_obj = new WP_User( $u );
    396396