Skip to:
Content

BuddyPress.org

Changeset 8753


Ignore:
Timestamp:
08/03/2014 08:51:44 PM (12 years ago)
Author:
djpaul
Message:

Core: adjust the SQL generated by BP_User_Query's search_wildcard parameter for better Suggestions API search results.

Introduced in r8675, the search_wildcard parameter controls where BuddyPress places MySQL wildcard characters around the search term (when it's set).

This change adjusts how the wildcard SQL is constructed; in addition to the wildcard, we now also check for matches that have a single space character at the opposite end of the string (from where the wildcard is). This allows searching data that looks like (for example) a surname in a combined first name/surname field.
e.g. if a displayname is "Paul Gibbs", you can search for "Gi", and with search_wildcard=right, the SQL generated will be LIKE 'Gi%' OR LIKE '% Gi%'.

See #3278

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-core/bp-core-classes.php

    r8677 r8753  
    369369                // xprofile field matches happen in bp_xprofile_bp_user_query_search()
    370370                if ( false !== $search_terms ) {
    371                         $search_terms_like = bp_esc_like( $search_terms );
     371                        $search_terms = bp_esc_like( $search_terms );
    372372
    373373                        if ( $search_wildcard === 'left' ) {
    374                                 $search_terms_like = '%' . $search_terms_like;
     374                                $search_terms_nospace = '%' . $search_terms;
     375                                $search_terms_space   = '%' . $search_terms . ' %';
    375376                        } elseif ( $search_wildcard === 'right' ) {
    376                                 $search_terms_like = $search_terms_like . '%';
     377                                $search_terms_nospace =        $search_terms . '%';
     378                                $search_terms_space   = '% ' . $search_terms . '%';
    377379                        } else {
    378                                 $search_terms_like = '%' . $search_terms_like . '%';
    379                         }
    380 
    381                         $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 );
     380                                $search_terms_nospace = '%' . $search_terms . '%';
     381                                $search_terms_space   = '%' . $search_terms . '%';
     382                        }
     383
     384                        $sql['where']['search'] = $wpdb->prepare(
     385                                "u.{$this->uid_name} IN ( SELECT ID FROM {$wpdb->users} WHERE ( user_login LIKE %s OR user_login LIKE %s OR user_nicename LIKE %s OR user_nicename LIKE %s ) )",
     386                                $search_terms_nospace,
     387                                $search_terms_space,
     388                                $search_terms_nospace,
     389                                $search_terms_space
     390                        );
    382391                }
    383392
    … …  
    25672576         */
    25682577        protected $default_args = array(
    2569                 'limit'        => 16,
     2578                'limit'        => 10,
    25702579                'only_friends' => false,
    25712580                'term'         => '',
    … …  
    26072616                        'per_page'        => $this->args['limit'],
    26082617                        'search_terms'    => $this->args['term'],
     2618                        'search_wildcard' => is_rtl() ? 'left' : 'right',
    26092619                );
    26102620
  • trunk/src/bp-groups/bp-groups-classes.php

    r8669 r8753  
    43884388                        'per_page'        => $this->args['limit'],
    43894389                        'search_terms'    => $this->args['term'],
     4390                        'search_wildcard' => 'right',
    43904391                );
    43914392
  • trunk/src/bp-xprofile/bp-xprofile-functions.php

    r8689 r8753  
    591591        $bp = buddypress();
    592592
    593         $search_terms_clean = esc_sql( esc_sql( $query->query_vars['search_terms'] ) );
     593        $search_terms_clean = bp_esc_like( $query->query_vars['search_terms'] );
    594594
    595595        if ( $query->query_vars['search_wildcard'] === 'left' ) {
    596                 $search_terms_clean = '%' . $search_terms_clean;
     596                $search_terms_nospace = '%' . $search_terms_clean;
     597                $search_terms_space   = '%' . $search_terms_clean . ' %';
    597598        } elseif ( $query->query_vars['search_wildcard'] === 'right' ) {
    598                 $search_terms_clean = $search_terms_clean . '%';
     599                $search_terms_nospace =        $search_terms_clean . '%';
     600                $search_terms_space   = '% ' . $search_terms_clean . '%';
    599601        } else {
    600                 $search_terms_clean = '%' . $search_terms_clean . '%';
     602                $search_terms_nospace = '%' . $search_terms_clean . '%';
     603                $search_terms_space   = '%' . $search_terms_clean . '%';
    601604        }
    602605
    603606        // Combine the core search (against wp_users) into a single OR clause
    604607        // with the xprofile_data search
     608        $search_xprofile = $wpdb->prepare(
     609                "u.{$query->uid_name} IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE %s OR value LIKE %s )",
     610                $search_terms_nospace,
     611                $search_terms_space
     612        );
     613
    605614        $search_core     = $sql['where']['search'];
    606         $search_xprofile = "u.{$query->uid_name} IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE '{$search_terms_clean}' )";
    607615        $search_combined = "( {$search_xprofile} OR {$search_core} )";
    608 
    609616        $sql['where']['search'] = $search_combined;
    610617
Note: See TracChangeset for help on using the changeset viewer.