2004-09-04 21:22:17 -04:00
< ? php
2008-10-01 21:03:26 -04:00
/**
2008-10-10 14:21:16 -04:00
* WordPress Administration Scheme API
2008-10-01 21:03:26 -04:00
*
* Here we keep the DB structure and option values .
*
* @ package WordPress
* @ subpackage Administration
*/
2015-05-28 22:06:31 -04:00
/**
* Declare these as global in case schema . php is included from a function .
*
2019-08-03 21:12:56 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-28 22:06:31 -04:00
* @ global array $wp_queries
* @ global string $charset_collate
*/
2011-10-05 20:21:24 -04:00
global $wpdb , $wp_queries , $charset_collate ;
2008-10-10 14:21:16 -04:00
/**
* The database character collate .
*/
2012-08-08 02:13:48 -04:00
$charset_collate = $wpdb -> get_charset_collate ();
2007-02-01 19:04:35 -05:00
2011-10-05 20:21:24 -04:00
/**
* Retrieve the SQL for creating database tables .
*
* @ since 3.3 . 0
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-28 22:06:31 -04:00
*
2011-10-05 20:21:24 -04:00
* @ param string $scope Optional . The tables for which to retrieve SQL . Can be all , global , ms_global , or blog tables . Defaults to all .
2016-01-27 22:35:27 -05:00
* @ param int $blog_id Optional . The site ID for which to retrieve SQL . Default is the current site ID .
2011-10-05 20:21:24 -04:00
* @ return string The SQL needed to create the requested tables .
*/
function wp_get_db_schema ( $scope = 'all' , $blog_id = null ) {
global $wpdb ;
2016-05-23 02:38:27 -04:00
$charset_collate = $wpdb -> get_charset_collate ();
2011-10-05 20:21:24 -04:00
2017-11-30 18:11:00 -05:00
if ( $blog_id && $blog_id != $wpdb -> blogid ) {
2011-10-05 20:21:24 -04:00
$old_blog_id = $wpdb -> set_blog_id ( $blog_id );
2017-11-30 18:11:00 -05:00
}
2011-10-05 20:21:24 -04:00
// Engage multisite if in the middle of turning it on from network.php.
$is_multisite = is_multisite () || ( defined ( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );
2015-02-05 23:51:22 -05:00
/*
* 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 ;
2011-10-05 20:21:24 -04:00
// Blog specific tables.
2015-09-24 23:59:27 -04:00
$blog_tables = " CREATE TABLE $wpdb->termmeta (
2018-09-05 08:50:24 -04:00
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 ))
2015-09-24 23:59:27 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> terms (
2009-03-31 17:57:51 -04:00
term_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
2008-08-05 14:27:02 -04:00
name varchar ( 200 ) NOT NULL default '' ,
2007-05-22 01:12:38 -04:00
slug varchar ( 200 ) NOT NULL default '' ,
term_group bigint ( 10 ) NOT NULL default 0 ,
PRIMARY KEY ( term_id ),
2015-02-05 23:51:22 -05:00
KEY slug ( slug ( $max_index_length )),
KEY name ( name ( $max_index_length ))
2007-05-22 01:12:38 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> term_taxonomy (
2009-03-31 17:57:51 -04:00
term_taxonomy_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
term_id bigint ( 20 ) unsigned NOT NULL default 0 ,
2007-05-22 01:12:38 -04:00
taxonomy varchar ( 32 ) NOT NULL default '' ,
description longtext NOT NULL ,
2009-03-31 17:57:51 -04:00
parent bigint ( 20 ) unsigned NOT NULL default 0 ,
2007-05-22 01:12:38 -04:00
count bigint ( 20 ) NOT NULL default 0 ,
2007-05-25 18:57:52 -04:00
PRIMARY KEY ( term_taxonomy_id ),
2009-03-06 03:26:45 -05:00
UNIQUE KEY term_id_taxonomy ( term_id , taxonomy ),
KEY taxonomy ( taxonomy )
2007-05-22 01:12:38 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> term_relationships (
2009-03-31 17:57:51 -04:00
object_id bigint ( 20 ) unsigned NOT NULL default 0 ,
term_taxonomy_id bigint ( 20 ) unsigned NOT NULL default 0 ,
2008-02-14 12:17:57 -05:00
term_order int ( 11 ) NOT NULL default 0 ,
2007-05-25 18:57:52 -04:00
PRIMARY KEY ( object_id , term_taxonomy_id ),
KEY term_taxonomy_id ( term_taxonomy_id )
2007-02-01 19:04:35 -05:00
) $charset_collate ;
2009-09-17 16:17:33 -04:00
CREATE TABLE $wpdb -> commentmeta (
2018-09-05 08:50:24 -04:00
meta_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
comment_id bigint ( 20 ) unsigned NOT NULL default '0' ,
meta_key varchar ( 255 ) default NULL ,
meta_value longtext ,
PRIMARY KEY ( meta_id ),
KEY comment_id ( comment_id ),
KEY meta_key ( meta_key ( $max_index_length ))
2009-09-17 16:17:33 -04:00
) $charset_collate ;
2004-09-04 21:22:17 -04:00
CREATE TABLE $wpdb -> comments (
2018-09-05 08:50:24 -04:00
comment_ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
comment_post_ID bigint ( 20 ) unsigned NOT NULL default '0' ,
comment_author tinytext NOT NULL ,
comment_author_email varchar ( 100 ) NOT NULL default '' ,
comment_author_url varchar ( 200 ) NOT NULL default '' ,
comment_author_IP varchar ( 100 ) NOT NULL default '' ,
comment_date datetime NOT NULL default '0000-00-00 00:00:00' ,
comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00' ,
comment_content text NOT NULL ,
comment_karma int ( 11 ) NOT NULL default '0' ,
comment_approved varchar ( 20 ) NOT NULL default '1' ,
comment_agent varchar ( 255 ) NOT NULL default '' ,
comment_type varchar ( 20 ) NOT NULL default '' ,
comment_parent bigint ( 20 ) unsigned NOT NULL default '0' ,
user_id bigint ( 20 ) unsigned NOT NULL default '0' ,
PRIMARY KEY ( comment_ID ),
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_author_email ( comment_author_email ( 10 ))
2007-02-01 19:04:35 -05:00
) $charset_collate ;
2004-09-04 21:22:17 -04:00
CREATE TABLE $wpdb -> links (
2018-09-05 08:50:24 -04:00
link_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
link_url varchar ( 255 ) NOT NULL default '' ,
link_name varchar ( 255 ) NOT NULL default '' ,
link_image varchar ( 255 ) NOT NULL default '' ,
link_target varchar ( 25 ) NOT NULL default '' ,
link_description varchar ( 255 ) NOT NULL default '' ,
link_visible varchar ( 20 ) NOT NULL default 'Y' ,
link_owner bigint ( 20 ) unsigned NOT NULL default '1' ,
link_rating int ( 11 ) NOT NULL default '0' ,
link_updated datetime NOT NULL default '0000-00-00 00:00:00' ,
link_rel varchar ( 255 ) NOT NULL default '' ,
link_notes mediumtext NOT NULL ,
link_rss varchar ( 255 ) NOT NULL default '' ,
PRIMARY KEY ( link_id ),
KEY link_visible ( link_visible )
2007-02-01 19:04:35 -05:00
) $charset_collate ;
2004-09-04 21:22:17 -04:00
CREATE TABLE $wpdb -> options (
2018-09-05 08:50:24 -04:00
option_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
option_name varchar ( 191 ) NOT NULL default '' ,
option_value longtext NOT NULL ,
autoload varchar ( 20 ) NOT NULL default 'yes' ,
PRIMARY KEY ( option_id ),
2019-08-15 03:13:55 -04:00
UNIQUE KEY option_name ( option_name ),
KEY autoload ( autoload )
2007-02-01 19:04:35 -05:00
) $charset_collate ;
2004-09-04 21:22:17 -04:00
CREATE TABLE $wpdb -> postmeta (
2018-09-05 08:50:24 -04:00
meta_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
post_id bigint ( 20 ) unsigned NOT NULL default '0' ,
meta_key varchar ( 255 ) default NULL ,
meta_value longtext ,
PRIMARY KEY ( meta_id ),
KEY post_id ( post_id ),
KEY meta_key ( meta_key ( $max_index_length ))
2007-02-01 19:04:35 -05:00
) $charset_collate ;
2004-09-04 21:22:17 -04:00
CREATE TABLE $wpdb -> posts (
2018-09-05 08:50:24 -04:00
ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
post_author bigint ( 20 ) unsigned NOT NULL default '0' ,
post_date datetime NOT NULL default '0000-00-00 00:00:00' ,
post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00' ,
post_content longtext NOT NULL ,
post_title text NOT NULL ,
post_excerpt text NOT NULL ,
post_status varchar ( 20 ) NOT NULL default 'publish' ,
comment_status varchar ( 20 ) NOT NULL default 'open' ,
ping_status varchar ( 20 ) NOT NULL default 'open' ,
post_password varchar ( 255 ) NOT NULL default '' ,
post_name varchar ( 200 ) NOT NULL default '' ,
to_ping text NOT NULL ,
pinged text NOT NULL ,
post_modified datetime NOT NULL default '0000-00-00 00:00:00' ,
post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00' ,
post_content_filtered longtext NOT NULL ,
post_parent bigint ( 20 ) unsigned NOT NULL default '0' ,
guid varchar ( 255 ) NOT NULL default '' ,
menu_order int ( 11 ) NOT NULL default '0' ,
post_type varchar ( 20 ) NOT NULL default 'post' ,
post_mime_type varchar ( 100 ) NOT NULL default '' ,
comment_count bigint ( 20 ) NOT NULL default '0' ,
PRIMARY KEY ( ID ),
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 )
2011-10-05 20:21:24 -04:00
) $charset_collate ; \n " ;
// Single site users table. The multisite flavor of the users table is handled below.
$users_single_table = " CREATE TABLE $wpdb->users (
2018-09-05 08:50:24 -04:00
ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
user_login varchar ( 60 ) 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_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 ),
KEY user_nicename ( user_nicename ),
KEY user_email ( user_email )
2011-10-05 20:21:24 -04:00
) $charset_collate ; \n " ;
// Multisite users table
$users_multi_table = " CREATE TABLE $wpdb->users (
2018-09-05 08:50:24 -04:00
ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
user_login varchar ( 60 ) 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_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 ),
KEY user_nicename ( user_nicename ),
KEY user_email ( user_email )
2011-10-05 20:21:24 -04:00
) $charset_collate ; \n " ;
2014-07-17 05:14:16 -04:00
// Usermeta.
2011-10-05 20:21:24 -04:00
$usermeta_table = " CREATE TABLE $wpdb->usermeta (
2018-09-05 08:50:24 -04:00
umeta_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
user_id bigint ( 20 ) unsigned NOT NULL default '0' ,
meta_key varchar ( 255 ) default NULL ,
meta_value longtext ,
PRIMARY KEY ( umeta_id ),
KEY user_id ( user_id ),
KEY meta_key ( meta_key ( $max_index_length ))
2011-10-05 20:21:24 -04:00
) $charset_collate ; \n " ;
// Global tables
2017-11-30 18:11:00 -05:00
if ( $is_multisite ) {
2011-10-05 20:21:24 -04:00
$global_tables = $users_multi_table . $usermeta_table ;
2017-11-30 18:11:00 -05:00
} else {
2011-10-05 20:21:24 -04:00
$global_tables = $users_single_table . $usermeta_table ;
2017-11-30 18:11:00 -05:00
}
2011-10-05 20:21:24 -04:00
// Multisite global tables.
$ms_global_tables = " CREATE TABLE $wpdb->blogs (
2018-09-05 08:50:24 -04:00
blog_id bigint ( 20 ) NOT NULL auto_increment ,
site_id bigint ( 20 ) NOT NULL default '0' ,
domain varchar ( 200 ) NOT NULL default '' ,
path varchar ( 100 ) NOT NULL default '' ,
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 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' ,
lang_id int ( 11 ) NOT NULL default '0' ,
PRIMARY KEY ( blog_id ),
KEY domain ( domain ( 50 ), path ( 5 )),
KEY lang_id ( lang_id )
2011-10-05 20:21:24 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> blog_versions (
2018-09-05 08:50:24 -04:00
blog_id bigint ( 20 ) NOT NULL default '0' ,
db_version varchar ( 20 ) NOT NULL default '' ,
last_updated datetime NOT NULL default '0000-00-00 00:00:00' ,
PRIMARY KEY ( blog_id ),
KEY db_version ( db_version )
2011-10-05 20:21:24 -04:00
) $charset_collate ;
2018-03-15 22:15:31 -04:00
CREATE TABLE $wpdb -> blogmeta (
2018-09-05 08:50:24 -04:00
meta_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
blog_id bigint ( 20 ) NOT NULL default '0' ,
meta_key varchar ( 255 ) default NULL ,
meta_value longtext ,
PRIMARY KEY ( meta_id ),
KEY meta_key ( meta_key ( $max_index_length )),
KEY blog_id ( blog_id )
2018-03-15 22:15:31 -04:00
) $charset_collate ;
2011-10-05 20:21:24 -04:00
CREATE TABLE $wpdb -> registration_log (
2018-09-05 08:50:24 -04:00
ID bigint ( 20 ) NOT NULL auto_increment ,
email varchar ( 255 ) NOT NULL default '' ,
IP varchar ( 30 ) NOT NULL default '' ,
blog_id bigint ( 20 ) NOT NULL default '0' ,
date_registered datetime NOT NULL default '0000-00-00 00:00:00' ,
PRIMARY KEY ( ID ),
KEY IP ( IP )
2011-10-05 20:21:24 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> site (
2018-09-05 08:50:24 -04:00
id bigint ( 20 ) NOT NULL auto_increment ,
domain varchar ( 200 ) NOT NULL default '' ,
path varchar ( 100 ) NOT NULL default '' ,
PRIMARY KEY ( id ),
KEY domain ( domain ( 140 ), path ( 51 ))
2011-10-05 20:21:24 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> sitemeta (
2018-09-05 08:50:24 -04:00
meta_id bigint ( 20 ) NOT NULL auto_increment ,
site_id bigint ( 20 ) NOT NULL default '0' ,
meta_key varchar ( 255 ) default NULL ,
meta_value longtext ,
PRIMARY KEY ( meta_id ),
KEY meta_key ( meta_key ( $max_index_length )),
KEY site_id ( site_id )
2011-10-05 20:21:24 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> signups (
2018-09-05 08:50:24 -04:00
signup_id bigint ( 20 ) NOT NULL auto_increment ,
domain varchar ( 200 ) NOT NULL default '' ,
path varchar ( 100 ) NOT NULL default '' ,
title longtext NOT NULL ,
user_login varchar ( 60 ) NOT NULL default '' ,
user_email varchar ( 100 ) NOT NULL default '' ,
registered datetime NOT NULL default '0000-00-00 00:00:00' ,
activated datetime NOT NULL default '0000-00-00 00:00:00' ,
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 user_email ( user_email ),
KEY user_login_email ( user_login , user_email ),
KEY domain_path ( domain ( 140 ), path ( 51 ))
2007-02-01 19:04:35 -05:00
) $charset_collate ; " ;
2004-09-04 21:22:17 -04:00
2011-10-05 20:21:24 -04:00
switch ( $scope ) {
2017-11-30 18:11:00 -05:00
case 'blog' :
2011-10-05 20:21:24 -04:00
$queries = $blog_tables ;
break ;
2017-11-30 18:11:00 -05:00
case 'global' :
2011-10-05 20:21:24 -04:00
$queries = $global_tables ;
2017-11-30 18:11:00 -05:00
if ( $is_multisite ) {
2011-10-05 20:21:24 -04:00
$queries .= $ms_global_tables ;
2017-11-30 18:11:00 -05:00
}
2011-10-05 20:21:24 -04:00
break ;
2017-11-30 18:11:00 -05:00
case 'ms_global' :
2011-10-05 20:21:24 -04:00
$queries = $ms_global_tables ;
break ;
2017-11-30 18:11:00 -05:00
case 'all' :
2014-05-30 13:58:15 -04:00
default :
2011-10-05 20:21:24 -04:00
$queries = $global_tables . $blog_tables ;
2017-11-30 18:11:00 -05:00
if ( $is_multisite ) {
2011-10-05 20:21:24 -04:00
$queries .= $ms_global_tables ;
2017-11-30 18:11:00 -05:00
}
2011-10-05 20:21:24 -04:00
break ;
}
2017-11-30 18:11:00 -05:00
if ( isset ( $old_blog_id ) ) {
2011-10-05 20:21:24 -04:00
$wpdb -> set_blog_id ( $old_blog_id );
2017-11-30 18:11:00 -05:00
}
2011-10-05 20:21:24 -04:00
return $queries ;
}
// Populate for back compat.
$wp_queries = wp_get_db_schema ( 'all' );
2008-10-01 21:03:26 -04:00
/**
* Create WordPress options and set the default values .
*
2008-10-10 14:21:16 -04:00
* @ since 1.5 . 0
2019-01-07 22:15:49 -05:00
* @ since 5.1 . 0 The $options parameter has been added .
2014-10-31 13:56:22 -04:00
*
2019-08-03 21:12:56 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
* @ global int $wp_db_version WordPress database version .
* @ global int $wp_current_db_version The old ( current ) database version .
2018-09-05 05:39:24 -04:00
*
* @ param array $options Optional . Custom option $key => $value pairs to use . Default empty array .
2008-10-01 21:03:26 -04:00
*/
2018-09-05 05:39:24 -04:00
function populate_options ( array $options = array () ) {
2013-11-12 22:23:10 -05:00
global $wpdb , $wp_db_version , $wp_current_db_version ;
2008-08-09 01:36:14 -04:00
2008-06-24 13:36:21 -04:00
$guessurl = wp_guess_url ();
2013-10-26 16:29:10 -04:00
/**
* Fires before creating WordPress options and populating their default values .
*
* @ since 2.6 . 0
*/
do_action ( 'populate_options' );
2008-08-09 01:36:14 -04:00
2017-11-30 18:11:00 -05:00
if ( ini_get ( 'safe_mode' ) ) {
2009-12-15 12:53:51 -05:00
// Safe mode can break mkdir() so use a flat structure by default.
2009-03-10 18:41:33 -04:00
$uploads_use_yearmonth_folders = 0 ;
2006-01-14 17:09:51 -05:00
} else {
2009-03-10 18:41:33 -04:00
$uploads_use_yearmonth_folders = 1 ;
2006-01-14 17:09:51 -05:00
}
2006-11-19 02:56:05 -05:00
2015-11-25 16:45:25 -05:00
// If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme.
2018-09-05 06:45:23 -04:00
$stylesheet = WP_DEFAULT_THEME ;
$template = WP_DEFAULT_THEME ;
2017-11-30 18:11:00 -05:00
$theme = wp_get_theme ( WP_DEFAULT_THEME );
2015-11-25 16:45:25 -05:00
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 ();
}
2011-11-10 16:06:57 -05:00
2012-01-29 15:04:11 -05:00
$timezone_string = '' ;
2017-11-30 18:11:00 -05:00
$gmt_offset = 0 ;
2017-11-26 18:57:55 -05:00
/*
* translators : default GMT offset or timezone string . Must be either a valid offset ( - 12 to 14 )
* or a valid timezone string ( America / New_York ) . See https :// secure . php . net / manual / en / timezones . php
* for all timezone strings supported by PHP .
*/
2018-09-05 06:45:23 -04:00
$offset_or_tz = _x ( '0' , 'default GMT offset or timezone string' ); // phpcs:ignore WordPress.WP.I18n.NoEmptyStrings
2017-11-30 18:11:00 -05:00
if ( is_numeric ( $offset_or_tz ) ) {
2012-01-29 15:04:11 -05:00
$gmt_offset = $offset_or_tz ;
2017-11-30 18:11:00 -05:00
} elseif ( $offset_or_tz && in_array ( $offset_or_tz , timezone_identifiers_list () ) ) {
2012-01-29 15:04:11 -05:00
$timezone_string = $offset_or_tz ;
2017-11-30 18:11:00 -05:00
}
2012-01-29 15:04:11 -05:00
2018-09-05 05:39:24 -04:00
$defaults = array (
2017-11-30 18:11:00 -05:00
'siteurl' => $guessurl ,
'home' => $guessurl ,
'blogname' => __ ( 'My Site' ),
/* translators: site tagline */
'blogdescription' => __ ( 'Just another WordPress site' ),
'users_can_register' => 0 ,
'admin_email' => 'you@example.com' ,
/* translators: default start of the week. 0 = Sunday, 1 = Monday */
'start_of_week' => _x ( '1' , 'start of week' ),
'use_balanceTags' => 0 ,
'use_smilies' => 1 ,
'require_name_email' => 1 ,
'comments_notify' => 1 ,
'posts_per_rss' => 10 ,
'rss_use_excerpt' => 0 ,
'mailserver_url' => 'mail.example.com' ,
'mailserver_login' => 'login@example.com' ,
'mailserver_pass' => 'password' ,
'mailserver_port' => 110 ,
'default_category' => 1 ,
'default_comment_status' => 'open' ,
'default_ping_status' => 'open' ,
'default_pingback_flag' => 1 ,
'posts_per_page' => 10 ,
/* translators: default date format, see https://secure.php.net/date */
'date_format' => __ ( 'F j, Y' ),
/* translators: default time format, see https://secure.php.net/date */
'time_format' => __ ( 'g:i a' ),
/* translators: links last updated date format, see https://secure.php.net/date */
'links_updated_date_format' => __ ( 'F j, Y g:i a' ),
'comment_moderation' => 0 ,
'moderation_notify' => 1 ,
'permalink_structure' => '' ,
'rewrite_rules' => '' ,
'hack_file' => 0 ,
'blog_charset' => 'UTF-8' ,
'moderation_keys' => '' ,
'active_plugins' => array (),
'category_base' => '' ,
'ping_sites' => 'http://rpc.pingomatic.com/' ,
'comment_max_links' => 2 ,
'gmt_offset' => $gmt_offset ,
// 1.5
'default_email_category' => 1 ,
'recently_edited' => '' ,
'template' => $template ,
'stylesheet' => $stylesheet ,
'comment_whitelist' => 1 ,
'blacklist_keys' => '' ,
'comment_registration' => 0 ,
'html_type' => 'text/html' ,
// 1.5.1
'use_trackback' => 0 ,
// 2.0
'default_role' => 'subscriber' ,
'db_version' => $wp_db_version ,
// 2.0.1
'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders ,
'upload_path' => '' ,
// 2.1
'blog_public' => '1' ,
'default_link_category' => 2 ,
'show_on_front' => 'posts' ,
// 2.2
'tag_base' => '' ,
// 2.5
'show_avatars' => '1' ,
'avatar_rating' => 'G' ,
'upload_url_path' => '' ,
'thumbnail_size_w' => 150 ,
'thumbnail_size_h' => 150 ,
'thumbnail_crop' => 1 ,
'medium_size_w' => 300 ,
'medium_size_h' => 300 ,
// 2.6
'avatar_default' => 'mystery' ,
// 2.7
'large_size_w' => 1024 ,
'large_size_h' => 1024 ,
'image_default_link_type' => 'none' ,
'image_default_size' => '' ,
'image_default_align' => '' ,
'close_comments_for_old_posts' => 0 ,
'close_comments_days_old' => 14 ,
'thread_comments' => 1 ,
'thread_comments_depth' => 5 ,
'page_comments' => 0 ,
'comments_per_page' => 50 ,
'default_comments_page' => 'newest' ,
'comment_order' => 'asc' ,
'sticky_posts' => array (),
'widget_categories' => array (),
'widget_text' => array (),
'widget_rss' => array (),
'uninstall_plugins' => array (),
// 2.8
'timezone_string' => $timezone_string ,
// 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 ,
2018-05-14 13:00:22 -04:00
// 4.9.6
'wp_page_for_privacy_policy' => 0 ,
2018-07-24 13:06:24 -04:00
// 4.9.8
2019-01-21 17:57:52 -05:00
'show_comments_cookies_opt_in' => 1 ,
2019-08-13 13:40:55 -04:00
// 5.3.0
'admin_email_lifespan' => ( time () + 6 * MONTH_IN_SECONDS ),
2009-03-10 18:41:33 -04:00
);
2011-11-22 16:50:50 -05:00
// 3.3
if ( ! is_multisite () ) {
2018-09-05 05:39:24 -04:00
$defaults [ 'initial_db_version' ] = ! empty ( $wp_current_db_version ) && $wp_current_db_version < $wp_db_version
2011-11-22 16:50:50 -05:00
? $wp_current_db_version : $wp_db_version ;
}
2010-01-18 19:04:25 -05:00
// 3.0 multisite
if ( is_multisite () ) {
2016-01-27 22:35:27 -05:00
/* translators: site tagline */
2018-09-05 05:39:24 -04:00
$defaults [ 'blogdescription' ] = sprintf ( __ ( 'Just another %s site' ), get_network () -> site_name );
$defaults [ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/' ;
2010-01-18 19:04:25 -05:00
}
2018-09-05 05:39:24 -04:00
$options = wp_parse_args ( $options , $defaults );
2009-03-10 21:07:12 -04:00
// Set autoload to no for these options
2012-03-02 15:13:35 -05:00
$fat_options = array ( 'moderation_keys' , 'recently_edited' , 'blacklist_keys' , 'uninstall_plugins' );
2009-03-10 21:07:12 -04:00
2017-11-30 18:11:00 -05:00
$keys = " ' " . implode ( " ', ' " , array_keys ( $options ) ) . " ' " ;
2018-09-05 08:50:24 -04:00
$existing_options = $wpdb -> get_col ( " SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys ) " ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
2009-03-10 18:41:33 -04:00
$insert = '' ;
foreach ( $options as $option => $value ) {
2017-11-30 18:11:00 -05:00
if ( in_array ( $option , $existing_options ) ) {
2009-03-10 18:41:33 -04:00
continue ;
2017-11-30 18:11:00 -05:00
}
if ( in_array ( $option , $fat_options ) ) {
2009-03-10 21:07:12 -04:00
$autoload = 'no' ;
2017-11-30 18:11:00 -05:00
} else {
2009-03-10 21:07:12 -04:00
$autoload = 'yes' ;
2017-11-30 18:11:00 -05:00
}
2009-03-10 21:07:12 -04:00
2017-11-30 18:11:00 -05:00
if ( is_array ( $value ) ) {
$value = serialize ( $value );
}
if ( ! empty ( $insert ) ) {
2009-03-17 22:43:45 -04:00
$insert .= ', ' ;
2017-11-30 18:11:00 -05:00
}
$insert .= $wpdb -> prepare ( '(%s, %s, %s)' , $option , $value , $autoload );
2009-03-10 18:41:33 -04:00
}
2017-11-30 18:11:00 -05:00
if ( ! empty ( $insert ) ) {
2018-09-05 08:50:24 -04:00
$wpdb -> query ( " INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
2017-11-30 18:11:00 -05:00
}
2009-03-10 18:41:33 -04:00
2014-07-17 05:14:16 -04:00
// In case it is set, but blank, update "home".
2017-11-30 18:11:00 -05:00
if ( ! __get_option ( 'home' ) ) {
update_option ( 'home' , $guessurl );
}
2008-12-09 13:03:31 -05:00
2014-07-17 05:14:16 -04:00
// Delete unused options.
2012-09-10 20:08:58 -04:00
$unusedoptions = array (
2017-11-30 18:11:00 -05:00
'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' ,
2012-09-10 20:08:58 -04:00
);
2017-11-30 18:11:00 -05:00
foreach ( $unusedoptions as $option ) {
delete_option ( $option );
}
2010-01-15 17:11:12 -05:00
2014-07-17 05:14:16 -04:00
// Delete obsolete magpie stuff.
2017-11-30 18:11:00 -05:00
$wpdb -> query ( " DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f] { 32}(_ts)? $ ' " );
2013-10-24 18:55:02 -04:00
2017-10-21 09:22:49 -04:00
// Clear expired transients
delete_expired_transients ( true );
2004-09-04 21:22:17 -04:00
}
2005-01-10 15:21:06 -05:00
2008-10-01 21:03:26 -04:00
/**
* Execute WordPress role creation for the various WordPress versions .
*
2008-10-10 14:21:16 -04:00
* @ since 2.0 . 0
2008-10-01 21:03:26 -04:00
*/
2005-07-11 18:39:50 -04:00
function populate_roles () {
2006-02-11 04:56:02 -05:00
populate_roles_160 ();
populate_roles_210 ();
2007-04-24 19:27:20 -04:00
populate_roles_230 ();
2008-02-02 02:57:51 -05:00
populate_roles_250 ();
2008-06-06 15:21:35 -04:00
populate_roles_260 ();
2008-08-04 17:01:09 -04:00
populate_roles_270 ();
2009-02-11 18:10:11 -05:00
populate_roles_280 ();
2010-01-18 17:21:36 -05:00
populate_roles_300 ();
2005-10-27 18:04:12 -04:00
}
2008-10-01 21:03:26 -04:00
/**
* Create the roles for WordPress 2.0
*
* @ since 2.0 . 0
*/
2005-10-27 18:04:12 -04:00
function populate_roles_160 () {
2005-09-20 19:48:28 -04:00
// Add roles
2008-02-19 15:28:54 -05:00
2017-11-30 18:11:00 -05:00
add_role ( 'administrator' , 'Administrator' );
add_role ( 'editor' , 'Editor' );
add_role ( 'author' , 'Author' );
add_role ( 'contributor' , 'Contributor' );
add_role ( 'subscriber' , 'Subscriber' );
2006-02-12 02:53:23 -05:00
2005-09-20 19:48:28 -04:00
// Add caps for Administrator role
2017-11-30 18:11:00 -05:00
$role = get_role ( 'administrator' );
$role -> add_cap ( 'switch_themes' );
$role -> add_cap ( 'edit_themes' );
$role -> add_cap ( 'activate_plugins' );
$role -> add_cap ( 'edit_plugins' );
$role -> add_cap ( 'edit_users' );
$role -> add_cap ( 'edit_files' );
$role -> add_cap ( 'manage_options' );
$role -> add_cap ( 'moderate_comments' );
$role -> add_cap ( 'manage_categories' );
$role -> add_cap ( 'manage_links' );
$role -> add_cap ( 'upload_files' );
$role -> add_cap ( 'import' );
$role -> add_cap ( 'unfiltered_html' );
$role -> add_cap ( 'edit_posts' );
$role -> add_cap ( 'edit_others_posts' );
$role -> add_cap ( 'edit_published_posts' );
$role -> add_cap ( 'publish_posts' );
$role -> add_cap ( 'edit_pages' );
$role -> add_cap ( 'read' );
$role -> add_cap ( 'level_10' );
$role -> add_cap ( 'level_9' );
$role -> add_cap ( 'level_8' );
$role -> add_cap ( 'level_7' );
$role -> add_cap ( 'level_6' );
$role -> add_cap ( 'level_5' );
$role -> add_cap ( 'level_4' );
$role -> add_cap ( 'level_3' );
$role -> add_cap ( 'level_2' );
$role -> add_cap ( 'level_1' );
$role -> add_cap ( 'level_0' );
2006-02-12 02:53:23 -05:00
2005-09-20 19:48:28 -04:00
// Add caps for Editor role
2017-11-30 18:11:00 -05:00
$role = get_role ( 'editor' );
$role -> add_cap ( 'moderate_comments' );
$role -> add_cap ( 'manage_categories' );
$role -> add_cap ( 'manage_links' );
$role -> add_cap ( 'upload_files' );
$role -> add_cap ( 'unfiltered_html' );
$role -> add_cap ( 'edit_posts' );
$role -> add_cap ( 'edit_others_posts' );
$role -> add_cap ( 'edit_published_posts' );
$role -> add_cap ( 'publish_posts' );
$role -> add_cap ( 'edit_pages' );
$role -> add_cap ( 'read' );
$role -> add_cap ( 'level_7' );
$role -> add_cap ( 'level_6' );
$role -> add_cap ( 'level_5' );
$role -> add_cap ( 'level_4' );
$role -> add_cap ( 'level_3' );
$role -> add_cap ( 'level_2' );
$role -> add_cap ( 'level_1' );
$role -> add_cap ( 'level_0' );
2006-02-12 02:53:23 -05:00
2005-09-20 19:48:28 -04:00
// Add caps for Author role
2017-11-30 18:11:00 -05:00
$role = get_role ( 'author' );
$role -> add_cap ( 'upload_files' );
$role -> add_cap ( 'edit_posts' );
$role -> add_cap ( 'edit_published_posts' );
$role -> add_cap ( 'publish_posts' );
$role -> add_cap ( 'read' );
$role -> add_cap ( 'level_2' );
$role -> add_cap ( 'level_1' );
$role -> add_cap ( 'level_0' );
2006-02-12 02:53:23 -05:00
2005-09-20 19:48:28 -04:00
// Add caps for Contributor role
2017-11-30 18:11:00 -05:00
$role = get_role ( 'contributor' );
$role -> add_cap ( 'edit_posts' );
$role -> add_cap ( 'read' );
$role -> add_cap ( 'level_1' );
$role -> add_cap ( 'level_0' );
2006-02-12 02:53:23 -05:00
2005-09-20 19:48:28 -04:00
// Add caps for Subscriber role
2017-11-30 18:11:00 -05:00
$role = get_role ( 'subscriber' );
$role -> add_cap ( 'read' );
$role -> add_cap ( 'level_0' );
2005-07-11 18:39:50 -04:00
}
2005-09-20 19:48:28 -04:00
2008-10-01 21:03:26 -04:00
/**
* Create and modify WordPress roles for WordPress 2.1 .
*
* @ since 2.1 . 0
*/
2006-02-11 04:56:02 -05:00
function populate_roles_210 () {
2017-11-30 18:11:00 -05:00
$roles = array ( 'administrator' , 'editor' );
foreach ( $roles as $role ) {
$role = get_role ( $role );
if ( empty ( $role ) ) {
2006-02-11 04:56:02 -05:00
continue ;
2017-11-30 18:11:00 -05:00
}
2006-02-11 04:56:02 -05:00
2017-11-30 18:11:00 -05:00
$role -> add_cap ( 'edit_others_pages' );
$role -> add_cap ( 'edit_published_pages' );
$role -> add_cap ( 'publish_pages' );
$role -> add_cap ( 'delete_pages' );
$role -> add_cap ( 'delete_others_pages' );
$role -> add_cap ( 'delete_published_pages' );
$role -> add_cap ( 'delete_posts' );
$role -> add_cap ( 'delete_others_posts' );
$role -> add_cap ( 'delete_published_posts' );
$role -> add_cap ( 'delete_private_posts' );
$role -> add_cap ( 'edit_private_posts' );
$role -> add_cap ( 'read_private_posts' );
$role -> add_cap ( 'delete_private_pages' );
$role -> add_cap ( 'edit_private_pages' );
$role -> add_cap ( 'read_private_pages' );
2006-02-11 04:56:02 -05:00
}
2006-02-12 02:53:23 -05:00
2017-11-30 18:11:00 -05:00
$role = get_role ( 'administrator' );
if ( ! empty ( $role ) ) {
$role -> add_cap ( 'delete_users' );
$role -> add_cap ( 'create_users' );
2006-06-05 12:52:21 -04:00
}
2017-11-30 18:11:00 -05:00
$role = get_role ( 'author' );
if ( ! empty ( $role ) ) {
$role -> add_cap ( 'delete_posts' );
$role -> add_cap ( 'delete_published_posts' );
2006-02-11 04:56:02 -05:00
}
2017-11-30 18:11:00 -05:00
$role = get_role ( 'contributor' );
if ( ! empty ( $role ) ) {
$role -> add_cap ( 'delete_posts' );
2006-02-11 04:56:02 -05:00
}
}
2008-10-01 21:03:26 -04:00
/**
* Create and modify WordPress roles for WordPress 2.3 .
*
* @ since 2.3 . 0
*/
2007-04-24 19:27:20 -04:00
function populate_roles_230 () {
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2007-06-13 22:25:30 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $role ) ) {
2007-04-24 19:27:20 -04:00
$role -> add_cap ( 'unfiltered_upload' );
}
}
2008-10-01 21:03:26 -04:00
/**
* Create and modify WordPress roles for WordPress 2.5 .
*
* @ since 2.5 . 0
*/
2008-02-02 02:57:51 -05:00
function populate_roles_250 () {
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2008-02-02 02:57:51 -05:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $role ) ) {
2008-02-02 02:57:51 -05:00
$role -> add_cap ( 'edit_dashboard' );
}
}
2008-10-01 21:03:26 -04:00
/**
* Create and modify WordPress roles for WordPress 2.6 .
*
* @ since 2.6 . 0
*/
2008-06-06 15:21:35 -04:00
function populate_roles_260 () {
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2008-06-06 15:21:35 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $role ) ) {
2008-06-06 15:21:35 -04:00
$role -> add_cap ( 'update_plugins' );
$role -> add_cap ( 'delete_plugins' );
}
}
2008-10-01 21:03:26 -04:00
/**
* Create and modify WordPress roles for WordPress 2.7 .
*
* @ since 2.7 . 0
*/
2008-08-04 17:01:09 -04:00
function populate_roles_270 () {
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2008-08-04 17:01:09 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $role ) ) {
2008-08-04 17:01:09 -04:00
$role -> add_cap ( 'install_plugins' );
2008-09-26 02:43:53 -04:00
$role -> add_cap ( 'update_themes' );
2008-08-04 17:01:09 -04:00
}
}
2009-02-11 18:10:11 -05:00
/**
* Create and modify WordPress roles for WordPress 2.8 .
*
* @ since 2.8 . 0
*/
function populate_roles_280 () {
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2009-02-11 18:10:11 -05:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $role ) ) {
2009-02-11 18:10:11 -05:00
$role -> add_cap ( 'install_themes' );
}
}
2010-01-18 17:21:36 -05:00
/**
2010-01-18 17:34:16 -05:00
* Create and modify WordPress roles for WordPress 3.0 .
2010-01-18 17:21:36 -05:00
*
2010-03-26 15:13:36 -04:00
* @ since 3.0 . 0
2010-01-18 17:21:36 -05:00
*/
function populate_roles_300 () {
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2010-01-18 17:21:36 -05:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $role ) ) {
2010-01-18 17:21:36 -05:00
$role -> add_cap ( 'update_core' );
2010-04-22 15:48:13 -04:00
$role -> add_cap ( 'list_users' );
2010-01-18 17:21:36 -05:00
$role -> add_cap ( 'remove_users' );
2010-04-21 13:43:53 -04:00
$role -> add_cap ( 'promote_users' );
2010-04-16 11:36:44 -04:00
$role -> add_cap ( 'edit_theme_options' );
2010-05-27 05:49:38 -04:00
$role -> add_cap ( 'delete_themes' );
2010-06-01 14:02:05 -04:00
$role -> add_cap ( 'export' );
2010-01-18 17:21:36 -05:00
}
}
2017-11-30 18:11:00 -05:00
if ( ! function_exists ( 'install_network' ) ) :
/**
* Install Network .
*
* @ since 3.0 . 0
*/
function install_network () {
if ( ! defined ( 'WP_INSTALLING_NETWORK' ) ) {
define ( 'WP_INSTALLING_NETWORK' , true );
}
2011-10-05 20:21:24 -04:00
2017-11-30 18:11:00 -05:00
dbDelta ( wp_get_db_schema ( 'global' ) );
}
2011-10-05 20:21:24 -04:00
endif ;
2010-01-18 19:04:25 -05:00
/**
2013-10-26 16:29:10 -04:00
* Populate network settings .
2010-01-18 19:04:25 -05:00
*
2010-03-26 15:13:36 -04:00
* @ since 3.0 . 0
2010-01-18 19:04:25 -05:00
*
2019-08-03 21:19:56 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-28 22:06:31 -04:00
* @ global object $current_site
2019-08-03 21:19:56 -04:00
* @ global WP_Rewrite $wp_rewrite WordPress rewrite component .
2015-05-28 22:06:31 -04:00
*
2016-01-09 20:26:25 -05:00
* @ 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 ' / ' .
2017-08-22 07:52:48 -04:00
* @ param bool $subdomain_install Optional . Whether the network is a subdomain installation or a subdirectory installation .
* Default false , meaning the network is a subdirectory installation .
* @ return bool | WP_Error True on success , or WP_Error on warning ( with the installation otherwise successful ,
2013-10-26 16:29:10 -04:00
* so the error code must be checked ) or failure .
2010-01-18 19:04:25 -05:00
*/
2010-03-10 03:17:07 -05:00
function populate_network ( $network_id = 1 , $domain = '' , $email = '' , $site_name = '' , $path = '/' , $subdomain_install = false ) {
2018-09-05 06:45:23 -04:00
global $wpdb , $current_site , $wp_rewrite ;
2010-01-18 19:04:25 -05:00
2010-03-10 20:51:24 -05:00
$errors = new WP_Error ();
2017-11-30 18:11:00 -05:00
if ( '' == $domain ) {
2010-03-10 20:51:24 -05:00
$errors -> add ( 'empty_domain' , __ ( 'You must provide a domain name.' ) );
2017-11-30 18:11:00 -05:00
}
if ( '' == $site_name ) {
2010-03-10 20:51:24 -05:00
$errors -> add ( 'empty_sitename' , __ ( 'You must provide a name for your network of sites.' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-18 19:04:25 -05:00
2014-07-17 05:14:16 -04:00
// Check for network collision.
2017-09-08 12:33:43 -04:00
$network_exists = false ;
if ( is_multisite () ) {
if ( get_network ( ( int ) $network_id ) ) {
$errors -> add ( 'siteid_exists' , __ ( 'The network already exists.' ) );
}
} else {
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.' ) );
}
}
2010-01-18 19:04:25 -05:00
2017-11-30 18:11:00 -05:00
if ( ! is_email ( $email ) ) {
2015-08-27 23:17:21 -04:00
$errors -> add ( 'invalid_email' , __ ( 'You must provide a valid email address.' ) );
2017-11-30 18:11:00 -05:00
}
2010-03-10 20:51:24 -05:00
2018-02-26 21:31:31 -05:00
if ( $errors -> has_errors () ) {
2010-03-10 20:51:24 -05:00
return $errors ;
2017-11-30 18:11:00 -05:00
}
2010-03-10 20:51:24 -05:00
2018-09-05 06:45:23 -04:00
if ( 1 == $network_id ) {
$wpdb -> insert (
$wpdb -> site ,
array (
'domain' => $domain ,
'path' => $path ,
)
);
$network_id = $wpdb -> insert_id ;
} else {
$wpdb -> insert (
$wpdb -> site ,
array (
'domain' => $domain ,
'path' => $path ,
'id' => $network_id ,
)
);
}
populate_network_meta (
$network_id ,
array (
'admin_email' => $email ,
'site_name' => $site_name ,
'subdomain_install' => $subdomain_install ,
)
);
$site_user = get_userdata ( ( int ) $wpdb -> get_var ( $wpdb -> prepare ( " SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d " , 'admin_user_id' , $network_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 = $wpdb -> insert_id ;
update_user_meta ( $site_user -> ID , 'source_domain' , $domain );
update_user_meta ( $site_user -> ID , 'primary_blog' , $current_site -> blog_id );
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 ();
if ( ! $subdomain_install ) {
return true ;
}
$vhost_ok = false ;
$errstr = '' ;
$hostname = substr ( md5 ( time () ), 0 , 6 ) . '.' . $domain ; // Very random hostname!
$page = wp_remote_get (
'http://' . $hostname ,
array (
'timeout' => 5 ,
'httpversion' => '1.1' ,
)
);
if ( is_wp_error ( $page ) ) {
$errstr = $page -> get_error_message ();
} elseif ( 200 == wp_remote_retrieve_response_code ( $page ) ) {
$vhost_ok = true ;
}
if ( ! $vhost_ok ) {
$msg = '<p><strong>' . __ ( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>' ;
$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 .= '</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>' ;
return new WP_Error ( 'no_wildcard_dns' , $msg );
}
}
return true ;
}
/**
* Creates WordPress network meta and sets the default values .
*
2019-01-07 22:17:49 -05:00
* @ since 5.1 . 0
2018-09-05 06:45:23 -04:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
* @ global int $wp_db_version WordPress database version .
*
* @ param int $network_id Network ID to populate meta for .
* @ param array $meta Optional . Custom meta $key => $value pairs to use . Default empty array .
*/
function populate_network_meta ( $network_id , array $meta = array () ) {
global $wpdb , $wp_db_version ;
$network_id = ( int ) $network_id ;
$email = ! empty ( $meta [ 'admin_email' ] ) ? $meta [ 'admin_email' ] : '' ;
$subdomain_install = isset ( $meta [ 'subdomain_install' ] ) ? ( int ) $meta [ 'subdomain_install' ] : 0 ;
2015-11-07 22:16:26 -05:00
// If a user with the provided email does not exist, default to the current user as the new network admin.
2018-09-05 06:45:23 -04:00
$site_user = ! empty ( $email ) ? get_user_by ( 'email' , $email ) : false ;
2015-11-07 22:16:26 -05:00
if ( false === $site_user ) {
$site_user = wp_get_current_user ();
}
2018-09-05 06:45:23 -04:00
if ( empty ( $email ) ) {
$email = $site_user -> user_email ;
}
2017-11-30 18:11:00 -05:00
$template = get_option ( 'template' );
$stylesheet = get_option ( 'stylesheet' );
2010-02-12 17:45:35 -05:00
$allowed_themes = array ( $stylesheet => true );
2015-11-25 16:45:25 -05:00
if ( $template != $stylesheet ) {
2010-02-12 17:45:35 -05:00
$allowed_themes [ $template ] = true ;
2015-11-25 16:45:25 -05:00
}
if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template ) {
2010-05-06 15:53:40 -04:00
$allowed_themes [ WP_DEFAULT_THEME ] = true ;
2015-11-25 16:45:25 -05:00
}
// If WP_DEFAULT_THEME doesn't exist, also whitelist the latest core default theme.
if ( ! wp_get_theme ( WP_DEFAULT_THEME ) -> exists () ) {
2018-09-05 06:45:23 -04:00
$core_default = WP_Theme :: get_core_default_theme ();
if ( $core_default ) {
2015-11-25 16:45:25 -05:00
$allowed_themes [ $core_default -> get_stylesheet () ] = true ;
}
}
2010-01-19 11:14:06 -05:00
2014-03-02 17:25:14 -05:00
wp_cache_delete ( 'networks_have_paths' , 'site-options' );
2017-11-30 18:11:00 -05:00
if ( ! is_multisite () ) {
2010-01-18 19:04:25 -05:00
$site_admins = array ( $site_user -> user_login );
2017-11-30 18:11:00 -05:00
$users = get_users (
array (
'fields' => array ( 'user_login' ),
'role' => 'administrator' ,
)
);
2010-01-18 19:04:25 -05:00
if ( $users ) {
foreach ( $users as $user ) {
2017-04-10 18:00:43 -04:00
$site_admins [] = $user -> user_login ;
2010-01-18 19:04:25 -05:00
}
2017-04-10 18:00:43 -04:00
$site_admins = array_unique ( $site_admins );
2010-01-18 19:04:25 -05:00
}
} else {
2015-10-07 13:11:25 -04:00
$site_admins = get_site_option ( 'site_admins' );
2010-01-18 19:04:25 -05:00
}
2010-01-27 14:13:00 -05:00
2015-05-06 05:12:25 -04:00
/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
2017-11-30 18:11:00 -05:00
$welcome_email = __ (
' Howdy USERNAME ,
2010-01-18 19:04:25 -05:00
2010-05-01 03:09:38 -04:00
Your new SITE_NAME site has been successfully set up at :
2010-01-18 19:04:25 -05:00
BLOG_URL
You can log in to the administrator account with the following information :
2014-10-01 21:28:16 -04:00
2010-01-18 19:04:25 -05:00
Username : USERNAME
Password : PASSWORD
2014-12-04 20:15:26 -05:00
Log in here : BLOG_URLwp - login . php
2010-01-18 19:04:25 -05:00
2011-10-04 12:09:24 -04:00
We hope you enjoy your new site . Thanks !
2010-01-18 19:04:25 -05:00
2017-11-30 18:11:00 -05:00
-- The Team @ SITE_NAME '
);
2010-01-27 14:13:00 -05:00
2018-09-05 08:50:24 -04:00
$misc_exts = array (
2014-07-17 05:14:16 -04:00
// Images.
2017-11-30 18:11:00 -05:00
'jpg' ,
'jpeg' ,
'png' ,
'gif' ,
2014-07-17 05:14:16 -04:00
// Video.
2017-11-30 18:11:00 -05:00
'mov' ,
'avi' ,
'mpg' ,
'3gp' ,
'3g2' ,
2014-07-17 05:14:16 -04:00
// "audio".
2017-11-30 18:11:00 -05:00
'midi' ,
'mid' ,
2014-07-17 05:14:16 -04:00
// Miscellaneous.
2017-11-30 18:11:00 -05:00
'pdf' ,
'doc' ,
'ppt' ,
'odt' ,
'pptx' ,
'docx' ,
'pps' ,
'ppsx' ,
'xls' ,
'xlsx' ,
'key' ,
2014-06-25 14:00:15 -04:00
);
2017-11-30 18:11:00 -05:00
$audio_exts = wp_get_audio_extensions ();
$video_exts = wp_get_video_extensions ();
2014-06-25 14:00:15 -04:00
$upload_filetypes = array_unique ( array_merge ( $misc_exts , $audio_exts , $video_exts ) );
2010-01-27 14:13:00 -05:00
$sitemeta = array (
2018-09-05 06:45:23 -04:00
'site_name' => __ ( 'My Network' ),
2017-11-30 18:11:00 -05:00
'admin_email' => $email ,
'admin_user_id' => $site_user -> ID ,
'registration' => 'none' ,
'upload_filetypes' => implode ( ' ' , $upload_filetypes ),
'blog_upload_space' => 100 ,
'fileupload_maxk' => 1500 ,
'site_admins' => $site_admins ,
'allowedthemes' => $allowed_themes ,
'illegal_names' => array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' , 'files' ),
'wpmu_upgrade_site' => $wp_db_version ,
'welcome_email' => $welcome_email ,
2015-11-11 15:55:26 -05:00
/* translators: %s: site link */
2019-01-07 23:30:50 -05:00
'first_post' => __ ( 'Welcome to %s. This is your first post. Edit or delete it, then start writing!' ),
2010-01-27 14:13:00 -05:00
// @todo - network admins should have a method of editing the network siteurl (used for cookie hash)
2017-11-30 18:11:00 -05:00
'siteurl' => get_option ( 'siteurl' ) . '/' ,
'add_new_users' => '0' ,
2015-10-07 13:11:25 -04:00
'upload_space_check_disabled' => is_multisite () ? get_site_option ( 'upload_space_check_disabled' ) : '1' ,
2018-09-05 06:45:23 -04:00
'subdomain_install' => $subdomain_install ,
2017-11-30 18:11:00 -05:00
'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 (),
'WPLANG' => get_locale (),
2010-01-27 14:13:00 -05:00
);
2017-11-30 18:11:00 -05:00
if ( ! $subdomain_install ) {
2010-05-08 14:37:38 -04:00
$sitemeta [ 'illegal_names' ][] = 'blog' ;
2017-11-30 18:11:00 -05:00
}
2010-01-27 14:13:00 -05:00
2018-09-05 06:45:23 -04:00
$sitemeta = wp_parse_args ( $meta , $sitemeta );
2013-09-12 16:49:09 -04:00
/**
2016-05-22 14:01:30 -04:00
* Filters meta for a network on creation .
2013-09-12 16:49:09 -04:00
*
* @ since 3.7 . 0
*
2013-10-26 16:29:10 -04:00
* @ param array $sitemeta Associative array of network meta keys and values to be inserted .
* @ param int $network_id ID of network to populate .
2013-09-12 16:49:09 -04:00
*/
$sitemeta = apply_filters ( 'populate_network_meta' , $sitemeta , $network_id );
2010-01-27 14:13:00 -05:00
$insert = '' ;
foreach ( $sitemeta as $meta_key => $meta_value ) {
2017-11-30 18:11:00 -05:00
if ( is_array ( $meta_value ) ) {
2010-01-27 14:13:00 -05:00
$meta_value = serialize ( $meta_value );
2017-11-30 18:11:00 -05:00
}
if ( ! empty ( $insert ) ) {
2010-01-27 14:13:00 -05:00
$insert .= ', ' ;
2017-11-30 18:11:00 -05:00
}
$insert .= $wpdb -> prepare ( '( %d, %s, %s)' , $network_id , $meta_key , $meta_value );
2010-01-27 14:13:00 -05:00
}
2018-09-05 08:50:24 -04:00
$wpdb -> query ( " INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
2010-01-18 19:04:25 -05:00
}
2018-09-05 07:02:24 -04:00
/**
* Creates WordPress site meta and sets the default values .
*
2019-01-07 22:18:50 -05:00
* @ since 5.1 . 0
2018-09-05 07:02:24 -04:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param int $site_id Site ID to populate meta for .
* @ param array $meta Optional . Custom meta $key => $value pairs to use . Default empty array .
*/
function populate_site_meta ( $site_id , array $meta = array () ) {
global $wpdb ;
$site_id = ( int ) $site_id ;
if ( ! is_site_meta_supported () ) {
return ;
}
if ( empty ( $meta ) ) {
return ;
}
2019-03-15 15:43:50 -04:00
/**
* Filters meta for a site on creation .
*
* @ since 5.2 . 0
*
* @ param array $meta Associative array of site meta keys and values to be inserted .
* @ param int $site_id ID of site to populate .
*/
$site_meta = apply_filters ( 'populate_site_meta' , $meta , $site_id );
2018-09-05 07:02:24 -04:00
$insert = '' ;
2019-03-15 15:43:50 -04:00
foreach ( $site_meta as $meta_key => $meta_value ) {
2018-09-05 07:02:24 -04:00
if ( is_array ( $meta_value ) ) {
$meta_value = serialize ( $meta_value );
}
if ( ! empty ( $insert ) ) {
$insert .= ', ' ;
}
$insert .= $wpdb -> prepare ( '( %d, %s, %s)' , $site_id , $meta_key , $meta_value );
}
2018-09-05 08:50:24 -04:00
$wpdb -> query ( " INSERT INTO $wpdb->blogmeta ( blog_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
2018-09-05 07:02:24 -04:00
2019-01-09 16:29:50 -05:00
wp_cache_delete ( $site_id , 'blog_meta' );
2019-01-08 03:48:48 -05:00
wp_cache_set_sites_last_changed ();
2018-09-05 07:02:24 -04:00
}