Skip to:
Content

BuddyPress.org

Ticket #7418: 7418.1.patch

File 7418.1.patch, 10.0 KB (added by dcavins, 3 years ago)

Add search_columns parameter and calculate wildcard placement in search string.

  • src/bp-groups/bp-groups-functions.php

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index 25f82d7..c52d519 100644
    function groups_get_groups( $args = '' ) { 
    709709                'exclude'            => false,          // Do not include these specific groups (group_ids).
    710710                'parent_id'          => null,           // Get groups that are children of the specified group(s).
    711711                'search_terms'       => false,          // Limit to groups that match these search terms.
     712                'search_columns'     => array(),        // Select which columns to search.
    712713                'group_type'         => '',             // Array or comma-separated list of group types to limit results to.
    713714                'group_type__in'     => '',             // Array or comma-separated list of group types to limit results to.
    714715                'group_type__not_in' => '',             // Array or comma-separated list of group types that will be excluded from results.
    function groups_get_groups( $args = '' ) { 
    729730                'exclude'            => $r['exclude'],
    730731                'parent_id'          => $r['parent_id'],
    731732                'search_terms'       => $r['search_terms'],
     733                'search_columns'     => $r['search_columns'],
    732734                'group_type'         => $r['group_type'],
    733735                'group_type__in'     => $r['group_type__in'],
    734736                'group_type__not_in' => $r['group_type__not_in'],
  • src/bp-groups/classes/class-bp-groups-group.php

    diff --git src/bp-groups/classes/class-bp-groups-group.php src/bp-groups/classes/class-bp-groups-group.php
    index 9b89695..e1f483b 100644
    class BP_Groups_Group { 
    882882         *                                            Default: null (no limit).
    883883         *     @type int          $user_id            Optional. If provided, results will be limited to groups
    884884         *                                            of which the specified user is a member. Default: null.
    885          *     @type string       $search_terms       Optional. If provided, only groups whose names or descriptions
    886          *                                            match the search terms will be returned. Default: false.
     885         *     @type string       $search_terms       Optional. If provided, only groups whose names or descriptions
     886         *                                            match the search terms will be returned. Allows specifying the
     887         *                                            wildcard position using a '*' character before or after the
     888         *                                            string or both.  Works in concert with $search_columns.
     889         *                                            Default: false.
     890         *     @type string       $search_columns     Optional. If provided, only apply the search terms to the
     891         *                                            specified columns. Works in concert with $search.
     892         *                                            Default: empty array().
    887893         *     @type array|string $group_type         Array or comma-separated list of group types to limit results to.
    888894         *     @type array|string $group_type__in     Array or comma-separated list of group types to limit results to.
    889895         *     @type array|string $group_type__not_in Array or comma-separated list of group types that will be
    class BP_Groups_Group { 
    939945                        'page'               => null,
    940946                        'user_id'            => 0,
    941947                        'search_terms'       => false,
     948                        'search_columns'     => array(),
    942949                        'group_type'         => '',
    943950                        'group_type__in'     => '',
    944951                        'group_type__not_in' => '',
    class BP_Groups_Group { 
    973980                        $where_conditions['hidden'] = "g.status != 'hidden'";
    974981                }
    975982
    976                 if ( ! empty( $r['search_terms'] ) ) {
    977                         $search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%';
    978                         $where_conditions['search'] = $wpdb->prepare( "( g.name LIKE %s OR g.description LIKE %s )", $search_terms_like, $search_terms_like );
     983                $search = '';
     984                if ( isset( $r['search_terms'] ) ) {
     985                        $search = trim( $r['search_terms'] );
     986                }
     987
     988                if ( $search ) {
     989                        $leading_wild = ( ltrim( $search, '*' ) != $search );
     990                        $trailing_wild = ( rtrim( $search, '*' ) != $search );
     991                        if ( $leading_wild && $trailing_wild ) {
     992                                $wild = 'both';
     993                        } elseif ( $leading_wild ) {
     994                                $wild = 'leading';
     995                        } elseif ( $trailing_wild ) {
     996                                $wild = 'trailing';
     997                        } else {
     998                                // Default is to wrap in wildcard characters.
     999                                $wild = 'both';
     1000                        }
     1001                        $search = trim( $search, '*' );
     1002
     1003                        $searches = array();
     1004                        $leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : '';
     1005                        $trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : '';
     1006                        $wildcarded = $leading_wild . bp_esc_like( $search ) . $trailing_wild;
     1007
     1008                        $search_columns = array( 'name', 'description' );
     1009                        if ( $r['search_columns'] ) {
     1010                                $search_columns = array_intersect( $r['search_columns'], $search_columns );
     1011                        }
     1012
     1013                        foreach ( $search_columns as $search_column ) {
     1014                                $searches[] = $wpdb->prepare( "$search_column LIKE %s", $wildcarded );
     1015                        }
     1016
     1017                        $where_conditions['search'] = '(' . implode(' OR ', $searches) . ')';
    9791018                }
    9801019
    9811020                $meta_query_sql = self::get_meta_query_sql( $r['meta_query'] );
  • src/bp-groups/classes/class-bp-groups-template.php

    diff --git src/bp-groups/classes/class-bp-groups-template.php src/bp-groups/classes/class-bp-groups-template.php
    index b8a76de..ba5e412 100644
    class BP_Groups_Template { 
    166166                        'exclude'            => false,
    167167                        'parent_id'          => null,
    168168                        'search_terms'       => '',
     169                        'search_columns'     => array(),
    169170                        'group_type'         => '',
    170171                        'group_type__in'     => '',
    171172                        'group_type__not_in' => '',
    class BP_Groups_Template { 
    217218                                'page'               => $this->pag_page,
    218219                                'user_id'            => $user_id,
    219220                                'search_terms'       => $search_terms,
     221                                'search_columns'     => $search_columns,
    220222                                'meta_query'         => $meta_query,
    221223                                'group_type'         => $group_type,
    222224                                'group_type__in'     => $group_type__in,
  • tests/phpunit/testcases/groups/class-bp-groups-group.php

    diff --git tests/phpunit/testcases/groups/class-bp-groups-group.php tests/phpunit/testcases/groups/class-bp-groups-group.php
    index 130fc91..c05dd9c 100644
    class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase { 
    306306        }
    307307
    308308        /**
     309         * @group get
     310         */
     311        public function test_get_search_with_left_wildcard() {
     312                $g1 = $this->factory->group->create( array(
     313                        'name' => 'Ye Lads',
     314                        'description' => "My Bonnie lies over the ocean",
     315                ) );
     316                $g2 = $this->factory->group->create();
     317
     318                $groups = BP_Groups_Group::get( array(
     319                        'search_terms' => "*ads",
     320                ) );
     321
     322                $found = wp_list_pluck( $groups['groups'], 'id' );
     323
     324                $this->assertEquals( array( $g1 ), $found );
     325        }
     326
     327        /**
     328         * @group get
     329         */
     330        public function test_get_search_with_left_wildcard_should_miss() {
     331                $g1 = $this->factory->group->create( array(
     332                        'name' => 'Ye Lads',
     333                        'description' => "My Bonnie lies over the ocean",
     334                ) );
     335                $g2 = $this->factory->group->create();
     336
     337                $groups = BP_Groups_Group::get( array(
     338                        'search_terms' => "*la",
     339                ) );
     340
     341                $found = wp_list_pluck( $groups['groups'], 'id' );
     342
     343                $this->assertEquals( array(), $found );
     344        }
     345
     346        /**
     347         * @group get
     348         */
     349        public function test_get_search_with_right_wildcard() {
     350                $g1 = $this->factory->group->create( array(
     351                        'name' => 'Ye Lads',
     352                        'description' => "My Bonnie lies over the ocean",
     353                ) );
     354                $g2 = $this->factory->group->create();
     355
     356                $groups = BP_Groups_Group::get( array(
     357                        'search_terms' => "Ye*",
     358                ) );
     359
     360                $found = wp_list_pluck( $groups['groups'], 'id' );
     361
     362                $this->assertEquals( array( $g1 ), $found );
     363        }
     364
     365        /**
     366         * @group get
     367         */
     368        public function test_get_search_with_right_wildcard_should_miss() {
     369                $g1 = $this->factory->group->create( array(
     370                        'name' => 'Ye Lads',
     371                        'description' => "My Bonnie lies over the ocean",
     372                ) );
     373                $g2 = $this->factory->group->create();
     374
     375                $groups = BP_Groups_Group::get( array(
     376                        'search_terms' => "la*",
     377                ) );
     378
     379                $found = wp_list_pluck( $groups['groups'], 'id' );
     380
     381                $this->assertEquals( array(), $found );
     382        }
     383
     384        /**
     385         * @group get
     386         */
     387        public function test_get_search_with_both_wildcard() {
     388                $g1 = $this->factory->group->create( array(
     389                        'name' => 'Ye Lads',
     390                        'description' => "My Bonnie lies over the ocean",
     391                ) );
     392                $g2 = $this->factory->group->create();
     393
     394                $groups = BP_Groups_Group::get( array(
     395                        'search_terms' => "*la*",
     396                ) );
     397
     398                $found = wp_list_pluck( $groups['groups'], 'id' );
     399
     400                $this->assertEquals( array( $g1 ), $found );
     401        }
     402
     403        /**
     404         * @group get
     405         */
     406        public function test_get_search_limited_to_name_column() {
     407                $g1 = $this->factory->group->create( array(
     408                        'name' => 'Ye Lads',
     409                        'description' => "My Bonnie lies over the ocean",
     410                ) );
     411                $g2 = $this->factory->group->create();
     412                $g3 = $this->factory->group->create( array(
     413                        'name' => 'Bonnie Lasses',
     414                        'description' => "That lad is unknown to me",
     415                ) );
     416
     417                $groups = BP_Groups_Group::get( array(
     418                        'search_terms'   => "lad",
     419                        'search_columns' => array( 'name' ),
     420                ) );
     421
     422                $found = wp_list_pluck( $groups['groups'], 'id' );
     423
     424                $this->assertEquals( array( $g1 ), $found );
     425        }
     426
     427        /**
     428         * @group get
     429         */
     430        public function test_get_search_limited_to_description_column() {
     431                $g1 = $this->factory->group->create( array(
     432                        'name' => 'Ye Lads',
     433                        'description' => "My Bonnie lies over the ocean",
     434                ) );
     435                $g2 = $this->factory->group->create();
     436                $g3 = $this->factory->group->create( array(
     437                        'name' => 'Bonnie Lasses',
     438                        'description' => "That lad is unknown to me",
     439                ) );
     440
     441                $groups = BP_Groups_Group::get( array(
     442                        'search_terms'   => "lad",
     443                        'search_columns' => array( 'description' ),
     444                ) );
     445
     446                $found = wp_list_pluck( $groups['groups'], 'id' );
     447
     448                $this->assertEquals( array( $g3 ), $found );
     449        }
     450
     451        /**
    309452         * BP 1.8 will change the default 'type' param in favor of default
    310453         * 'order' and 'orderby'. This is to make sure that existing plugins
    311454         * will work appropriately