WordPress.org

Make WordPress Core

Ticket #34450: 34450.2.diff

File 34450.2.diff, 5.6 KB (added by flixos90, 4 years ago)
  • src/wp-includes/ms-blogs.php

     
    7272}
    7373
    7474/**
    75  * Given a blog's (subdomain or directory) slug, retrieve its id.
     75 * Given a site's (subdomain or directory) slug, retrieve its id.
    7676 *
    7777 * @since MU
    7878 *
    79  * @global wpdb $wpdb WordPress database abstraction object.
     79 * @internal In 4.7.0, converted to use get_sites()
    8080 *
    81  * @param string $slug
    82  * @return int A blog id
     81 * @param string $slug A site's slug.
     82 * @return int|null The site ID, or null if no site found for the given slug.
    8383 */
    8484function get_id_from_blogname( $slug ) {
    85         global $wpdb;
    86 
    8785        $current_site = get_current_site();
    8886        $slug = trim( $slug, '/' );
    8987
    90         $blog_id = wp_cache_get( 'get_id_from_blogname_' . $slug, 'blog-details' );
    91         if ( $blog_id )
    92                 return $blog_id;
    93 
    9488        if ( is_subdomain_install() ) {
    95                 $domain = $slug . '.' . $current_site->domain;
     89                $domain = $slug . '.' . preg_replace( '|^www\.|', '', $current_site->domain );
    9690                $path = $current_site->path;
    9791        } else {
    9892                $domain = $current_site->domain;
    9993                $path = $current_site->path . $slug . '/';
    10094        }
    10195
    102         $blog_id = $wpdb->get_var( $wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s", $domain, $path) );
    103         wp_cache_set( 'get_id_from_blogname_' . $slug, $blog_id, 'blog-details' );
    104         return $blog_id;
     96        $site_ids = get_sites( array(
     97                'number' => 1,
     98                'fields' => 'ids',
     99                'domain' => $domain,
     100                'path'   => $path,
     101        ) );
     102
     103        if ( empty( $site_ids ) ) {
     104                return null;
     105        }
     106
     107        return array_shift( $site_ids );
    105108}
    106109
    107110/**
     
    453456        wp_cache_delete(  $domain_path_key, 'blog-lookup' );
    454457        wp_cache_delete( 'current_blog_' . $blog->domain, 'site-options' );
    455458        wp_cache_delete( 'current_blog_' . $blog->domain . $blog->path, 'site-options' );
    456         wp_cache_delete( 'get_id_from_blogname_' . trim( $blog->path, '/' ), 'blog-details' );
    457459        wp_cache_delete( $domain_path_key, 'blog-id-cache' );
    458460
    459461        /**
  • tests/phpunit/tests/multisite/getIdFromBlogname.php

     
     1<?php
     2
     3if ( is_multisite() ) :
     4/**
     5 * Test get_id_from_blogname() in multisite.
     6 *
     7 * @group ms-site
     8 * @group multisite
     9 */
     10class Tests_Multisite_Get_Id_From_Blogname extends WP_UnitTestCase {
     11        protected static $network_ids;
     12        protected static $site_ids;
     13
     14        public static function wpSetUpBeforeClass( $factory ) {
     15                self::$network_ids = array(
     16                        'wordpress.org/'         => array( 'domain' => 'wordpress.org',     'path' => '/' ),
     17                        'www.wordpress.net/'     => array( 'domain' => 'www.wordpress.net', 'path' => '/' ),
     18                );
     19
     20                foreach ( self::$network_ids as &$id ) {
     21                        $id = $factory->network->create( $id );
     22                }
     23                unset( $id );
     24
     25                self::$site_ids = array(
     26                        'wordpress.org/'              => array( 'domain' => 'wordpress.org',     'path' => '/',     'site_id' => self::$network_ids['wordpress.org/'] ),
     27                        'foo.wordpress.org/'          => array( 'domain' => 'foo.wordpress.org', 'path' => '/',     'site_id' => self::$network_ids['wordpress.org/'] ),
     28                        'wordpress.org/foo/'          => array( 'domain' => 'wordpress.org',     'path' => '/foo/', 'site_id' => self::$network_ids['wordpress.org/'] ),
     29                        'www.wordpress.net/'          => array( 'domain' => 'www.wordpress.net', 'path' => '/',     'site_id' => self::$network_ids['www.wordpress.net/'] ),
     30                        'foo.wordpress.net/'          => array( 'domain' => 'foo.wordpress.net', 'path' => '/',     'site_id' => self::$network_ids['www.wordpress.net/'] ),
     31                        'www.wordpress.net/foo/'      => array( 'domain' => 'www.wordpress.net', 'path' => '/foo/', 'site_id' => self::$network_ids['www.wordpress.net/'] ),
     32                );
     33
     34                foreach ( self::$site_ids as &$id ) {
     35                        $id = $factory->blog->create( $id );
     36                }
     37                unset( $id );
     38        }
     39
     40        public static function wpTearDownAfterClass() {
     41                global $wpdb;
     42
     43                foreach( self::$site_ids as $id ) {
     44                        wpmu_delete_blog( $id, true );
     45                }
     46
     47                foreach( self::$network_ids as $id ) {
     48                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", $id ) );
     49                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", $id ) );
     50                }
     51
     52                wp_update_network_site_counts();
     53        }
     54
     55        /**
     56         * @ticket 34450
     57         */
     58        public function test_get_id_from_blogname_no_www() {
     59                global $current_site;
     60
     61                $original_network = $current_site;
     62                $current_site = get_network( self::$network_ids['wordpress.org/'] );
     63
     64                if ( is_subdomain_install() ) {
     65                        $expected = self::$site_ids['foo.wordpress.org/'];
     66                } else {
     67                        $expected = self::$site_ids['wordpress.org/foo/'];
     68                }
     69
     70                $result = get_id_from_blogname( 'foo' );
     71                $this->assertEquals( $expected, $result );
     72
     73                $current_site = $original_network;
     74        }
     75
     76        /**
     77         * @ticket 34450
     78         */
     79        public function test_get_id_from_blogname_www() {
     80                global $current_site;
     81
     82                $original_network = $current_site;
     83                $current_site = get_network( self::$network_ids['www.wordpress.net/'] );
     84
     85                if ( is_subdomain_install() ) {
     86                        $expected = self::$site_ids['foo.wordpress.net/'];
     87                } else {
     88                        $expected = self::$site_ids['www.wordpress.net/foo/'];
     89                }
     90
     91                $result = get_id_from_blogname( 'foo' );
     92                $this->assertEquals( $expected, $result );
     93
     94                $current_site = $original_network;
     95        }
     96
     97}
     98
     99endif;