Multisite: add new sites_pre_query
and networks_pre_query
filters to short circuit WP_Site_Query and WP_Network_Query queries.
Similar to the `posts_pre_query` filter for WP_Query added in #36687. These filters lets you short circuit the queries to return your own results. Add a new filter `sites_pre_query` - which returns null by default. Return a non-null value to bypass WordPress's default `get_sites` queries. Developers should note that filtering functions that require pagination information are encouraged to set the `found_sites` property of the `WP_Site_Query` object, passed to the filter by reference. If `WP_Site_Query` does not perform a database query, it will not have enough information to generate these values itself. Add a new filter `networks_pre_query` - which returns null by default. Return a non-null value to bypass WordPress's default `get_networks` queries. Developers should note that filtering functions that require pagination information are encouraged to set the `found_networks` property of the `WP_Network_Query` object, passed to the filter by reference. If `WP_Network_Query` does not perform a database query, it will not have enough information to generate these values itself. Props spacedmonkey. Fixes #45749. git-svn-id: https://develop.svn.wordpress.org/trunk@44983 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
parent
42547da41d
commit
7793e670b8
@ -197,6 +197,24 @@ class WP_Network_Query {
|
||||
*/
|
||||
do_action_ref_array( 'pre_get_networks', array( &$this ) );
|
||||
|
||||
$network_ids = null;
|
||||
|
||||
/**
|
||||
* Filter the sites array before the query takes place.
|
||||
*
|
||||
* Return a non-null value to bypass WordPress's default site queries.
|
||||
*
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param array|null $site_ids Return an array of site data to short-circuit WP's site query,
|
||||
* or null to allow WP to run its normal queries.
|
||||
* @param WP_Network_Query $this The WP_Network_Query instance, passed by reference.
|
||||
*/
|
||||
$network_ids = apply_filters_ref_array( 'networks_pre_query', array( $network_ids, &$this ) );
|
||||
|
||||
if ( null === $network_ids ) {
|
||||
|
||||
// $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
|
||||
$_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
|
||||
|
||||
@ -224,6 +242,7 @@ class WP_Network_Query {
|
||||
$network_ids = $cache_value['network_ids'];
|
||||
$this->found_networks = $cache_value['found_networks'];
|
||||
}
|
||||
}
|
||||
|
||||
if ( $this->found_networks && $this->query_vars['number'] ) {
|
||||
$this->max_num_pages = ceil( $this->found_networks / $this->query_vars['number'] );
|
||||
|
@ -288,6 +288,24 @@ class WP_Site_Query {
|
||||
$this->meta_query_clauses = $this->meta_query->get_sql( 'blog', $wpdb->blogs, 'blog_id', $this );
|
||||
}
|
||||
|
||||
$site_ids = null;
|
||||
|
||||
/**
|
||||
* Filter the sites array before the query takes place.
|
||||
*
|
||||
* Return a non-null value to bypass WordPress's default site queries.
|
||||
*
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param array|null $site_ids Return an array of site data to short-circuit WP's site query,
|
||||
* or null to allow WP to run its normal queries.
|
||||
* @param WP_Site_Query $this The WP_Site_Query instance, passed by reference.
|
||||
*/
|
||||
$site_ids = apply_filters_ref_array( 'sites_pre_query', array( $site_ids, &$this ) );
|
||||
|
||||
if ( null === $site_ids ) {
|
||||
|
||||
// $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
|
||||
$_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
|
||||
|
||||
@ -315,6 +333,7 @@ class WP_Site_Query {
|
||||
$site_ids = $cache_value['site_ids'];
|
||||
$this->found_sites = $cache_value['found_sites'];
|
||||
}
|
||||
}
|
||||
|
||||
if ( $this->found_sites && $this->query_vars['number'] ) {
|
||||
$this->max_num_pages = ceil( $this->found_sites / $this->query_vars['number'] );
|
||||
|
@ -522,6 +522,41 @@ if ( is_multisite() ) :
|
||||
);
|
||||
$this->assertEquals( $number_of_queries + 1, $wpdb->num_queries );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 45749
|
||||
*/
|
||||
public function test_networks_pre_query_filter_should_bypass_database_query() {
|
||||
global $wpdb;
|
||||
|
||||
add_filter( 'networks_pre_query', array( __CLASS__, 'filter_networks_pre_query' ), 10, 2 );
|
||||
|
||||
$num_queries = $wpdb->num_queries;
|
||||
|
||||
$q = new WP_Network_Query();
|
||||
$results = $q->query(
|
||||
array(
|
||||
'fields' => 'ids',
|
||||
)
|
||||
);
|
||||
|
||||
remove_filter( 'networks_pre_query', array( __CLASS__, 'filter_networks_pre_query' ), 10, 2 );
|
||||
|
||||
// Make sure no queries were executed.
|
||||
$this->assertSame( $num_queries, $wpdb->num_queries );
|
||||
|
||||
// We manually inserted a non-existing site and overrode the results with it.
|
||||
$this->assertSame( array( 555 ), $q->networks );
|
||||
|
||||
// Make sure manually setting total_users doesn't get overwritten.
|
||||
$this->assertEquals( 1, $q->found_networks );
|
||||
}
|
||||
|
||||
public static function filter_networks_pre_query( $networks, $query ) {
|
||||
$query->found_networks = 1;
|
||||
|
||||
return array( 555 );
|
||||
}
|
||||
}
|
||||
|
||||
endif;
|
||||
|
@ -911,6 +911,42 @@ if ( is_multisite() ) :
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @ticket 45749
|
||||
*/
|
||||
public function test_sites_pre_query_filter_should_bypass_database_query() {
|
||||
global $wpdb;
|
||||
|
||||
add_filter( 'sites_pre_query', array( __CLASS__, 'filter_sites_pre_query' ), 10, 2 );
|
||||
|
||||
$num_queries = $wpdb->num_queries;
|
||||
|
||||
$q = new WP_Site_Query();
|
||||
$results = $q->query(
|
||||
array(
|
||||
'fields' => 'ids',
|
||||
)
|
||||
);
|
||||
|
||||
remove_filter( 'sites_pre_query', array( __CLASS__, 'filter_sites_pre_query' ), 10, 2 );
|
||||
|
||||
// Make sure no queries were executed.
|
||||
$this->assertSame( $num_queries, $wpdb->num_queries );
|
||||
|
||||
// We manually inserted a non-existing site and overrode the results with it.
|
||||
$this->assertSame( array( 555 ), $q->sites );
|
||||
|
||||
// Make sure manually setting total_users doesn't get overwritten.
|
||||
$this->assertEquals( 1, $q->found_sites );
|
||||
}
|
||||
|
||||
public static function filter_sites_pre_query( $sites, $query ) {
|
||||
$query->found_sites = 1;
|
||||
|
||||
return array( 555 );
|
||||
}
|
||||
|
||||
public function data_wp_site_query_meta_query() {
|
||||
return array(
|
||||
array(
|
||||
|
Loading…
Reference in New Issue
Block a user