Make WordPress Core

Ticket #29684: 29684.9.diff

File 29684.9.diff, 14.1 KB (added by spacedmonkey, 7 years ago)
  • src/wp-includes/class-wp-network.php

     
    148148                        case 'id':
    149149                                return (int) $this->id;
    150150                        case 'blog_id':
    151                                 return $this->blog_id;
     151                                return $this->get_main_site_id();
    152152                        case 'site_id':
    153                                 return (int) $this->blog_id;
     153                                return (int) $this->get_main_site_id();
    154154                }
    155155
    156156                return null;
     
    202202        }
    203203
    204204        /**
     205         * Returns the main site ID for the network.
     206         *
     207         * Internal method used by the magic getter for the 'blog_id' and
     208         * 'site_id' properties.
     209         *
     210         * @since 4.9.0
     211         *
     212         * @return string|int Main site ID as numeric string or integer.
     213         */
     214        private function get_main_site_id() {
     215                if ( empty( $this->blog_id ) ) {
     216                        $this->blog_id = get_main_site_id( $this->id );
     217                }
     218
     219                return $this->blog_id;
     220        }
     221
     222        /**
    205223         * Set the site name assigned to the network if one has not been populated.
    206224         *
    207225         * @since 4.4.0
  • src/wp-includes/functions.php

     
    43924392 * Determine whether a site is the main site of the current network.
    43934393 *
    43944394 * @since 3.0.0
     4395 * @since 4.9.0 The $network_id parameter has been added.
    43954396 *
    4396  * @param int $site_id Optional. Site ID to test. Defaults to current site.
     4397 * @param int $site_id    Optional. Site ID to test. Defaults to current site.
     4398 * @param int $network_id Optional. Network ID of the network to check for.
     4399 *                        Defaults to current network.
    43974400 * @return bool True if $site_id is the main site of the network, or if not
    43984401 *              running Multisite.
    43994402 */
    4400 function is_main_site( $site_id = null ) {
    4401         if ( ! is_multisite() )
     4403function is_main_site( $site_id = null, $network_id = null ) {
     4404        if ( ! is_multisite() ) {
    44024405                return true;
     4406        }
    44034407
    4404         if ( ! $site_id )
     4408        if ( ! $site_id ) {
    44054409                $site_id = get_current_blog_id();
     4410        }
    44064411
    4407         return (int) $site_id === (int) get_network()->site_id;
     4412        $site_id = (int) $site_id;
     4413
     4414        return $site_id === get_main_site_id( $network_id );
     4415}
     4416
     4417/**
     4418 * Gets the main site ID.
     4419 *
     4420 * @since 4.9.0
     4421 *
     4422 * @param int $network_id Optional. The ID of the network for which to get the main site.
     4423 *                        Defaults to the current network.
     4424 * @return int The ID of the main site.
     4425 */
     4426function get_main_site_id( $network_id = null ) {
     4427        if ( ! is_multisite() ) {
     4428                return 1;
     4429        }
     4430
     4431        $main_site_id = apply_filters( 'get_main_site_id', null, $network_id );
     4432        if ( null !== $main_site_id ) {
     4433                return (int) $main_site_id;
     4434        }
     4435
     4436        $network = get_network( $network_id );
     4437        if ( ! $network ) {
     4438                return 0;
     4439        }
     4440
     4441        if ( !empty( $network->blog_id ) ) {
     4442                return $network->blog_id;
     4443        }
     4444
     4445        if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && $network->domain === DOMAIN_CURRENT_SITE && $network->path === PATH_CURRENT_SITE )
     4446             || ( defined( 'SITE_ID_CURRENT_SITE' ) && $network->id == SITE_ID_CURRENT_SITE ) ) {
     4447                if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
     4448                        return BLOG_ID_CURRENT_SITE;
     4449                } elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated.
     4450                        return BLOGID_CURRENT_SITE;
     4451                }
     4452        }
     4453
     4454        $site = get_site();
     4455        if ( $site->domain === $network->domain && $site->path === $network->path ) {
     4456                $main_site_id = (int) $site->id;
     4457        } else {
     4458                $main_site_id = wp_cache_get( 'network:' . $network->id . ':main_site', 'site-options' );
     4459                if ( false === $main_site_id ) {
     4460                        $_sites       = get_sites( array(
     4461                                'fields'     => 'ids',
     4462                                'number'     => 1,
     4463                                'domain'     => $network->domain,
     4464                                'path'       => $network->path,
     4465                                'network_id' => $network->id,
     4466                        ) );
     4467                        $main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0;
     4468
     4469                        wp_cache_add( 'network:' . $network->id . ':main_site', $main_site_id, 'site-options' );
     4470                }
     4471        }
     4472
     4473        $main_site_id = (int) $main_site_id;
     4474
     4475        /**
     4476         * Filters the main site ID.
     4477         *
     4478         * @since 4.9.0
     4479         *
     4480         * @param int $main_site_id The ID of the main site.
     4481         * @param int $network_id The ID of the network for which the main site was detected.
     4482         */
     4483        return $main_site_id;
    44084484}
    44094485
    44104486/**
  • src/wp-includes/ms-load.php

     
    135135
    136136/**
    137137 * Retrieves the closest matching site object by its domain and path.
    138  * 
     138 *
    139139 * This will not necessarily return an exact match for a domain and path. Instead, it
    140140 * breaks the domain and path into pieces that are then used to match the closest
    141141 * possibility from a query.
     
    424424
    425425        // Figure out the current network's main site.
    426426        if ( empty( $current_site->blog_id ) ) {
    427                 if ( $current_blog->domain === $current_site->domain && $current_blog->path === $current_site->path ) {
    428                         $current_site->blog_id = $current_blog->blog_id;
    429                 } elseif ( ! $current_site->blog_id = wp_cache_get( 'network:' . $current_site->id . ':main_site', 'site-options' ) ) {
    430                         $current_site->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s",
    431                                 $current_site->domain, $current_site->path ) );
    432                         wp_cache_add( 'network:' . $current_site->id . ':main_site', $current_site->blog_id, 'site-options' );
    433                 }
     427                $current_site->blog_id = get_main_site_id( $current_site->id );
    434428        }
    435429
    436430        return true;
  • tests/phpunit/tests/multisite/getMainSiteId.php

     
     1<?php
     2
     3class Tests_Multisite_Get_Main_Site_ID extends WP_UnitTestCase {
     4        protected static $network_ids;
     5        protected static $site_ids;
     6
     7        public static function wpSetUpBeforeClass( $factory ) {
     8                self::$network_ids = array(
     9                        'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ),
     10                        'wp.org/'        => array( 'domain' => 'wp.org',        'path' => '/' ), // A network with no sites.
     11                );
     12
     13                foreach ( self::$network_ids as &$id ) {
     14                        $id = $factory->network->create( $id );
     15                }
     16                unset( $id );
     17
     18                self::$site_ids = array(
     19                        'www.w.org/'                   => array( 'domain' => 'www.w.org',     'path' => '/' ),
     20                        'wordpress.org/'               => array( 'domain' => 'wordpress.org', 'path' => '/',     'site_id' => self::$network_ids['wordpress.org/'] ),
     21                        'wordpress.org/foo/'           => array( 'domain' => 'wordpress.org', 'path' => '/foo/', 'site_id' => self::$network_ids['wordpress.org/'] ),
     22                );
     23
     24                foreach ( self::$site_ids as &$id ) {
     25                        $id = $factory->blog->create( $id );
     26                }
     27                unset( $id );
     28        }
     29
     30        public static function wpTearDownAfterClass() {
     31                foreach( self::$site_ids as $id ) {
     32                        wpmu_delete_blog( $id, true );
     33                }
     34
     35                global $wpdb;
     36
     37                foreach( self::$network_ids as $id ) {
     38                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", $id ) );
     39                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", $id ) );
     40                }
     41
     42                wp_update_network_site_counts();
     43        }
     44
     45        /**
     46         * @ticket 29684
     47         */
     48        public function test_get_main_site_id_on_main_site_returns_self() {
     49                $this->assertSame( get_current_blog_id(), get_main_site_id() );
     50        }
     51
     52        /**
     53         * @ticket 29684
     54         */
     55        public function test_get_main_site_id_returns_main_site_in_switched_context_same_network() {
     56                $main_site_id = get_current_blog_id();
     57                $other_site_id = self::$site_ids['www.w.org/'];
     58
     59                switch_to_blog( $other_site_id );
     60                $result = get_main_site_id();
     61                restore_current_blog();
     62
     63                $this->assertSame( $main_site_id, $result );
     64        }
     65
     66        /**
     67         * @ticket 29684
     68         */
     69        public function test_get_main_site_id_returns_main_site_from_different_network_without_network_id_while_switched() {
     70                switch_to_blog( self::$site_ids['wordpress.org/foo/'] );
     71                $result = get_main_site_id();
     72                restore_current_blog();
     73
     74                $this->assertSame( self::$site_ids['wordpress.org/'], $result );
     75        }
     76
     77        /**
     78         * @ticket 29684
     79         */
     80        public function test_get_main_site_id_returns_main_site_from_different_network_with_network_id_while_switched() {
     81                switch_to_blog( self::$site_ids['wordpress.org/foo/'] );
     82                $result = get_main_site_id( self::$network_ids['wordpress.org/'] );
     83                restore_current_blog();
     84
     85                $this->assertSame( self::$site_ids['wordpress.org/'], $result );
     86        }
     87
     88        /**
     89         * @ticket 29684
     90         */
     91        public function test_get_main_site_id_with_different_network_returns_correct_id() {
     92                $this->assertSame( self::$site_ids['wordpress.org/'], get_main_site_id( self::$network_ids['wordpress.org/'] ) );
     93        }
     94
     95        /**
     96         * @ticket 29684
     97         */
     98        public function test_get_main_site_id_on_network_without_site_returns_0() {
     99                $this->assertSame( 0, get_main_site_id( self::$network_ids['wp.org/'] ) );
     100        }
     101
     102        /**
     103         * @ticket 29684
     104         */
     105        public function test_get_main_site_id_on_invalid_network_returns_0() {
     106                $this->assertSame( 0, get_main_site_id( 333 ) );
     107        }
     108
     109        /**
     110         * @ticket 29684
     111         */
     112        public function test_get_main_site_id_filtered() {
     113                add_filter( 'get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
     114                $result = get_main_site_id();
     115                remove_filter( 'get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
     116
     117                $this->assertSame( 333, $result );
     118        }
     119
     120        public function filter_get_main_site_id( $main_site_id ) {
     121                return 333;
     122        }
     123}
     124<?php
     125
     126class Tests_Multisite_Get_Main_Site_ID extends WP_UnitTestCase {
     127        protected static $network_ids;
     128        protected static $site_ids;
     129
     130        public static function wpSetUpBeforeClass( $factory ) {
     131                self::$network_ids = array(
     132                        'wordpress.org/' => array( 'domain' => 'wordpress.org', 'path' => '/' ),
     133                        'wp.org/'        => array( 'domain' => 'wp.org',        'path' => '/' ), // A network with no sites.
     134                );
     135
     136                foreach ( self::$network_ids as &$id ) {
     137                        $id = $factory->network->create( $id );
     138                }
     139                unset( $id );
     140
     141                self::$site_ids = array(
     142                        'www.w.org/'                   => array( 'domain' => 'www.w.org',     'path' => '/' ),
     143                        'wordpress.org/'               => array( 'domain' => 'wordpress.org', 'path' => '/',     'site_id' => self::$network_ids['wordpress.org/'] ),
     144                        'wordpress.org/foo/'           => array( 'domain' => 'wordpress.org', 'path' => '/foo/', 'site_id' => self::$network_ids['wordpress.org/'] ),
     145                );
     146
     147                foreach ( self::$site_ids as &$id ) {
     148                        $id = $factory->blog->create( $id );
     149                }
     150                unset( $id );
     151        }
     152
     153        public static function wpTearDownAfterClass() {
     154                foreach( self::$site_ids as $id ) {
     155                        wpmu_delete_blog( $id, true );
     156                }
     157
     158                global $wpdb;
     159
     160                foreach( self::$network_ids as $id ) {
     161                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", $id ) );
     162                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", $id ) );
     163                }
     164
     165                wp_update_network_site_counts();
     166        }
     167
     168        /**
     169         * @ticket 29684
     170         */
     171        public function test_get_main_site_id_on_main_site_returns_self() {
     172                $this->assertSame( get_current_blog_id(), get_main_site_id() );
     173        }
     174
     175        /**
     176         * @ticket 29684
     177         */
     178        public function test_get_main_site_id_returns_main_site_in_switched_context_same_network() {
     179                $main_site_id = get_current_blog_id();
     180                $other_site_id = self::$site_ids['www.w.org/'];
     181
     182                switch_to_blog( $other_site_id );
     183                $result = get_main_site_id();
     184                restore_current_blog();
     185
     186                $this->assertSame( $main_site_id, $result );
     187        }
     188
     189        /**
     190         * @ticket 29684
     191         */
     192        public function test_get_main_site_id_returns_main_site_from_different_network_without_network_id_while_switched() {
     193                switch_to_blog( self::$site_ids['wordpress.org/foo/'] );
     194                $result = get_main_site_id();
     195                restore_current_blog();
     196
     197                $this->assertSame( self::$site_ids['wordpress.org/'], $result );
     198        }
     199
     200        /**
     201         * @ticket 29684
     202         */
     203        public function test_get_main_site_id_returns_main_site_from_different_network_with_network_id_while_switched() {
     204                switch_to_blog( self::$site_ids['wordpress.org/foo/'] );
     205                $result = get_main_site_id( self::$network_ids['wordpress.org/'] );
     206                restore_current_blog();
     207
     208                $this->assertSame( self::$site_ids['wordpress.org/'], $result );
     209        }
     210
     211        /**
     212         * @ticket 29684
     213         */
     214        public function test_get_main_site_id_with_different_network_returns_correct_id() {
     215                $this->assertSame( self::$site_ids['wordpress.org/'], get_main_site_id( self::$network_ids['wordpress.org/'] ) );
     216        }
     217
     218        /**
     219         * @ticket 29684
     220         */
     221        public function test_get_main_site_id_on_network_without_site_returns_0() {
     222                $this->assertSame( 0, get_main_site_id( self::$network_ids['wp.org/'] ) );
     223        }
     224
     225        /**
     226         * @ticket 29684
     227         */
     228        public function test_get_main_site_id_on_invalid_network_returns_0() {
     229                $this->assertSame( 0, get_main_site_id( 333 ) );
     230        }
     231
     232        /**
     233         * @ticket 29684
     234         */
     235        public function test_get_main_site_id_filtered() {
     236                add_filter( 'get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
     237                $result = get_main_site_id();
     238                remove_filter( 'get_main_site_id', array( $this, 'filter_get_main_site_id' ) );
     239
     240                $this->assertSame( 333, $result );
     241        }
     242
     243        public function filter_get_main_site_id( $main_site_id ) {
     244                return 333;
     245        }
     246}
  • tests/phpunit/tests/multisite/site.php

    Property changes on: tests/phpunit/tests/multisite/getMainSiteId.php
    ___________________________________________________________________
    Added: svn:executable
    ## -0,0 +1 ##
    +*
    \ No newline at end of property
     
    741741                restore_current_blog();
    742742        }
    743743
     744        /**
     745         * @ticket 29684
     746         */
     747        function test_is_main_site_different_network() {
     748                $args = array(
     749                        'domain' => 'wordpress.org',
     750                        'path'   => '/',
     751                );
     752
     753                $network_id = self::factory()->network->create( $args );
     754
     755                $args['site_id'] = $network_id;
     756
     757                $site_id = self::factory()->blog->create( $args );
     758                $other_site_id = self::factory()->blog->create( array_merge( $args, array(
     759                        'path' => '/foo/',
     760                ) ) );
     761
     762                $this->assertTrue( is_main_site( $site_id, $network_id ) );
     763        }
     764
    744765        function test_switch_upload_dir() {
    745766                $this->assertTrue( is_main_site() );
    746767