WordPress 4.5
[autoinstalls/wordpress.git] / wp-admin / includes / schema.php
index bba0871d6353dc62f105c757978d224f8c224c03..b043e49b0cbcbad2ca23856404f6a0a01591f4da 100644 (file)
@@ -8,29 +8,29 @@
  * @subpackage Administration
  */
 
  * @subpackage Administration
  */
 
-// Declare these as global in case schema.php is included from a function.
+/**
+ * Declare these as global in case schema.php is included from a function.
+ *
+ * @global wpdb   $wpdb
+ * @global array  $wp_queries
+ * @global string $charset_collate
+ */
 global $wpdb, $wp_queries, $charset_collate;
 
 /**
  * The database character collate.
 global $wpdb, $wp_queries, $charset_collate;
 
 /**
  * The database character collate.
- * @var string
- * @global string
- * @name $charset_collate
  */
  */
-$charset_collate = '';
-
-if ( ! empty( $wpdb->charset ) )
-       $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
-if ( ! empty( $wpdb->collate ) )
-       $charset_collate .= " COLLATE $wpdb->collate";
+$charset_collate = $wpdb->get_charset_collate();
 
 /**
  * Retrieve the SQL for creating database tables.
  *
  * @since 3.3.0
  *
 
 /**
  * Retrieve the SQL for creating database tables.
  *
  * @since 3.3.0
  *
+ * @global wpdb $wpdb WordPress database abstraction object.
+ *
  * @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all.
  * @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all.
- * @param int $blog_id Optional. The blog ID for which to retrieve SQL. Default is the current blog ID.
+ * @param int $blog_id Optional. The site ID for which to retrieve SQL. Default is the current site ID.
  * @return string The SQL needed to create the requested tables.
  */
 function wp_get_db_schema( $scope = 'all', $blog_id = null ) {
  * @return string The SQL needed to create the requested tables.
  */
 function wp_get_db_schema( $scope = 'all', $blog_id = null ) {
@@ -49,15 +49,31 @@ function wp_get_db_schema( $scope = 'all', $blog_id = null ) {
        // Engage multisite if in the middle of turning it on from network.php.
        $is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );
 
        // Engage multisite if in the middle of turning it on from network.php.
        $is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );
 
+       /*
+        * Indexes have a maximum size of 767 bytes. Historically, we haven't need to be concerned about that.
+        * As of 4.2, however, we moved to utf8mb4, which uses 4 bytes per character. This means that an index which
+        * used to have room for floor(767/3) = 255 characters, now only has room for floor(767/4) = 191 characters.
+        */
+       $max_index_length = 191;
+
        // Blog specific tables.
        // Blog specific tables.
-       $blog_tables = "CREATE TABLE $wpdb->terms (
+       $blog_tables = "CREATE TABLE $wpdb->termmeta (
+  meta_id bigint(20) unsigned NOT NULL auto_increment,
+  term_id bigint(20) unsigned NOT NULL default '0',
+  meta_key varchar(255) default NULL,
+  meta_value longtext,
+  PRIMARY KEY  (meta_id),
+  KEY term_id (term_id),
+  KEY meta_key (meta_key($max_index_length))
+) $charset_collate;
+CREATE TABLE $wpdb->terms (
  term_id bigint(20) unsigned NOT NULL auto_increment,
  name varchar(200) NOT NULL default '',
  slug varchar(200) NOT NULL default '',
  term_group bigint(10) NOT NULL default 0,
  PRIMARY KEY  (term_id),
  term_id bigint(20) unsigned NOT NULL auto_increment,
  name varchar(200) NOT NULL default '',
  slug varchar(200) NOT NULL default '',
  term_group bigint(10) NOT NULL default 0,
  PRIMARY KEY  (term_id),
UNIQUE KEY slug (slug),
- KEY name (name)
KEY slug (slug($max_index_length)),
+ KEY name (name($max_index_length))
 ) $charset_collate;
 CREATE TABLE $wpdb->term_taxonomy (
  term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,
 ) $charset_collate;
 CREATE TABLE $wpdb->term_taxonomy (
  term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,
@@ -84,7 +100,7 @@ CREATE TABLE $wpdb->commentmeta (
   meta_value longtext,
   PRIMARY KEY  (meta_id),
   KEY comment_id (comment_id),
   meta_value longtext,
   PRIMARY KEY  (meta_id),
   KEY comment_id (comment_id),
-  KEY meta_key (meta_key)
+  KEY meta_key (meta_key($max_index_length))
 ) $charset_collate;
 CREATE TABLE $wpdb->comments (
   comment_ID bigint(20) unsigned NOT NULL auto_increment,
 ) $charset_collate;
 CREATE TABLE $wpdb->comments (
   comment_ID bigint(20) unsigned NOT NULL auto_increment,
@@ -106,7 +122,8 @@ CREATE TABLE $wpdb->comments (
   KEY comment_post_ID (comment_post_ID),
   KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
   KEY comment_date_gmt (comment_date_gmt),
   KEY comment_post_ID (comment_post_ID),
   KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
   KEY comment_date_gmt (comment_date_gmt),
-  KEY comment_parent (comment_parent)
+  KEY comment_parent (comment_parent),
+  KEY comment_author_email (comment_author_email(10))
 ) $charset_collate;
 CREATE TABLE $wpdb->links (
   link_id bigint(20) unsigned NOT NULL auto_increment,
 ) $charset_collate;
 CREATE TABLE $wpdb->links (
   link_id bigint(20) unsigned NOT NULL auto_increment,
@@ -127,7 +144,7 @@ CREATE TABLE $wpdb->links (
 ) $charset_collate;
 CREATE TABLE $wpdb->options (
   option_id bigint(20) unsigned NOT NULL auto_increment,
 ) $charset_collate;
 CREATE TABLE $wpdb->options (
   option_id bigint(20) unsigned NOT NULL auto_increment,
-  option_name varchar(64) NOT NULL default '',
+  option_name varchar(191) NOT NULL default '',
   option_value longtext NOT NULL,
   autoload varchar(20) NOT NULL default 'yes',
   PRIMARY KEY  (option_id),
   option_value longtext NOT NULL,
   autoload varchar(20) NOT NULL default 'yes',
   PRIMARY KEY  (option_id),
@@ -140,7 +157,7 @@ CREATE TABLE $wpdb->postmeta (
   meta_value longtext,
   PRIMARY KEY  (meta_id),
   KEY post_id (post_id),
   meta_value longtext,
   PRIMARY KEY  (meta_id),
   KEY post_id (post_id),
-  KEY meta_key (meta_key)
+  KEY meta_key (meta_key($max_index_length))
 ) $charset_collate;
 CREATE TABLE $wpdb->posts (
   ID bigint(20) unsigned NOT NULL auto_increment,
 ) $charset_collate;
 CREATE TABLE $wpdb->posts (
   ID bigint(20) unsigned NOT NULL auto_increment,
@@ -167,7 +184,7 @@ CREATE TABLE $wpdb->posts (
   post_mime_type varchar(100) NOT NULL default '',
   comment_count bigint(20) NOT NULL default '0',
   PRIMARY KEY  (ID),
   post_mime_type varchar(100) NOT NULL default '',
   comment_count bigint(20) NOT NULL default '0',
   PRIMARY KEY  (ID),
-  KEY post_name (post_name),
+  KEY post_name (post_name($max_index_length)),
   KEY type_status_date (post_type,post_status,post_date,ID),
   KEY post_parent (post_parent),
   KEY post_author (post_author)
   KEY type_status_date (post_type,post_status,post_date,ID),
   KEY post_parent (post_parent),
   KEY post_author (post_author)
@@ -177,39 +194,41 @@ CREATE TABLE $wpdb->posts (
        $users_single_table = "CREATE TABLE $wpdb->users (
   ID bigint(20) unsigned NOT NULL auto_increment,
   user_login varchar(60) NOT NULL default '',
        $users_single_table = "CREATE TABLE $wpdb->users (
   ID bigint(20) unsigned NOT NULL auto_increment,
   user_login varchar(60) NOT NULL default '',
-  user_pass varchar(64) NOT NULL default '',
+  user_pass varchar(255) NOT NULL default '',
   user_nicename varchar(50) NOT NULL default '',
   user_email varchar(100) NOT NULL default '',
   user_url varchar(100) NOT NULL default '',
   user_registered datetime NOT NULL default '0000-00-00 00:00:00',
   user_nicename varchar(50) NOT NULL default '',
   user_email varchar(100) NOT NULL default '',
   user_url varchar(100) NOT NULL default '',
   user_registered datetime NOT NULL default '0000-00-00 00:00:00',
-  user_activation_key varchar(60) NOT NULL default '',
+  user_activation_key varchar(255) NOT NULL default '',
   user_status int(11) NOT NULL default '0',
   display_name varchar(250) NOT NULL default '',
   PRIMARY KEY  (ID),
   KEY user_login_key (user_login),
   user_status int(11) NOT NULL default '0',
   display_name varchar(250) NOT NULL default '',
   PRIMARY KEY  (ID),
   KEY user_login_key (user_login),
-  KEY user_nicename (user_nicename)
+  KEY user_nicename (user_nicename),
+  KEY user_email (user_email)
 ) $charset_collate;\n";
 
        // Multisite users table
        $users_multi_table = "CREATE TABLE $wpdb->users (
   ID bigint(20) unsigned NOT NULL auto_increment,
   user_login varchar(60) NOT NULL default '',
 ) $charset_collate;\n";
 
        // Multisite users table
        $users_multi_table = "CREATE TABLE $wpdb->users (
   ID bigint(20) unsigned NOT NULL auto_increment,
   user_login varchar(60) NOT NULL default '',
-  user_pass varchar(64) NOT NULL default '',
+  user_pass varchar(255) NOT NULL default '',
   user_nicename varchar(50) NOT NULL default '',
   user_email varchar(100) NOT NULL default '',
   user_url varchar(100) NOT NULL default '',
   user_registered datetime NOT NULL default '0000-00-00 00:00:00',
   user_nicename varchar(50) NOT NULL default '',
   user_email varchar(100) NOT NULL default '',
   user_url varchar(100) NOT NULL default '',
   user_registered datetime NOT NULL default '0000-00-00 00:00:00',
-  user_activation_key varchar(60) NOT NULL default '',
+  user_activation_key varchar(255) NOT NULL default '',
   user_status int(11) NOT NULL default '0',
   display_name varchar(250) NOT NULL default '',
   spam tinyint(2) NOT NULL default '0',
   deleted tinyint(2) NOT NULL default '0',
   PRIMARY KEY  (ID),
   KEY user_login_key (user_login),
   user_status int(11) NOT NULL default '0',
   display_name varchar(250) NOT NULL default '',
   spam tinyint(2) NOT NULL default '0',
   deleted tinyint(2) NOT NULL default '0',
   PRIMARY KEY  (ID),
   KEY user_login_key (user_login),
-  KEY user_nicename (user_nicename)
+  KEY user_nicename (user_nicename),
+  KEY user_email (user_email)
 ) $charset_collate;\n";
 
 ) $charset_collate;\n";
 
-       // usermeta
+       // Usermeta.
        $usermeta_table = "CREATE TABLE $wpdb->usermeta (
   umeta_id bigint(20) unsigned NOT NULL auto_increment,
   user_id bigint(20) unsigned NOT NULL default '0',
        $usermeta_table = "CREATE TABLE $wpdb->usermeta (
   umeta_id bigint(20) unsigned NOT NULL auto_increment,
   user_id bigint(20) unsigned NOT NULL default '0',
@@ -217,7 +236,7 @@ CREATE TABLE $wpdb->posts (
   meta_value longtext,
   PRIMARY KEY  (umeta_id),
   KEY user_id (user_id),
   meta_value longtext,
   PRIMARY KEY  (umeta_id),
   KEY user_id (user_id),
-  KEY meta_key (meta_key)
+  KEY meta_key (meta_key($max_index_length))
 ) $charset_collate;\n";
 
        // Global tables
 ) $charset_collate;\n";
 
        // Global tables
@@ -235,7 +254,7 @@ CREATE TABLE $wpdb->posts (
   registered datetime NOT NULL default '0000-00-00 00:00:00',
   last_updated datetime NOT NULL default '0000-00-00 00:00:00',
   public tinyint(2) NOT NULL default '1',
   registered datetime NOT NULL default '0000-00-00 00:00:00',
   last_updated datetime NOT NULL default '0000-00-00 00:00:00',
   public tinyint(2) NOT NULL default '1',
-  archived enum('0','1') NOT NULL default '0',
+  archived tinyint(2) NOT NULL default '0',
   mature tinyint(2) NOT NULL default '0',
   spam tinyint(2) NOT NULL default '0',
   deleted tinyint(2) NOT NULL default '0',
   mature tinyint(2) NOT NULL default '0',
   spam tinyint(2) NOT NULL default '0',
   deleted tinyint(2) NOT NULL default '0',
@@ -265,7 +284,7 @@ CREATE TABLE $wpdb->site (
   domain varchar(200) NOT NULL default '',
   path varchar(100) NOT NULL default '',
   PRIMARY KEY  (id),
   domain varchar(200) NOT NULL default '',
   path varchar(100) NOT NULL default '',
   PRIMARY KEY  (id),
-  KEY domain (domain,path)
+  KEY domain (domain(140),path(51))
 ) $charset_collate;
 CREATE TABLE $wpdb->sitemeta (
   meta_id bigint(20) NOT NULL auto_increment,
 ) $charset_collate;
 CREATE TABLE $wpdb->sitemeta (
   meta_id bigint(20) NOT NULL auto_increment,
@@ -273,10 +292,11 @@ CREATE TABLE $wpdb->sitemeta (
   meta_key varchar(255) default NULL,
   meta_value longtext,
   PRIMARY KEY  (meta_id),
   meta_key varchar(255) default NULL,
   meta_value longtext,
   PRIMARY KEY  (meta_id),
-  KEY meta_key (meta_key),
+  KEY meta_key (meta_key($max_index_length)),
   KEY site_id (site_id)
 ) $charset_collate;
 CREATE TABLE $wpdb->signups (
   KEY site_id (site_id)
 ) $charset_collate;
 CREATE TABLE $wpdb->signups (
+  signup_id bigint(20) NOT NULL auto_increment,
   domain varchar(200) NOT NULL default '',
   path varchar(100) NOT NULL default '',
   title longtext NOT NULL,
   domain varchar(200) NOT NULL default '',
   path varchar(100) NOT NULL default '',
   title longtext NOT NULL,
@@ -287,8 +307,11 @@ CREATE TABLE $wpdb->signups (
   active tinyint(1) NOT NULL default '0',
   activation_key varchar(50) NOT NULL default '',
   meta longtext,
   active tinyint(1) NOT NULL default '0',
   activation_key varchar(50) NOT NULL default '',
   meta longtext,
+  PRIMARY KEY  (signup_id),
   KEY activation_key (activation_key),
   KEY activation_key (activation_key),
-  KEY domain (domain)
+  KEY user_email (user_email),
+  KEY user_login_email (user_login,user_email),
+  KEY domain_path (domain(140),path(51))
 ) $charset_collate;";
 
        switch ( $scope ) {
 ) $charset_collate;";
 
        switch ( $scope ) {
@@ -303,8 +326,8 @@ CREATE TABLE $wpdb->signups (
                case 'ms_global' :
                        $queries = $ms_global_tables;
                        break;
                case 'ms_global' :
                        $queries = $ms_global_tables;
                        break;
-               default:
                case 'all' :
                case 'all' :
+               default:
                        $queries = $global_tables . $blog_tables;
                        if ( $is_multisite )
                                $queries .= $ms_global_tables;
                        $queries = $global_tables . $blog_tables;
                        if ( $is_multisite )
                                $queries .= $ms_global_tables;
@@ -324,15 +347,21 @@ $wp_queries = wp_get_db_schema( 'all' );
  * Create WordPress options and set the default values.
  *
  * @since 1.5.0
  * Create WordPress options and set the default values.
  *
  * @since 1.5.0
- * @uses $wpdb
- * @uses $wp_db_version
+ *
+ * @global wpdb $wpdb WordPress database abstraction object.
+ * @global int  $wp_db_version
+ * @global int  $wp_current_db_version
  */
 function populate_options() {
  */
 function populate_options() {
-       global $wpdb, $wp_db_version, $current_site, $wp_current_db_version;
+       global $wpdb, $wp_db_version, $wp_current_db_version;
 
        $guessurl = wp_guess_url();
 
        $guessurl = wp_guess_url();
-
-       do_action('populate_options');
+       /**
+        * Fires before creating WordPress options and populating their default values.
+        *
+        * @since 2.6.0
+        */
+       do_action( 'populate_options' );
 
        if ( ini_get('safe_mode') ) {
                // Safe mode can break mkdir() so use a flat structure by default.
 
        if ( ini_get('safe_mode') ) {
                // Safe mode can break mkdir() so use a flat structure by default.
@@ -341,11 +370,18 @@ function populate_options() {
                $uploads_use_yearmonth_folders = 1;
        }
 
                $uploads_use_yearmonth_folders = 1;
        }
 
-       $template = WP_DEFAULT_THEME;
-       // If default theme is a child theme, we need to get its template
-       $theme = wp_get_theme( $template );
-       if ( ! $theme->errors() )
-               $template = $theme->get_template();
+       // If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme.
+       $stylesheet = $template = WP_DEFAULT_THEME;
+       $theme = wp_get_theme( WP_DEFAULT_THEME );
+       if ( ! $theme->exists() ) {
+               $theme = WP_Theme::get_core_default_theme();
+       }
+
+       // If we can't find a core default theme, WP_DEFAULT_THEME is the best we can do.
+       if ( $theme ) {
+               $stylesheet = $theme->get_stylesheet();
+               $template   = $theme->get_template();
+       }
 
        $timezone_string = '';
        $gmt_offset = 0;
 
        $timezone_string = '';
        $gmt_offset = 0;
@@ -361,8 +397,9 @@ function populate_options() {
 
        $options = array(
        'siteurl' => $guessurl,
 
        $options = array(
        'siteurl' => $guessurl,
+       'home' => $guessurl,
        'blogname' => __('My Site'),
        'blogname' => __('My Site'),
-       /* translators: blog tagline */
+       /* translators: site tagline */
        'blogdescription' => __('Just another WordPress site'),
        'users_can_register' => 0,
        'admin_email' => 'you@example.com',
        'blogdescription' => __('Just another WordPress site'),
        'users_can_register' => 0,
        'admin_email' => 'you@example.com',
@@ -382,7 +419,6 @@ function populate_options() {
        'default_comment_status' => 'open',
        'default_ping_status' => 'open',
        'default_pingback_flag' => 1,
        'default_comment_status' => 'open',
        'default_ping_status' => 'open',
        'default_pingback_flag' => 1,
-       'default_post_edit_rows' => 20,
        'posts_per_page' => 10,
        /* translators: default date format, see http://php.net/date */
        'date_format' => __('F j, Y'),
        'posts_per_page' => 10,
        /* translators: default date format, see http://php.net/date */
        'date_format' => __('F j, Y'),
@@ -390,21 +426,16 @@ function populate_options() {
        'time_format' => __('g:i a'),
        /* translators: links last updated date format, see http://php.net/date */
        'links_updated_date_format' => __('F j, Y g:i a'),
        'time_format' => __('g:i a'),
        /* translators: links last updated date format, see http://php.net/date */
        'links_updated_date_format' => __('F j, Y g:i a'),
-       'links_recently_updated_prepend' => '<em>',
-       'links_recently_updated_append' => '</em>',
-       'links_recently_updated_time' => 120,
        'comment_moderation' => 0,
        'moderation_notify' => 1,
        'permalink_structure' => '',
        'comment_moderation' => 0,
        'moderation_notify' => 1,
        'permalink_structure' => '',
-       'gzipcompression' => 0,
+       'rewrite_rules' => '',
        'hack_file' => 0,
        'blog_charset' => 'UTF-8',
        'moderation_keys' => '',
        'active_plugins' => array(),
        'hack_file' => 0,
        'blog_charset' => 'UTF-8',
        'moderation_keys' => '',
        'active_plugins' => array(),
-       'home' => $guessurl,
        'category_base' => '',
        'ping_sites' => 'http://rpc.pingomatic.com/',
        'category_base' => '',
        'ping_sites' => 'http://rpc.pingomatic.com/',
-       'advanced_edit' => 0,
        'comment_max_links' => 2,
        'gmt_offset' => $gmt_offset,
 
        'comment_max_links' => 2,
        'gmt_offset' => $gmt_offset,
 
@@ -412,7 +443,7 @@ function populate_options() {
        'default_email_category' => 1,
        'recently_edited' => '',
        'template' => $template,
        'default_email_category' => 1,
        'recently_edited' => '',
        'template' => $template,
-       'stylesheet' => WP_DEFAULT_THEME,
+       'stylesheet' => $stylesheet,
        'comment_whitelist' => 1,
        'blacklist_keys' => '',
        'comment_registration' => 0,
        'comment_whitelist' => 1,
        'blacklist_keys' => '',
        'comment_registration' => 0,
@@ -449,13 +480,11 @@ function populate_options() {
 
        // 2.6
        'avatar_default' => 'mystery',
 
        // 2.6
        'avatar_default' => 'mystery',
-       'enable_app' => 0,
-       'enable_xmlrpc' => 0,
 
        // 2.7
        'large_size_w' => 1024,
        'large_size_h' => 1024,
 
        // 2.7
        'large_size_w' => 1024,
        'large_size_h' => 1024,
-       'image_default_link_type' => 'file',
+       'image_default_link_type' => 'none',
        'image_default_size' => '',
        'image_default_align' => '',
        'close_comments_for_old_posts' => 0,
        'image_default_size' => '',
        'image_default_align' => '',
        'close_comments_for_old_posts' => 0,
@@ -475,17 +504,23 @@ function populate_options() {
        // 2.8
        'timezone_string' => $timezone_string,
 
        // 2.8
        'timezone_string' => $timezone_string,
 
-       // 2.9
-       'embed_autourls' => 1,
-       'embed_size_w' => '',
-       'embed_size_h' => 600,
-
        // 3.0
        'page_for_posts' => 0,
        'page_on_front' => 0,
 
        // 3.1
        'default_post_format' => 0,
        // 3.0
        'page_for_posts' => 0,
        'page_on_front' => 0,
 
        // 3.1
        'default_post_format' => 0,
+
+       // 3.5
+       'link_manager_enabled' => 0,
+
+       // 4.3.0
+       'finished_splitting_shared_terms' => 1,
+       'site_icon' => 0,
+
+       // 4.4.0
+       'medium_large_size_w' => 768,
+       'medium_large_size_h' => 0,
        );
 
        // 3.3
        );
 
        // 3.3
@@ -496,15 +531,16 @@ function populate_options() {
 
        // 3.0 multisite
        if ( is_multisite() ) {
 
        // 3.0 multisite
        if ( is_multisite() ) {
-               /* translators: blog tagline */
-               $options[ 'blogdescription' ] = sprintf(__('Just another %s site'), $current_site->site_name );
+               /* translators: site tagline */
+               $options[ 'blogdescription' ] = sprintf(__('Just another %s site'), get_current_site()->site_name );
                $options[ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/';
        }
 
        // Set autoload to no for these options
        $fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys', 'uninstall_plugins' );
 
                $options[ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/';
        }
 
        // Set autoload to no for these options
        $fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys', 'uninstall_plugins' );
 
-       $existing_options = $wpdb->get_col("SELECT option_name FROM $wpdb->options");
+       $keys = "'" . implode( "', '", array_keys( $options ) ) . "'";
+       $existing_options = $wpdb->get_col( "SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys )" );
 
        $insert = '';
        foreach ( $options as $option => $value ) {
 
        $insert = '';
        foreach ( $options as $option => $value ) {
@@ -515,28 +551,65 @@ function populate_options() {
                else
                        $autoload = 'yes';
 
                else
                        $autoload = 'yes';
 
-               $option = $wpdb->escape($option);
                if ( is_array($value) )
                        $value = serialize($value);
                if ( is_array($value) )
                        $value = serialize($value);
-               $value = $wpdb->escape($value);
                if ( !empty($insert) )
                        $insert .= ', ';
                if ( !empty($insert) )
                        $insert .= ', ';
-               $insert .= "('$option', '$value', '$autoload')";
+               $insert .= $wpdb->prepare( "(%s, %s, %s)", $option, $value, $autoload );
        }
 
        if ( !empty($insert) )
                $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert);
 
        }
 
        if ( !empty($insert) )
                $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert);
 
-       // in case it is set, but blank, update "home"
+       // In case it is set, but blank, update "home".
        if ( !__get_option('home') ) update_option('home', $guessurl);
 
        if ( !__get_option('home') ) update_option('home', $guessurl);
 
-       // Delete unused options
-       $unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins', 'can_compress_scripts', 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron', 'random_seed', 'rss_excerpt_length', 'secret', 'use_linksupdate', 'default_comment_status_page', 'wporg_popular_tags', 'what_to_show', 'rss_language');
+       // Delete unused options.
+       $unusedoptions = array(
+               'blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory',
+               'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping',
+               'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers',
+               'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference',
+               'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char',
+               'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1',
+               'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5',
+               'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9',
+               'links_recently_updated_time', 'links_recently_updated_prepend', 'links_recently_updated_append',
+               'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat',
+               'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce',
+               '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins',
+               'can_compress_scripts', 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron',
+               'random_seed', 'rss_excerpt_length', 'secret', 'use_linksupdate', 'default_comment_status_page',
+               'wporg_popular_tags', 'what_to_show', 'rss_language', 'language', 'enable_xmlrpc', 'enable_app',
+               'embed_autourls', 'default_post_edit_rows', 'gzipcompression', 'advanced_edit'
+       );
        foreach ( $unusedoptions as $option )
                delete_option($option);
 
        foreach ( $unusedoptions as $option )
                delete_option($option);
 
-       // delete obsolete magpie stuff
+       // Delete obsolete magpie stuff.
        $wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'");
        $wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'");
+
+       /*
+        * Deletes all expired transients. The multi-table delete syntax is used
+        * to delete the transient record from table a, and the corresponding
+        * transient_timeout record from table b.
+        */
+       $time = time();
+       $sql = "DELETE a, b FROM $wpdb->options a, $wpdb->options b
+               WHERE a.option_name LIKE %s
+               AND a.option_name NOT LIKE %s
+               AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
+               AND b.option_value < %d";
+       $wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_transient_' ) . '%', $wpdb->esc_like( '_transient_timeout_' ) . '%', $time ) );
+
+       if ( is_main_site() && is_main_network() ) {
+               $sql = "DELETE a, b FROM $wpdb->options a, $wpdb->options b
+                       WHERE a.option_name LIKE %s
+                       AND a.option_name NOT LIKE %s
+                       AND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )
+                       AND b.option_value < %d";
+               $wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like( '_site_transient_timeout_' ) . '%', $time ) );
+       }
 }
 
 /**
 }
 
 /**
@@ -582,7 +655,7 @@ function populate_roles_160() {
        add_role('subscriber', 'Subscriber');
 
        // Add caps for Administrator role
        add_role('subscriber', 'Subscriber');
 
        // Add caps for Administrator role
-       $role =& get_role('administrator');
+       $role = get_role('administrator');
        $role->add_cap('switch_themes');
        $role->add_cap('edit_themes');
        $role->add_cap('activate_plugins');
        $role->add_cap('switch_themes');
        $role->add_cap('edit_themes');
        $role->add_cap('activate_plugins');
@@ -615,7 +688,7 @@ function populate_roles_160() {
        $role->add_cap('level_0');
 
        // Add caps for Editor role
        $role->add_cap('level_0');
 
        // Add caps for Editor role
-       $role =& get_role('editor');
+       $role = get_role('editor');
        $role->add_cap('moderate_comments');
        $role->add_cap('manage_categories');
        $role->add_cap('manage_links');
        $role->add_cap('moderate_comments');
        $role->add_cap('manage_categories');
        $role->add_cap('manage_links');
@@ -637,7 +710,7 @@ function populate_roles_160() {
        $role->add_cap('level_0');
 
        // Add caps for Author role
        $role->add_cap('level_0');
 
        // Add caps for Author role
-       $role =& get_role('author');
+       $role = get_role('author');
        $role->add_cap('upload_files');
        $role->add_cap('edit_posts');
        $role->add_cap('edit_published_posts');
        $role->add_cap('upload_files');
        $role->add_cap('edit_posts');
        $role->add_cap('edit_published_posts');
@@ -648,14 +721,14 @@ function populate_roles_160() {
        $role->add_cap('level_0');
 
        // Add caps for Contributor role
        $role->add_cap('level_0');
 
        // Add caps for Contributor role
-       $role =& get_role('contributor');
+       $role = get_role('contributor');
        $role->add_cap('edit_posts');
        $role->add_cap('read');
        $role->add_cap('level_1');
        $role->add_cap('level_0');
 
        // Add caps for Subscriber role
        $role->add_cap('edit_posts');
        $role->add_cap('read');
        $role->add_cap('level_1');
        $role->add_cap('level_0');
 
        // Add caps for Subscriber role
-       $role =& get_role('subscriber');
+       $role = get_role('subscriber');
        $role->add_cap('read');
        $role->add_cap('level_0');
 }
        $role->add_cap('read');
        $role->add_cap('level_0');
 }
@@ -668,7 +741,7 @@ function populate_roles_160() {
 function populate_roles_210() {
        $roles = array('administrator', 'editor');
        foreach ($roles as $role) {
 function populate_roles_210() {
        $roles = array('administrator', 'editor');
        foreach ($roles as $role) {
-               $role =& get_role($role);
+               $role = get_role($role);
                if ( empty($role) )
                        continue;
 
                if ( empty($role) )
                        continue;
 
@@ -689,19 +762,19 @@ function populate_roles_210() {
                $role->add_cap('read_private_pages');
        }
 
                $role->add_cap('read_private_pages');
        }
 
-       $role =& get_role('administrator');
+       $role = get_role('administrator');
        if ( ! empty($role) ) {
                $role->add_cap('delete_users');
                $role->add_cap('create_users');
        }
 
        if ( ! empty($role) ) {
                $role->add_cap('delete_users');
                $role->add_cap('create_users');
        }
 
-       $role =& get_role('author');
+       $role = get_role('author');
        if ( ! empty($role) ) {
                $role->add_cap('delete_posts');
                $role->add_cap('delete_published_posts');
        }
 
        if ( ! empty($role) ) {
                $role->add_cap('delete_posts');
                $role->add_cap('delete_published_posts');
        }
 
-       $role =& get_role('contributor');
+       $role = get_role('contributor');
        if ( ! empty($role) ) {
                $role->add_cap('delete_posts');
        }
        if ( ! empty($role) ) {
                $role->add_cap('delete_posts');
        }
@@ -713,7 +786,7 @@ function populate_roles_210() {
  * @since 2.3.0
  */
 function populate_roles_230() {
  * @since 2.3.0
  */
 function populate_roles_230() {
-       $role =& get_role( 'administrator' );
+       $role = get_role( 'administrator' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'unfiltered_upload' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'unfiltered_upload' );
@@ -726,7 +799,7 @@ function populate_roles_230() {
  * @since 2.5.0
  */
 function populate_roles_250() {
  * @since 2.5.0
  */
 function populate_roles_250() {
-       $role =& get_role( 'administrator' );
+       $role = get_role( 'administrator' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'edit_dashboard' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'edit_dashboard' );
@@ -739,7 +812,7 @@ function populate_roles_250() {
  * @since 2.6.0
  */
 function populate_roles_260() {
  * @since 2.6.0
  */
 function populate_roles_260() {
-       $role =& get_role( 'administrator' );
+       $role = get_role( 'administrator' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'update_plugins' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'update_plugins' );
@@ -753,7 +826,7 @@ function populate_roles_260() {
  * @since 2.7.0
  */
 function populate_roles_270() {
  * @since 2.7.0
  */
 function populate_roles_270() {
-       $role =& get_role( 'administrator' );
+       $role = get_role( 'administrator' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'install_plugins' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'install_plugins' );
@@ -767,7 +840,7 @@ function populate_roles_270() {
  * @since 2.8.0
  */
 function populate_roles_280() {
  * @since 2.8.0
  */
 function populate_roles_280() {
-       $role =& get_role( 'administrator' );
+       $role = get_role( 'administrator' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'install_themes' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'install_themes' );
@@ -780,13 +853,12 @@ function populate_roles_280() {
  * @since 3.0.0
  */
 function populate_roles_300() {
  * @since 3.0.0
  */
 function populate_roles_300() {
-       $role =& get_role( 'administrator' );
+       $role = get_role( 'administrator' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'update_core' );
                $role->add_cap( 'list_users' );
                $role->add_cap( 'remove_users' );
 
        if ( !empty( $role ) ) {
                $role->add_cap( 'update_core' );
                $role->add_cap( 'list_users' );
                $role->add_cap( 'remove_users' );
-               $role->add_cap( 'add_users' );
                $role->add_cap( 'promote_users' );
                $role->add_cap( 'edit_theme_options' );
                $role->add_cap( 'delete_themes' );
                $role->add_cap( 'promote_users' );
                $role->add_cap( 'edit_theme_options' );
                $role->add_cap( 'delete_themes' );
@@ -810,13 +882,24 @@ function install_network() {
 endif;
 
 /**
 endif;
 
 /**
- * populate network settings
+ * Populate network settings.
  *
  * @since 3.0.0
  *
  *
  * @since 3.0.0
  *
- * @param int $network_id id of network to populate
+ * @global wpdb       $wpdb
+ * @global object     $current_site
+ * @global int        $wp_db_version
+ * @global WP_Rewrite $wp_rewrite
+ *
+ * @param int    $network_id        ID of network to populate.
+ * @param string $domain            The domain name for the network (eg. "example.com").
+ * @param string $email             Email address for the network administrator.
+ * @param string $site_name         The name of the network.
+ * @param string $path              Optional. The path to append to the network's domain name. Default '/'.
+ * @param bool   $subdomain_install Optional. Whether the network is a subdomain install or a subdirectory install.
+ *                                  Default false, meaning the network is a subdirectory install.
  * @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful,
  * @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful,
- *     so the error code must be checked) or failure.
+ *                       so the error code must be checked) or failure.
  */
 function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) {
        global $wpdb, $current_site, $wp_db_version, $wp_rewrite;
  */
 function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) {
        global $wpdb, $current_site, $wp_db_version, $wp_rewrite;
@@ -827,25 +910,41 @@ function populate_network( $network_id = 1, $domain = '', $email = '', $site_nam
        if ( '' == $site_name )
                $errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) );
 
        if ( '' == $site_name )
                $errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) );
 
-       // check for network collision
+       // Check for network collision.
        if ( $network_id == $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE id = %d", $network_id ) ) )
                $errors->add( 'siteid_exists', __( 'The network already exists.' ) );
 
        if ( $network_id == $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE id = %d", $network_id ) ) )
                $errors->add( 'siteid_exists', __( 'The network already exists.' ) );
 
-       $site_user = get_user_by( 'email', $email );
        if ( ! is_email( $email ) )
        if ( ! is_email( $email ) )
-               $errors->add( 'invalid_email', __( 'You must provide a valid e-mail address.' ) );
+               $errors->add( 'invalid_email', __( 'You must provide a valid email address.' ) );
 
        if ( $errors->get_error_code() )
                return $errors;
 
 
        if ( $errors->get_error_code() )
                return $errors;
 
-       // set up site tables
+       // If a user with the provided email does not exist, default to the current user as the new network admin.
+       $site_user = get_user_by( 'email', $email );
+       if ( false === $site_user ) {
+               $site_user = wp_get_current_user();
+       }
+
+       // Set up site tables.
        $template = get_option( 'template' );
        $stylesheet = get_option( 'stylesheet' );
        $allowed_themes = array( $stylesheet => true );
        $template = get_option( 'template' );
        $stylesheet = get_option( 'stylesheet' );
        $allowed_themes = array( $stylesheet => true );
-       if ( $template != $stylesheet )
+
+       if ( $template != $stylesheet ) {
                $allowed_themes[ $template ] = true;
                $allowed_themes[ $template ] = true;
-       if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template )
+       }
+
+       if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template ) {
                $allowed_themes[ WP_DEFAULT_THEME ] = true;
                $allowed_themes[ WP_DEFAULT_THEME ] = true;
+       }
+
+       // If WP_DEFAULT_THEME doesn't exist, also whitelist the latest core default theme.
+       if ( ! wp_get_theme( WP_DEFAULT_THEME )->exists() ) {
+               if ( $core_default = WP_Theme::get_core_default_theme() ) {
+                       $allowed_themes[ $core_default->get_stylesheet() ] = true;
+               }
+       }
 
        if ( 1 == $network_id ) {
                $wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path ) );
 
        if ( 1 == $network_id ) {
                $wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path ) );
@@ -854,6 +953,8 @@ function populate_network( $network_id = 1, $domain = '', $email = '', $site_nam
                $wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path, 'id' => $network_id ) );
        }
 
                $wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path, 'id' => $network_id ) );
        }
 
+       wp_cache_delete( 'networks_have_paths', 'site-options' );
+
        if ( !is_multisite() ) {
                $site_admins = array( $site_user->user_login );
                $users = get_users( array( 'fields' => array( 'ID', 'user_login' ) ) );
        if ( !is_multisite() ) {
                $site_admins = array( $site_user->user_login );
                $users = get_users( array( 'fields' => array( 'ID', 'user_login' ) ) );
@@ -867,12 +968,14 @@ function populate_network( $network_id = 1, $domain = '', $email = '', $site_nam
                $site_admins = get_site_option( 'site_admins' );
        }
 
                $site_admins = get_site_option( 'site_admins' );
        }
 
-       $welcome_email = __( 'Dear User,
+       /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
+       $welcome_email = __( 'Howdy USERNAME,
 
 Your new SITE_NAME site has been successfully set up at:
 BLOG_URL
 
 You can log in to the administrator account with the following information:
 
 Your new SITE_NAME site has been successfully set up at:
 BLOG_URL
 
 You can log in to the administrator account with the following information:
+
 Username: USERNAME
 Password: PASSWORD
 Log in here: BLOG_URLwp-login.php
 Username: USERNAME
 Password: PASSWORD
 Log in here: BLOG_URLwp-login.php
@@ -881,12 +984,26 @@ We hope you enjoy your new site. Thanks!
 
 --The Team @ SITE_NAME' );
 
 
 --The Team @ SITE_NAME' );
 
+       $misc_exts = array(
+               // Images.
+               'jpg', 'jpeg', 'png', 'gif',
+               // Video.
+               'mov', 'avi', 'mpg', '3gp', '3g2',
+               // "audio".
+               'midi', 'mid',
+               // Miscellaneous.
+               'pdf', 'doc', 'ppt', 'odt', 'pptx', 'docx', 'pps', 'ppsx', 'xls', 'xlsx', 'key',
+       );
+       $audio_exts = wp_get_audio_extensions();
+       $video_exts = wp_get_video_extensions();
+       $upload_filetypes = array_unique( array_merge( $misc_exts, $audio_exts, $video_exts ) );
+
        $sitemeta = array(
                'site_name' => $site_name,
        $sitemeta = array(
                'site_name' => $site_name,
-               'admin_email' => $site_user->user_email,
+               'admin_email' => $email,
                'admin_user_id' => $site_user->ID,
                'registration' => 'none',
                'admin_user_id' => $site_user->ID,
                'registration' => 'none',
-               'upload_filetypes' => 'jpg jpeg png gif mp3 mov avi wmv midi mid pdf',
+               'upload_filetypes' => implode( ' ', $upload_filetypes ),
                'blog_upload_space' => 100,
                'fileupload_maxk' => 1500,
                'site_admins' => $site_admins,
                'blog_upload_space' => 100,
                'fileupload_maxk' => 1500,
                'site_admins' => $site_admins,
@@ -894,55 +1011,69 @@ We hope you enjoy your new site. Thanks!
                'illegal_names' => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ),
                'wpmu_upgrade_site' => $wp_db_version,
                'welcome_email' => $welcome_email,
                'illegal_names' => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ),
                'wpmu_upgrade_site' => $wp_db_version,
                'welcome_email' => $welcome_email,
-               'first_post' => __( 'Welcome to <a href="SITE_URL">SITE_NAME</a>. This is your first post. Edit or delete it, then start blogging!' ),
+               /* translators: %s: site link */
+               'first_post' => __( 'Welcome to %s. This is your first post. Edit or delete it, then start blogging!' ),
                // @todo - network admins should have a method of editing the network siteurl (used for cookie hash)
                'siteurl' => get_option( 'siteurl' ) . '/',
                'add_new_users' => '0',
                // @todo - network admins should have a method of editing the network siteurl (used for cookie hash)
                'siteurl' => get_option( 'siteurl' ) . '/',
                'add_new_users' => '0',
-               'upload_space_check_disabled' => '0',
+               'upload_space_check_disabled' => is_multisite() ? get_site_option( 'upload_space_check_disabled' ) : '1',
                'subdomain_install' => intval( $subdomain_install ),
                'global_terms_enabled' => global_terms_enabled() ? '1' : '0',
                'subdomain_install' => intval( $subdomain_install ),
                'global_terms_enabled' => global_terms_enabled() ? '1' : '0',
+               'ms_files_rewriting' => is_multisite() ? get_site_option( 'ms_files_rewriting' ) : '0',
                'initial_db_version' => get_option( 'initial_db_version' ),
                'active_sitewide_plugins' => array(),
                'initial_db_version' => get_option( 'initial_db_version' ),
                'active_sitewide_plugins' => array(),
+               'WPLANG' => get_locale(),
        );
        if ( ! $subdomain_install )
                $sitemeta['illegal_names'][] = 'blog';
 
        );
        if ( ! $subdomain_install )
                $sitemeta['illegal_names'][] = 'blog';
 
+       /**
+        * Filter meta for a network on creation.
+        *
+        * @since 3.7.0
+        *
+        * @param array $sitemeta   Associative array of network meta keys and values to be inserted.
+        * @param int   $network_id ID of network to populate.
+        */
+       $sitemeta = apply_filters( 'populate_network_meta', $sitemeta, $network_id );
+
        $insert = '';
        foreach ( $sitemeta as $meta_key => $meta_value ) {
        $insert = '';
        foreach ( $sitemeta as $meta_key => $meta_value ) {
-               $meta_key = $wpdb->escape( $meta_key );
                if ( is_array( $meta_value ) )
                        $meta_value = serialize( $meta_value );
                if ( is_array( $meta_value ) )
                        $meta_value = serialize( $meta_value );
-               $meta_value = $wpdb->escape( $meta_value );
                if ( !empty( $insert ) )
                        $insert .= ', ';
                if ( !empty( $insert ) )
                        $insert .= ', ';
-               $insert .= "( $network_id, '$meta_key', '$meta_value')";
+               $insert .= $wpdb->prepare( "( %d, %s, %s)", $network_id, $meta_key, $meta_value );
        }
        $wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert );
 
        }
        $wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert );
 
-       $current_site->domain = $domain;
-       $current_site->path = $path;
-       $current_site->site_name = ucfirst( $domain );
-
-       if ( !is_multisite() ) {
-               $wpdb->insert( $wpdb->blogs, array( 'site_id' => $network_id, 'domain' => $domain, 'path' => $path, 'registered' => current_time( 'mysql' ) ) );
-               $blog_id = $wpdb->insert_id;
+       /*
+        * When upgrading from single to multisite, assume the current site will
+        * become the main site of the network. When using populate_network()
+        * to create another network in an existing multisite environment, skip
+        * these steps since the main site of the new network has not yet been
+        * created.
+        */
+       if ( ! is_multisite() ) {
+               $current_site = new stdClass;
+               $current_site->domain = $domain;
+               $current_site->path = $path;
+               $current_site->site_name = ucfirst( $domain );
+               $wpdb->insert( $wpdb->blogs, array( 'site_id' => $network_id, 'blog_id' => 1, 'domain' => $domain, 'path' => $path, 'registered' => current_time( 'mysql' ) ) );
+               $current_site->blog_id = $blog_id = $wpdb->insert_id;
                update_user_meta( $site_user->ID, 'source_domain', $domain );
                update_user_meta( $site_user->ID, 'primary_blog', $blog_id );
                update_user_meta( $site_user->ID, 'source_domain', $domain );
                update_user_meta( $site_user->ID, 'primary_blog', $blog_id );
-               if ( !$upload_path = get_option( 'upload_path' ) ) {
-                       $upload_path = substr( WP_CONTENT_DIR, strlen( ABSPATH ) ) . '/uploads';
-                       update_option( 'upload_path', $upload_path );
-               }
-               update_option( 'fileupload_url', get_option( 'siteurl' ) . '/' . $upload_path );
-       }
 
 
-       if ( $subdomain_install )
-               $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
-       else
-               $wp_rewrite->set_permalink_structure( '/blog/%year%/%monthnum%/%day%/%postname%/' );
+               if ( $subdomain_install )
+                       $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
+               else
+                       $wp_rewrite->set_permalink_structure( '/blog/%year%/%monthnum%/%day%/%postname%/' );
+
+               flush_rewrite_rules();
 
 
-       flush_rewrite_rules();
+               if ( ! $subdomain_install )
+                       return true;
 
 
-       if ( $subdomain_install ) {
                $vhost_ok = false;
                $errstr = '';
                $hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname!
                $vhost_ok = false;
                $errstr = '';
                $hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname!
@@ -954,12 +1085,26 @@ We hope you enjoy your new site. Thanks!
 
                if ( ! $vhost_ok ) {
                        $msg = '<p><strong>' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>';
 
                if ( ! $vhost_ok ) {
                        $msg = '<p><strong>' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>';
-                       $msg .= '<p>' . sprintf( __( 'The installer attempted to contact a random hostname (<code>%1$s</code>) on your domain.' ), $hostname );
-                       if ( ! empty ( $errstr ) )
+
+                       $msg .= '<p>' . sprintf(
+                               /* translators: %s: host name */
+                               __( 'The installer attempted to contact a random hostname (%s) on your domain.' ),
+                               '<code>' . $hostname . '</code>'
+                       );
+                       if ( ! empty ( $errstr ) ) {
+                               /* translators: %s: error message */
                                $msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '<code>' . $errstr . '</code>' );
                                $msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '<code>' . $errstr . '</code>' );
+                       }
                        $msg .= '</p>';
                        $msg .= '</p>';
-                       $msg .= '<p>' . __( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a <code>*</code> hostname record pointing at your web server in your DNS configuration tool.' ) . '</p>';
+
+                       $msg .= '<p>' . sprintf(
+                               /* translators: %s: asterisk symbol (*) */
+                               __( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool.' ),
+                               '<code>*</code>'
+                       ) . '</p>';
+
                        $msg .= '<p>' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '</p>';
                        $msg .= '<p>' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '</p>';
+
                        return new WP_Error( 'no_wildcard_dns', $msg );
                }
        }
                        return new WP_Error( 'no_wildcard_dns', $msg );
                }
        }