Ticket #29684: 29684.11.diff
File 29684.11.diff, 6.5 KB (added by , 7 years ago) |
---|
-
src/wp-includes/class-wp-network.php
148 148 case 'id': 149 149 return (int) $this->id; 150 150 case 'blog_id': 151 return $this-> blog_id;151 return $this->get_main_site_id(); 152 152 case 'site_id': 153 return (int) $this-> blog_id;153 return (int) $this->get_main_site_id(); 154 154 } 155 155 156 156 return null; … … 202 202 } 203 203 204 204 /** 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 /** 205 223 * Set the site name assigned to the network if one has not been populated. 206 224 * 207 225 * @since 4.4.0 -
src/wp-includes/functions.php
4392 4392 * Determine whether a site is the main site of the current network. 4393 4393 * 4394 4394 * @since 3.0.0 4395 * @since 4.9.0 The $network_id parameter has been added. 4395 4396 * 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. 4397 4400 * @return bool True if $site_id is the main site of the network, or if not 4398 4401 * running Multisite. 4399 4402 */ 4400 function is_main_site( $site_id = null ) {4401 if ( ! is_multisite() ) 4403 function is_main_site( $site_id = null, $network_id = null ) { 4404 if ( ! is_multisite() ) { 4402 4405 return true; 4406 } 4403 4407 4404 if ( ! $site_id ) 4408 if ( ! $site_id ) { 4405 4409 $site_id = get_current_blog_id(); 4410 } 4406 4411 4407 return (int) $site_id === (int) get_network()->site_id; 4412 $site_id = (int) $site_id; 4413 4414 return (int) $site_id === (int) get_network( $network_id )->site_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 */ 4426 function get_main_site_id( $network_id = null ) { 4427 if ( ! is_multisite() ) { 4428 return 1; 4429 } 4430 4431 /** 4432 * Filters the main site ID. 4433 * 4434 * Returning anything other than null will effectively short-circuit the function, returning 4435 * the result parsed as an integer immediately. 4436 * 4437 * @since 4.9.0 4438 * 4439 * @param int|null $main_site_id If anything other than null is returned, it is interpreted as the main site ID. 4440 * @param int $network_id The ID of the network for which the main site was detected. 4441 */ 4442 $main_site_id = apply_filters( 'pre_get_main_site_id', null, $network_id ); 4443 if ( null !== $main_site_id ) { 4444 return (int) $main_site_id; 4445 } 4446 4447 $network = get_network( $network_id ); 4448 if ( ! $network ) { 4449 return 0; 4450 } 4451 4452 if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && $network->domain === DOMAIN_CURRENT_SITE && $network->path === PATH_CURRENT_SITE ) 4453 || ( defined( 'SITE_ID_CURRENT_SITE' ) && $network->id == SITE_ID_CURRENT_SITE ) ) { 4454 if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) { 4455 return BLOG_ID_CURRENT_SITE; 4456 } elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated. 4457 return BLOGID_CURRENT_SITE; 4458 } 4459 } 4460 4461 $site = get_site(); 4462 if ( $site->domain === $network->domain && $site->path === $network->path ) { 4463 $main_site_id = (int) $site->id; 4464 } else { 4465 $main_site_id = wp_cache_get( 'network:' . $network->id . ':main_site', 'site-options' ); 4466 if ( false === $main_site_id ) { 4467 $_sites = get_sites( array( 4468 'fields' => 'ids', 4469 'number' => 1, 4470 'domain' => $network->domain, 4471 'path' => $network->path, 4472 'network_id' => $network->id, 4473 ) ); 4474 $main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0; 4475 4476 wp_cache_add( 'network:' . $network->id . ':main_site', $main_site_id, 'site-options' ); 4477 } 4478 } 4479 4480 $main_site_id = (int) $main_site_id; 4481 4482 return $main_site_id; 4408 4483 } 4409 4484 4410 4485 /** -
src/wp-includes/ms-load.php
135 135 136 136 /** 137 137 * Retrieves the closest matching site object by its domain and path. 138 * 138 * 139 139 * This will not necessarily return an exact match for a domain and path. Instead, it 140 140 * breaks the domain and path into pieces that are then used to match the closest 141 141 * possibility from a query. … … 424 424 425 425 // Figure out the current network's main site. 426 426 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 ); 434 428 } 435 429 436 430 return true; -
tests/phpunit/tests/multisite/site.php
741 741 restore_current_blog(); 742 742 } 743 743 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 744 765 function test_switch_upload_dir() { 745 766 $this->assertTrue( is_main_site() ); 746 767