Ensure that WP_User_Query vars are filled after 'pre_get_users'.

This prevents notices from being thrown when a 'pre_get_users' callback
removes required values from the list of `query_vars`.

For backward compatibility with previous uses of 'pre_get_users', default
values are parsed both before and after the action is fired.

Fixes #33449.

git-svn-id: https://develop.svn.wordpress.org/trunk@34804 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Boone Gorges 2015-10-03 18:44:40 +00:00
parent 9cdffaaed8
commit b240a2a939
2 changed files with 59 additions and 20 deletions

View File

@ -75,6 +75,40 @@ class WP_User_Query {
}
}
/**
* Fills in missing query variables with default values.
*
* @since 4.4.0
* @access public
*
* @param array $args Query vars, as passed to `WP_User_Query`.
* @return array Complete query variables with undefined ones filled in with defaults.
*/
public static function fill_query_vars( $args ) {
$defaults = array(
'blog_id' => $GLOBALS['blog_id'],
'role' => '',
'meta_key' => '',
'meta_value' => '',
'meta_compare' => '',
'include' => array(),
'exclude' => array(),
'search' => '',
'search_columns' => array(),
'orderby' => 'login',
'order' => 'ASC',
'offset' => '',
'number' => '',
'paged' => 1,
'count_total' => true,
'fields' => 'all',
'who' => '',
'has_published_posts' => null,
);
return wp_parse_args( $args, $defaults );
}
/**
* Prepare the query variables.
*
@ -146,26 +180,7 @@ class WP_User_Query {
if ( empty( $this->query_vars ) || ! empty( $query ) ) {
$this->query_limit = null;
$this->query_vars = wp_parse_args( $query, array(
'blog_id' => $GLOBALS['blog_id'],
'role' => '',
'meta_key' => '',
'meta_value' => '',
'meta_compare' => '',
'include' => array(),
'exclude' => array(),
'search' => '',
'search_columns' => array(),
'orderby' => 'login',
'order' => 'ASC',
'offset' => '',
'number' => '',
'paged' => 1,
'count_total' => true,
'fields' => 'all',
'who' => '',
'has_published_posts' => null,
) );
$this->query_vars = $this->fill_query_vars( $query );
}
/**
@ -181,7 +196,9 @@ class WP_User_Query {
*/
do_action( 'pre_get_users', $this );
// Ensure that query vars are filled after 'pre_get_users'.
$qv =& $this->query_vars;
$qv = $this->fill_query_vars( $qv );
if ( is_array( $qv['fields'] ) ) {
$qv['fields'] = array_unique( $qv['fields'] );

View File

@ -874,4 +874,26 @@ class Tests_User_Query extends WP_UnitTestCase {
$this->assertEquals( array( $users[2], $users[1] ), $q->results );
}
/**
* @ticket 33449
*/
public function test_query_vars_should_be_filled_in_after_pre_get_users() {
$query_vars = array( 'blog_id', 'role', 'meta_key', 'meta_value', 'meta_compare', 'include', 'exclude', 'search', 'search_columns', 'orderby', 'order', 'offset', 'number', 'paged', 'count_total', 'fields', 'who', 'has_published_posts' );
add_action( 'pre_get_users', array( $this, 'filter_pre_get_users_args' ) );
$q = new WP_User_Query( array_fill_keys( $query_vars, '1' ) );
remove_action( 'pre_get_users', array( $this, 'filter_pre_get_users_args' ) );
foreach ( $query_vars as $query_var ) {
$this->assertTrue( array_key_exists( $query_var, $q->query_vars ), "$query_var does not exist." );
}
}
public function filter_pre_get_users_args( $q ) {
foreach ( $q->query_vars as $k => $v ) {
unset( $q->query_vars[ $k ] );
}
}
}