Default to leading and trailing wildcards for site user searches. Require explicit trailing wildcard asterisk request for network user searches. Disallow leading wildcards for network user searches. Move wildcard policy up the stake, allowing more flexibility in WP_User_Query. Props SergeyBiryukov. fixes #16014

git-svn-id: https://develop.svn.wordpress.org/trunk@17189 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Ryan Boren 2010-12-30 23:38:21 +00:00
parent 2d0e34b310
commit a0a77f0380
3 changed files with 21 additions and 7 deletions

View File

@ -31,6 +31,8 @@ class WP_MS_Users_List_Table extends WP_List_Table {
'fields' => 'all_with_meta'
);
$args['search'] = ltrim($args['search'], '*');
if ( $role == 'super' ) {
$logins = implode( "', '", get_super_admins() );
$args['include'] = $wpdb->get_col( "SELECT ID FROM $wpdb->users WHERE user_login IN ('$logins')" );

View File

@ -51,6 +51,8 @@ class WP_Users_List_Table extends WP_List_Table {
'fields' => 'all_with_meta'
);
$args['search'] = '*' . $args['search'] . '*';
if ( $this->is_site_users )
$args['blog_id'] = $this->site_id;

View File

@ -465,11 +465,19 @@ class WP_User_Query {
$search = trim( $qv['search'] );
if ( $search ) {
$wild = false;
if ( false !== strpos($search, '*') ) {
$wild = true;
$leading_wild = ( ltrim($search, '*') != $search );
$trailing_wild = ( rtrim($search, '*') != $search );
if ( $leading_wild && $trailing_wild )
$wild = 'both';
elseif ( $leading_wild )
$wild = 'leading';
elseif ( $trailing_wild )
$wild = 'trailing';
else
$wild = false;
if ( $wild )
$search = trim($search, '*');
}
if ( false !== strpos( $search, '@') )
$search_columns = array('user_email');
elseif ( is_numeric($search) )
@ -564,19 +572,21 @@ class WP_User_Query {
*
* @param string $string
* @param array $cols
* @param bool $wild Whether to allow trailing wildcard searches. Default is false.
* @param bool $wild Whether to allow wildcard searches. Default is false for Network Admin, true for
* single site. Single site allows leading and trailing wildcards, Network Admin only trailing.
* @return string
*/
function get_search_sql( $string, $cols, $wild = false ) {
$string = esc_sql( $string );
$searches = array();
$wild_char = ( $wild ) ? '%' : '';
$leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : '';
$trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : '';
foreach ( $cols as $col ) {
if ( 'ID' == $col )
$searches[] = "$col = '$string'";
else
$searches[] = "$col LIKE '" . like_escape($string) . "$wild_char'";
$searches[] = "$col LIKE '$leading_wild" . like_escape($string) . "$trailing_wild'";
}
return ' AND (' . implode(' OR ', $searches) . ')';