WordPress.org

Make WordPress Core

Ticket #45749: 45749.5.diff

File 45749.5.diff, 5.6 KB (added by spacedmonkey, 19 months ago)
  • src/wp-includes/class-wp-site-query.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    8787         */
    8888        public $sites;
    8989
     90        /**
     91         * List of site ids in the query.
     92         *
     93         * @since 5.2.0
     94         * @var array|null
     95         */
     96        public $site_ids = null;
     97
    9098        /**
    9199         * The amount of found sites for the current query.
    92100         *
     
    288296                        $this->meta_query_clauses = $this->meta_query->get_sql( 'blog', $wpdb->blogs, 'blog_id', $this );
    289297                }
    290298
    291                 // $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
    292                 $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
     299                /**
     300                 * Filter the sites array before the query takes place.
     301                 *
     302                 * Return a non-null value to bypass WordPress's default site queries.
     303                 *
     304                 *
     305                 * @since 5.2.0
     306                 *
     307                 * @param array|null    $site_ids Return an array of site data to short-circuit WP's site query,
     308                 *                                or null to allow WP to run its normal queries.
     309                 * @param WP_Site_Query $this The WP_Site_Query instance, passed by reference.
     310                 */
     311                $this->site_ids = apply_filters_ref_array( 'sites_pre_query', array( $this->site_ids, &$this ) );
     312
     313                if ( null === $this->site_ids ) {
     314
     315                        // $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
     316                        $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
    293317
    294                 // Ignore the $fields argument as the queried result will be the same regardless.
    295                 unset( $_args['fields'] );
     318                        // Ignore the $fields argument as the queried result will be the same regardless.
     319                        unset( $_args['fields'] );
    296320
    297                 $key          = md5( serialize( $_args ) );
    298                 $last_changed = wp_cache_get_last_changed( 'sites' );
     321                        $key          = md5( serialize( $_args ) );
     322                        $last_changed = wp_cache_get_last_changed( 'sites' );
    299323
    300                 $cache_key   = "get_sites:$key:$last_changed";
    301                 $cache_value = wp_cache_get( $cache_key, 'sites' );
     324                        $cache_key   = "get_sites:$key:$last_changed";
     325                        $cache_value = wp_cache_get( $cache_key, 'sites' );
    302326
    303                 if ( false === $cache_value ) {
    304                         $site_ids = $this->get_site_ids();
    305                         if ( $site_ids ) {
    306                                 $this->set_found_sites();
    307                         }
     327                        if ( false === $cache_value ) {
     328                                $this->site_ids = $this->get_site_ids();
     329                                if ( $this->site_ids ) {
     330                                        $this->set_found_sites();
     331                                }
    308332
    309                         $cache_value = array(
    310                                 'site_ids'    => $site_ids,
    311                                 'found_sites' => $this->found_sites,
    312                         );
    313                         wp_cache_add( $cache_key, $cache_value, 'sites' );
    314                 } else {
    315                         $site_ids          = $cache_value['site_ids'];
    316                         $this->found_sites = $cache_value['found_sites'];
     333                                $cache_value = array(
     334                                        'site_ids'    => $this->site_ids,
     335                                        'found_sites' => $this->found_sites,
     336                                );
     337                                wp_cache_add( $cache_key, $cache_value, 'sites' );
     338                        } else {
     339                                $this->site_ids    = $cache_value['site_ids'];
     340                                $this->found_sites = $cache_value['found_sites'];
     341                        }
    317342                }
    318343
    319344                if ( $this->found_sites && $this->query_vars['number'] ) {
     
    323348                // If querying for a count only, there's nothing more to do.
    324349                if ( $this->query_vars['count'] ) {
    325350                        // $site_ids is actually a count in this case.
    326                         return intval( $site_ids );
     351                        return intval( $this->site_ids );
    327352                }
    328353
    329                 $site_ids = array_map( 'intval', $site_ids );
     354                $this->site_ids = array_map( 'intval', $site_ids );
    330355
    331356                if ( 'ids' == $this->query_vars['fields'] ) {
    332                         $this->sites = $site_ids;
     357                        $this->sites = $this->site_ids;
    333358
    334359                        return $this->sites;
    335360                }
    336361
    337362                // Prime site network caches.
    338363                if ( $this->query_vars['update_site_cache'] ) {
    339                         _prime_site_caches( $site_ids, $this->query_vars['update_site_meta_cache'] );
     364                        _prime_site_caches( $this->site_ids, $this->query_vars['update_site_meta_cache'] );
    340365                }
    341366
    342367                // Fetch full site objects from the primed cache.
    343368                $_sites = array();
    344                 foreach ( $site_ids as $site_id ) {
     369                foreach ( $this->site_ids as $site_id ) {
    345370                        if ( $_site = get_site( $site_id ) ) {
    346371                                $_sites[] = $_site;
    347372                        }
  • tests/phpunit/tests/multisite/siteQuery.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    911911                        }
    912912                }
    913913
     914
     915                /**
     916                 * @ticket 45749
     917                 */
     918                public function test_sites_pre_query_filter_should_bypass_database_query() {
     919                        global $wpdb;
     920
     921                        add_filter( 'sites_pre_query', array( __CLASS__, 'filter_sites_pre_query' ), 10, 2 );
     922
     923                        $num_queries = $wpdb->num_queries;
     924
     925                        $q       = new WP_Site_Query();
     926                        $results = $q->query(
     927                                array(
     928                                        'fields' => 'ids',
     929                                )
     930                        );
     931
     932                        remove_filter( 'sites_pre_query', array( __CLASS__, 'filter_sites_pre_query' ), 10, 2 );
     933
     934                        // Make sure no queries were executed.
     935                        $this->assertSame( $num_queries, $wpdb->num_queries );
     936
     937                        // We manually inserted a non-existing site and overrode the results with it.
     938                        $this->assertSame( array( 555 ), $q->sites );
     939
     940                        // Make sure manually setting total_users doesn't get overwritten.
     941                        $this->assertEquals( 1, $q->found_sites );
     942                }
     943
     944                public static function filter_sites_pre_query( $sites, $query ) {
     945                        $query->found_sites = 1;
     946
     947                        return array( 555 );
     948                }
     949
    914950                public function data_wp_site_query_meta_query() {
    915951                        return array(
    916952                                array(