Skip to:
Content

BuddyPress.org

Ticket #5769: 5769.01.patch

File 5769.01.patch, 4.6 KB (added by DJPaul, 11 years ago)
  • src/bp-core/bp-core-classes.php

    diff --git a/src/bp-core/bp-core-classes.php b/src/bp-core/bp-core-classes.php
    index e0d2c17..6332570 100644
    a b if ( !defined( 'ABSPATH' ) ) exit; 
    3030 *     @type string|bool $search_terms Terms to search by. Search happens
    3131 *           across xprofile fields. Requires XProfile component.
    3232 *           Default: false.
     33 *     @type string $search_wildcard When searching with $search_terms,
     34 *           set where wildcards around the term should be positioned.
     35 *           Default: 'both'. Other values: 'left', 'right'.
    3336 *     @type array|string|bool $include An array or comma-separated list of
    3437 *           user IDs to which query should be limited.
    3538 *           Default: false.
    class BP_User_Query { 
    153156                                'page'            => 1,
    154157                                'user_id'         => 0,
    155158                                'search_terms'    => false,
     159                                'search_wildcard' => 'both',
    156160                                'include'         => false,
    157161                                'exclude'         => false,
    158162                                'user_ids'        => false,
    class BP_User_Query { 
    364368                // 'search_terms' searches user_login and user_nicename
    365369                // xprofile field matches happen in bp_xprofile_bp_user_query_search()
    366370                if ( false !== $search_terms ) {
    367                         $search_terms_like = '%' . bp_esc_like( $search_terms ) . '%';
     371                        $search_terms_like = bp_esc_like( $search_terms );
     372
     373                        if ( $search_wildcard === 'left' ) {
     374                                $search_terms_like = '%' . $search_terms_like;
     375                        } elseif ( $search_wildcard === 'right' ) {
     376                                $search_terms_like = $search_terms_like . '%';
     377                        } else {
     378                                $search_terms_like = '%' . $search_terms_like . '%';
     379                        }
     380
    368381                        $sql['where']['search'] = $wpdb->prepare( "u.{$this->uid_name} IN ( SELECT ID FROM {$wpdb->users} WHERE ( user_login LIKE %s OR user_nicename LIKE %s ) )", $search_terms_like, $search_terms_like );
    369382                }
    370383
  • src/bp-xprofile/bp-xprofile-functions.php

    diff --git a/src/bp-xprofile/bp-xprofile-functions.php b/src/bp-xprofile/bp-xprofile-functions.php
    index a437392..2f2c1ce 100644
    a b function bp_xprofile_bp_user_query_search( $sql, BP_User_Query $query ) { 
    596596
    597597        $search_terms_clean = esc_sql( esc_sql( $query->query_vars['search_terms'] ) );
    598598
     599        if ( $query->query_vars['search_wildcard'] === 'left' ) {
     600                $search_terms_clean = '%' . $search_terms_clean;
     601        } elseif ( $query->query_vars['search_wildcard'] === 'right' ) {
     602                $search_terms_clean = $search_terms_clean . '%';
     603        } else {
     604                $search_terms_clean = '%' . $search_terms_clean . '%';
     605        }
     606
    599607        // Combine the core search (against wp_users) into a single OR clause
    600608        // with the xprofile_data search
    601609        $search_core     = $sql['where']['search'];
    602         $search_xprofile = "u.{$query->uid_name} IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE '%{$search_terms_clean}%' )";
     610        $search_xprofile = "u.{$query->uid_name} IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE '{$search_terms_clean}' )";
    603611        $search_combined = "( {$search_xprofile} OR {$search_core} )";
    604612
    605613        $sql['where']['search'] = $search_combined;
  • tests/phpunit/testcases/core/class-bp-user-query.php

    diff --git a/tests/phpunit/testcases/core/class-bp-user-query.php b/tests/phpunit/testcases/core/class-bp-user-query.php
    index 088aded..0c2eb97 100644
    a b class BP_Tests_BP_User_Query_TestCases extends BP_UnitTestCase { 
    219219
    220220                $this->assertEquals( $user_id, $found_user_id );
    221221        }
     222
     223        public function test_bp_user_query_search_wildcards() {
     224                $u1 = $this->create_user( array(
     225                        'user_login' => 'xfoo',
     226                ) );
     227                xprofile_set_field_data( 1, $u1, "Bar" );
     228                $q1 = new BP_User_Query( array( 'search_terms' => 'foo', 'search_wildcard' => 'left' ) );
     229
     230                $u2 = $this->create_user( array(
     231                        'user_login' => 'foox',
     232                ) );
     233                xprofile_set_field_data( 1, $u2, "Bar" );
     234                $q2 = new BP_User_Query( array( 'search_terms' => 'foo', 'search_wildcard' => 'right' ) );
     235
     236                $u3 = $this->create_user( array(
     237                        'user_login' => 'xfoox',
     238                ) );
     239                xprofile_set_field_data( 1, $u3, "Bar" );
     240                $q3 = new BP_User_Query( array( 'search_terms' => 'foo', 'search_wildcard' => 'both' ) );
     241
     242                $this->assertNotEmpty( $q1->results );
     243                $q1 = array_pop( $q1->results );
     244                $this->assertEquals( $u1, $q1->ID );
     245
     246                $this->assertNotEmpty( $q2->results );
     247                $q2 = array_pop( $q2->results );
     248                $this->assertEquals( $u2, $q2->ID );
     249
     250                $this->assertNotEmpty( $q3->results );
     251                foreach ( $q3->results as $user ) {
     252                        $this->assertTrue( in_array( $user->ID, array( $u1, $u2, $u3 ) ) );
     253                }
     254        }
     255
    222256        /**
    223257         * @group exclude
    224258         */