Make WordPress Core

Ticket #40180: 40180.3.diff

File 40180.3.diff, 8.6 KB (added by flixos90, 7 years ago)
  • src/wp-includes/ms-blogs.php

     
    538538}
    539539
    540540/**
     541 * Retrieves a site by given site data.
     542 *
     543 * @since 4.9.0
     544 *
     545 * @param string     $field      Name of a field to query against. Either 'id', 'slug' or 'url', or
     546 *                               'domain' (only if a subdomain install) or 'path' (only if a subdirectory
     547 *                               install).
     548 * @param string|int $value      The search value for $field.
     549 * @param int|null   $network_id Optional. ID of the network. Default is the current network.
     550 * @return WP_Site|null The site object or null if not found.
     551 */
     552function get_site_by( $field, $value, $network_id = null ) {
     553        $args = array();
     554
     555        switch ( $field ) {
     556                case 'id':
     557                        return get_site( $value );
     558                case 'slug':
     559                        $network = get_network( $network_id );
     560                        if ( ! $network ) {
     561                                return null;
     562                        }
     563
     564                        if ( is_subdomain_install() ) {
     565                                $args['domain'] = trim( $value, '/' ) . '.' . preg_replace( '|^www\.|', '', $network->domain );
     566                                $args['path'] = $network->path;
     567                        } else {
     568                                $args['domain'] = $network->domain;
     569                                $args['path'] = $network->path . trim( $value, '/' ) . '/';
     570                        }
     571                        break;
     572                case 'url':
     573                        $parts = wp_parse_url( $value );
     574                        if ( ! $parts ) {
     575                                return null;
     576                        }
     577
     578                        $args['domain'] = $parts['host'];
     579                        if ( ! empty( $parts['path'] ) ) {
     580                                $args['path'] = '/' . trim( $parts['path'], '/' ) . '/';
     581                        } else {
     582                                $args['path'] = '/';
     583                        }
     584                        break;
     585                case 'domain':
     586                        if ( ! is_subdomain_install() ) {
     587                                return null;
     588                        }
     589
     590                        $args['domain'] = $value;
     591                        break;
     592                case 'path':
     593                        if ( is_subdomain_install() ) {
     594                                return null;
     595                        }
     596
     597                        $args['path'] = '/' . trim( $value, '/' ) . '/';
     598                        break;
     599                default:
     600                        return null;
     601        }
     602
     603        $args['number'] = 1;
     604
     605        if ( isset( $args['domain'] ) && substr( $args['domain'], 0, 4 ) === 'www.' ) {
     606                $nowww = substr( $args['domain'], 4 );
     607
     608                $args['domain__in'] = array( $nowww, $args['domain'] );
     609                unset( $args['domain'] );
     610        }
     611
     612        if ( ! empty( $network_id ) ) {
     613                $args['network_id'] = (int) $network_id;
     614        }
     615
     616        $sites = get_sites( $args );
     617
     618        if ( empty( $sites ) ) {
     619                return null;
     620        }
     621
     622        return array_shift( $sites );
     623}
     624
     625/**
    541626 * Adds any sites from the given ids to the cache that do not already exist in cache.
    542627 *
    543628 * @since 4.6.0
  • tests/phpunit/tests/multisite/getSiteBy.php

     
     1<?php
     2
     3if ( is_multisite() ) :
     4/**
     5 * Test get_site_by() in multisite.
     6 *
     7 * @ticket 40180
     8 * @group ms-site
     9 * @group multisite
     10 */
     11class Tests_Multisite_Get_Site_By extends WP_UnitTestCase {
     12        protected static $network_ids;
     13        protected static $site_ids;
     14
     15        public static function wpSetUpBeforeClass( $factory ) {
     16                self::$network_ids = array(
     17                        'wordpress.org/'         => array( 'domain' => 'wordpress.org',     'path' => '/' ),
     18                        'www.wordpress.net/'     => array( 'domain' => 'www.wordpress.net', 'path' => '/' ),
     19                );
     20
     21                foreach ( self::$network_ids as &$id ) {
     22                        $id = $factory->network->create( $id );
     23                }
     24                unset( $id );
     25
     26                self::$site_ids = array(
     27                        'wordpress.org/'              => array( 'domain' => 'wordpress.org',     'path' => '/',     'site_id' => self::$network_ids['wordpress.org/'] ),
     28                        'foo.wordpress.org/'          => array( 'domain' => 'foo.wordpress.org', 'path' => '/',     'site_id' => self::$network_ids['wordpress.org/'] ),
     29                        'wordpress.org/foo/'          => array( 'domain' => 'wordpress.org',     'path' => '/foo/', 'site_id' => self::$network_ids['wordpress.org/'] ),
     30                        'www.wordpress.net/'          => array( 'domain' => 'www.wordpress.net', 'path' => '/',     'site_id' => self::$network_ids['www.wordpress.net/'] ),
     31                        'foo.wordpress.net/'          => array( 'domain' => 'foo.wordpress.net', 'path' => '/',     'site_id' => self::$network_ids['www.wordpress.net/'] ),
     32                        'www.wordpress.net/foo/'      => array( 'domain' => 'www.wordpress.net', 'path' => '/foo/', 'site_id' => self::$network_ids['www.wordpress.net/'] ),
     33                );
     34
     35                foreach ( self::$site_ids as &$id ) {
     36                        $id = $factory->blog->create( $id );
     37                }
     38                unset( $id );
     39        }
     40
     41        public static function wpTearDownAfterClass() {
     42                global $wpdb;
     43
     44                foreach( self::$site_ids as $id ) {
     45                        wpmu_delete_blog( $id, true );
     46                }
     47
     48                foreach( self::$network_ids as $id ) {
     49                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", $id ) );
     50                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", $id ) );
     51                }
     52
     53                wp_update_network_site_counts();
     54        }
     55
     56        public function test_get_site_by_id() {
     57                $result = get_site_by( 'id', self::$site_ids['wordpress.org/'] );
     58                $this->assertEquals( self::$site_ids['wordpress.org/'], $result->id );
     59        }
     60
     61        public function test_get_site_by_current_id() {
     62                $result = get_site_by( 'id', null );
     63                $this->assertEquals( get_current_blog_id(), $result->id );
     64        }
     65
     66        public function test_get_site_by_slug_subdomain() {
     67                if ( ! is_subdomain_install() ) {
     68                        $this->markTestSkipped( 'This test is only valid in a subdomain configuration.' );
     69                }
     70
     71                $result = get_site_by( 'slug', 'foo', self::$network_ids['wordpress.org/'] );
     72                $this->assertEquals( self::$site_ids['foo.wordpress.org/'], $result->id );
     73        }
     74
     75        public function test_get_site_by_slug_with_www_subdomain() {
     76                if ( ! is_subdomain_install() ) {
     77                        $this->markTestSkipped( 'This test is only valid in a subdomain configuration.' );
     78                }
     79
     80                $result = get_site_by( 'slug', 'foo', self::$network_ids['www.wordpress.net/'] );
     81                $this->assertEquals( self::$site_ids['foo.wordpress.net/'], $result->id );
     82        }
     83
     84        public function test_get_site_by_slug_subdirectory() {
     85                if ( is_subdomain_install() ) {
     86                        $this->markTestSkipped( 'This test is only valid in a subdirectory configuration.' );
     87                }
     88
     89                $result = get_site_by( 'slug', 'foo', self::$network_ids['wordpress.org/'] );
     90                $this->assertEquals( self::$site_ids['wordpress.org/foo/'], $result->id );
     91        }
     92
     93        public function test_get_site_by_slug_with_www_subdirectory() {
     94                if ( is_subdomain_install() ) {
     95                        $this->markTestSkipped( 'This test is only valid in a subdirectory configuration.' );
     96                }
     97
     98                $result = get_site_by( 'slug', 'foo', self::$network_ids['www.wordpress.net/'] );
     99                $this->assertEquals( self::$site_ids['www.wordpress.net/foo/'], $result->id );
     100        }
     101
     102        public function get_site_by_slug_with_invalid_network() {
     103                $result = get_site_by( 'slug', 'foo', 444 );
     104                $this->assertNull( $result );
     105        }
     106
     107        public function get_site_by_url( $url, $expected ) {
     108                $result = get_site_by( 'url', $url );
     109                $this->assertEquals( $expected, $result->id );
     110        }
     111
     112        public function data_get_site_by_url() {
     113                return array(
     114                        array(
     115                                'wordpress.org/foo/',
     116                                self::$site_ids['wordpress.org/foo/'],
     117                        ),
     118                        array(
     119                                'wordpress.org/foo',
     120                                self::$site_ids['wordpress.org/foo/'],
     121                        ),
     122                        array(
     123                                'foo.wordpress.org/',
     124                                self::$site_ids['foo.wordpress.org/'],
     125                        ),
     126                        array(
     127                                'foo.wordpress.org',
     128                                self::$site_ids['foo.wordpress.org/'],
     129                        ),
     130                        array(
     131                                'www.wordpress.net/',
     132                                self::$site_ids['www.wordpress.net/'],
     133                        ),
     134                );
     135        }
     136
     137        public function get_site_by_url_with_invalid_url() {
     138                $result = get_site_by( 'url', 'not a url' );
     139                $this->assertNull( $result );
     140        }
     141
     142        public function test_get_site_by_domain_subdomain() {
     143                if ( ! is_subdomain_install() ) {
     144                        $this->markTestSkipped( 'This test is only valid in a subdomain configuration.' );
     145                }
     146
     147                $result = get_site_by( 'domain', 'foo.wordpress.org' );
     148                $this->assertEquals( self::$site_ids['foo.wordpress.org/'], $result->id );
     149        }
     150
     151        public function test_get_site_by_domain_subdirectory() {
     152                if ( is_subdomain_install() ) {
     153                        $this->markTestSkipped( 'This test is only valid in a subdirectory configuration.' );
     154                }
     155
     156                $result = get_site_by( 'domain', 'foo.wordpress.org' );
     157                $this->assertNull( $result );
     158        }
     159
     160        public function test_get_site_by_path_subdomain() {
     161                if ( ! is_subdomain_install() ) {
     162                        $this->markTestSkipped( 'This test is only valid in a subdomain configuration.' );
     163                }
     164
     165                $result = get_site_by( 'path', '/foo/' );
     166                $this->assertNull( $result );
     167        }
     168
     169        public function test_get_site_by_path_subdirectory() {
     170                if ( is_subdomain_install() ) {
     171                        $this->markTestSkipped( 'This test is only valid in a subdirectory configuration.' );
     172                }
     173
     174                $result = get_site_by( 'path', '/foo/' );
     175                $this->assertEquals( self::$site_ids['wordpress.org/foo/'], $result->id );
     176        }
     177}
     178
     179endif;