* Add `isset()` checks all over `WP_User_Query::prepare_query()` and `WP_User_Query::query()`. When a `WP_User_Query` instance is constructed without passing args, no query vars are filled in, thus `$qv` doesn't contain most of the expected indices.

* Suppress an undefined index notice in `tests/user/query.php`

Fixes #25292.
See #25282.


Built from https://develop.svn.wordpress.org/trunk@25392


git-svn-id: http://core.svn.wordpress.org/trunk@25326 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Scott Taylor 2013-09-12 06:25:09 +00:00
parent 71430cd29a
commit 6744355f70
1 changed files with 45 additions and 33 deletions

View File

@ -409,39 +409,44 @@ class WP_User_Query {
$this->query_fields = "$wpdb->users.ID";
}
if ( $qv['count_total'] )
if ( isset( $qv['count_total'] ) && $qv['count_total'] )
$this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;
$this->query_from = "FROM $wpdb->users";
$this->query_where = "WHERE 1=1";
// sorting
if ( in_array( $qv['orderby'], array('nicename', 'email', 'url', 'registered') ) ) {
$orderby = 'user_' . $qv['orderby'];
} elseif ( in_array( $qv['orderby'], array('user_nicename', 'user_email', 'user_url', 'user_registered') ) ) {
$orderby = $qv['orderby'];
} elseif ( 'name' == $qv['orderby'] || 'display_name' == $qv['orderby'] ) {
$orderby = 'display_name';
} elseif ( 'post_count' == $qv['orderby'] ) {
// todo: avoid the JOIN
$where = get_posts_by_author_sql('post');
$this->query_from .= " LEFT OUTER JOIN (
SELECT post_author, COUNT(*) as post_count
FROM $wpdb->posts
$where
GROUP BY post_author
) p ON ({$wpdb->users}.ID = p.post_author)
";
$orderby = 'post_count';
} elseif ( 'ID' == $qv['orderby'] || 'id' == $qv['orderby'] ) {
$orderby = 'ID';
} elseif ( 'meta_value' == $qv['orderby'] ) {
$orderby = "$wpdb->usermeta.meta_value";
} else {
$orderby = 'user_login';
if ( isset( $qv['orderby'] ) ) {
if ( in_array( $qv['orderby'], array('nicename', 'email', 'url', 'registered') ) ) {
$orderby = 'user_' . $qv['orderby'];
} elseif ( in_array( $qv['orderby'], array('user_nicename', 'user_email', 'user_url', 'user_registered') ) ) {
$orderby = $qv['orderby'];
} elseif ( 'name' == $qv['orderby'] || 'display_name' == $qv['orderby'] ) {
$orderby = 'display_name';
} elseif ( 'post_count' == $qv['orderby'] ) {
// todo: avoid the JOIN
$where = get_posts_by_author_sql('post');
$this->query_from .= " LEFT OUTER JOIN (
SELECT post_author, COUNT(*) as post_count
FROM $wpdb->posts
$where
GROUP BY post_author
) p ON ({$wpdb->users}.ID = p.post_author)
";
$orderby = 'post_count';
} elseif ( 'ID' == $qv['orderby'] || 'id' == $qv['orderby'] ) {
$orderby = 'ID';
} elseif ( 'meta_value' == $qv['orderby'] ) {
$orderby = "$wpdb->usermeta.meta_value";
} else {
$orderby = 'user_login';
}
}
$qv['order'] = strtoupper( $qv['order'] );
if ( empty( $orderby ) )
$orderby = 'user_login';
$qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';
if ( 'ASC' == $qv['order'] )
$order = 'ASC';
else
@ -449,14 +454,17 @@ class WP_User_Query {
$this->query_orderby = "ORDER BY $orderby $order";
// limit
if ( $qv['number'] ) {
if ( isset( $qv['number'] ) && $qv['number'] ) {
if ( $qv['offset'] )
$this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']);
else
$this->query_limit = $wpdb->prepare("LIMIT %d", $qv['number']);
}
$search = trim( $qv['search'] );
$search = '';
if ( isset( $qv['search'] ) )
$search = trim( $qv['search'] );
if ( $search ) {
$leading_wild = ( ltrim($search, '*') != $search );
$trailing_wild = ( rtrim($search, '*') != $search );
@ -490,16 +498,20 @@ class WP_User_Query {
$this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );
}
$blog_id = absint( $qv['blog_id'] );
$blog_id = 0;
if ( isset( $qv['blog_id'] ) )
$blog_id = absint( $qv['blog_id'] );
if ( 'authors' == $qv['who'] && $blog_id ) {
if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) {
$qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level';
$qv['meta_value'] = 0;
$qv['meta_compare'] = '!=';
$qv['blog_id'] = $blog_id = 0; // Prevent extra meta query
}
$role = trim( $qv['role'] );
$role = '';
if ( isset( $qv['role'] ) )
$role = trim( $qv['role'] );
if ( $blog_id && ( $role || is_multisite() ) ) {
$cap_meta_query = array();
@ -525,10 +537,10 @@ class WP_User_Query {
$this->query_fields = 'DISTINCT ' . $this->query_fields;
}
if ( !empty( $qv['include'] ) ) {
if ( ! empty( $qv['include'] ) ) {
$ids = implode( ',', wp_parse_id_list( $qv['include'] ) );
$this->query_where .= " AND $wpdb->users.ID IN ($ids)";
} elseif ( !empty($qv['exclude']) ) {
} elseif ( ! empty( $qv['exclude'] ) ) {
$ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) );
$this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)";
}
@ -553,7 +565,7 @@ class WP_User_Query {
$this->results = $wpdb->get_col("SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit");
}
if ( $qv['count_total'] )
if ( isset( $qv['count_total'] ) && $qv['count_total'] )
$this->total_users = $wpdb->get_var( apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()' ) );
if ( !$this->results )