diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/class-wp-site-query.php --- a/wp/wp-includes/class-wp-site-query.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/class-wp-site-query.php Tue Dec 15 13:49:49 2020 +0100 @@ -59,7 +59,7 @@ * Date query container. * * @since 4.6.0 - * @var object WP_Date_Query + * @var WP_Date_Query A date query instance. */ public $date_query = false; @@ -198,7 +198,7 @@ 'search' => '', 'search_columns' => array(), 'count' => false, - 'date_query' => null, // See WP_Date_Query + 'date_query' => null, // See WP_Date_Query. 'update_site_cache' => true, 'update_site_meta_cache' => true, 'meta_query' => '', @@ -245,7 +245,7 @@ * @since 4.6.0 * * @param string|array $query Array or URL query string of parameters. - * @return array|int List of WP_Site objects, a list of site ids when 'fields' is set to 'ids', + * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids', * or the number of sites when 'count' is passed as a query var. */ public function query( $query ) { @@ -261,7 +261,7 @@ * * @global wpdb $wpdb WordPress database abstraction object. * - * @return array|int List of WP_Site objects, a list of site ids when 'fields' is set to 'ids', + * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids', * or the number of sites when 'count' is passed as a query var. */ public function get_sites() { @@ -288,51 +288,57 @@ $this->meta_query_clauses = $this->meta_query->get_sql( 'blog', $wpdb->blogs, 'blog_id', $this ); } - $site_ids = null; + $site_data = null; /** - * Filter the sites array before the query takes place. + * Filter the site data before the get_sites query takes place. * * Return a non-null value to bypass WordPress's default site queries. * + * The expected return type from this filter depends on the value passed in the request query_vars: + * When `$this->query_vars['count']` is set, the filter should return the site count as an int. + * When `'ids' === $this->query_vars['fields']`, the filter should return an array of site IDs. + * Otherwise the filter should return an array of WP_Site objects. * * @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. + * @param array|int|null $site_data Return an array of site data to short-circuit WP's site query, + * the site count as an integer if `$this->query_vars['count']` is set, + * or null to run the 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 ) { + $site_data = apply_filters_ref_array( 'sites_pre_query', array( $site_data, &$this ) ); - // $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 ) ); + if ( null !== $site_data ) { + return $site_data; + } - // Ignore the $fields argument as the queried result will be the same regardless. - unset( $_args['fields'] ); + // $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 ) ); - $key = md5( serialize( $_args ) ); - $last_changed = wp_cache_get_last_changed( 'sites' ); + // Ignore the $fields argument as the queried result will be the same regardless. + unset( $_args['fields'] ); - $cache_key = "get_sites:$key:$last_changed"; - $cache_value = wp_cache_get( $cache_key, 'sites' ); + $key = md5( serialize( $_args ) ); + $last_changed = wp_cache_get_last_changed( 'sites' ); - if ( false === $cache_value ) { - $site_ids = $this->get_site_ids(); - if ( $site_ids ) { - $this->set_found_sites(); - } + $cache_key = "get_sites:$key:$last_changed"; + $cache_value = wp_cache_get( $cache_key, 'sites' ); - $cache_value = array( - 'site_ids' => $site_ids, - 'found_sites' => $this->found_sites, - ); - wp_cache_add( $cache_key, $cache_value, 'sites' ); - } else { - $site_ids = $cache_value['site_ids']; - $this->found_sites = $cache_value['found_sites']; + if ( false === $cache_value ) { + $site_ids = $this->get_site_ids(); + if ( $site_ids ) { + $this->set_found_sites(); } + + $cache_value = array( + 'site_ids' => $site_ids, + 'found_sites' => $this->found_sites, + ); + wp_cache_add( $cache_key, $cache_value, 'sites' ); + } else { + $site_ids = $cache_value['site_ids']; + $this->found_sites = $cache_value['found_sites']; } if ( $this->found_sites && $this->query_vars['number'] ) { @@ -347,7 +353,7 @@ $site_ids = array_map( 'intval', $site_ids ); - if ( 'ids' == $this->query_vars['fields'] ) { + if ( 'ids' === $this->query_vars['fields'] ) { $this->sites = $site_ids; return $this->sites; @@ -361,7 +367,8 @@ // Fetch full site objects from the primed cache. $_sites = array(); foreach ( $site_ids as $site_id ) { - if ( $_site = get_site( $site_id ) ) { + $_site = get_site( $site_id ); + if ( $_site ) { $_sites[] = $_site; } } @@ -689,7 +696,7 @@ * * @since 4.6.0 * - * @global wpdb $wpdb WordPress database abstraction object. + * @global wpdb $wpdb WordPress database abstraction object. * * @param string $string Search string. * @param string[] $columns Array of columns to search.