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 .
*
* @ global wpdb $wpdb
* @ 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-05-28 22:06:31 -04:00
* @ global wpdb $wpdb
*
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 .
2011-12-13 18:45:31 -05:00
* @ param int $blog_id Optional . The blog ID for which to retrieve SQL . Default is the current blog 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 ;
2011-10-17 22:48:07 -04:00
$charset_collate = '' ;
2011-10-05 20:21:24 -04:00
if ( ! empty ( $wpdb -> charset ) )
$charset_collate = " DEFAULT CHARACTER SET $wpdb->charset " ;
if ( ! empty ( $wpdb -> collate ) )
$charset_collate .= " COLLATE $wpdb->collate " ;
if ( $blog_id && $blog_id != $wpdb -> blogid )
$old_blog_id = $wpdb -> set_blog_id ( $blog_id );
// 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 (
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 (
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 (
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 ),
2009-09-21 14:09:21 -04:00
KEY comment_id ( comment_id ),
2015-02-05 23:51:22 -05:00
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 (
2005-02-04 17:55:11 -05:00
comment_ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
2009-03-31 17:57:51 -04:00
comment_post_ID bigint ( 20 ) unsigned NOT NULL default '0' ,
2004-09-04 21:22:17 -04:00
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' ,
2008-02-05 16:05:56 -05:00
comment_approved varchar ( 20 ) NOT NULL default '1' ,
2004-09-04 21:43:40 -04:00
comment_agent varchar ( 255 ) NOT NULL default '' ,
2004-09-05 03:44:58 -04:00
comment_type varchar ( 20 ) NOT NULL default '' ,
2009-04-01 12:10:14 -04:00
comment_parent bigint ( 20 ) unsigned NOT NULL default '0' ,
2009-03-31 17:57:51 -04:00
user_id bigint ( 20 ) unsigned NOT NULL default '0' ,
2004-09-04 21:22:17 -04:00
PRIMARY KEY ( comment_ID ),
2008-02-05 13:04:17 -05:00
KEY comment_post_ID ( comment_post_ID ),
2008-02-13 14:15:30 -05:00
KEY comment_approved_date_gmt ( comment_approved , comment_date_gmt ),
2010-02-19 12:56:40 -05:00
KEY comment_date_gmt ( comment_date_gmt ),
2014-07-16 11:54:16 -04:00
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 (
2009-03-31 17:57:51 -04:00
link_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
2004-09-04 21:22:17 -04:00
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 '' ,
2008-02-05 16:05:56 -05:00
link_visible varchar ( 20 ) NOT NULL default 'Y' ,
2009-04-01 12:10:14 -04:00
link_owner bigint ( 20 ) unsigned NOT NULL default '1' ,
2004-09-04 21:22:17 -04:00
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 '' ,
2005-12-09 14:04:12 -05:00
link_notes mediumtext NOT NULL ,
2004-09-04 21:22:17 -04:00
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 (
2009-03-31 17:57:51 -04:00
option_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
Schema: Increase the length of `wp_options.option_name`.
It's pretty easy to run over the `option_name` length, which causes undefined behaviour when inserting and retrieving options. Increasing the length from `VARCHAR(64)` to `VARCHAR(191)` significantly reduces the risk of this occurring.
Because `option_name` has a `UNIQUE` index, we can only increase it to 191 characters, rather than 255. The index can only use a prefix of 191 characters, so will incorrectly restrict long different strings that have the same prefix, if we make the column longer.
Props scribu, OriginalEXE, khromov, MikeHansenMe, netweb, pento.
Fixes #13310.
Built from https://develop.svn.wordpress.org/trunk@34030
git-svn-id: http://core.svn.wordpress.org/trunk@33999 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-10 21:26:24 -04:00
option_name varchar ( 191 ) NOT NULL default '' ,
2005-02-01 04:52:36 -05:00
option_value longtext NOT NULL ,
2008-02-05 16:05:56 -05:00
autoload varchar ( 20 ) NOT NULL default 'yes' ,
2009-11-19 11:42:07 -05:00
PRIMARY KEY ( option_id ),
2009-12-07 08:57:18 -05:00
UNIQUE KEY option_name ( option_name )
2007-02-01 19:04:35 -05:00
) $charset_collate ;
2004-09-04 21:22:17 -04:00
CREATE TABLE $wpdb -> postmeta (
2009-03-31 17:57:51 -04:00
meta_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
post_id bigint ( 20 ) unsigned NOT NULL default '0' ,
2004-09-04 21:22:17 -04:00
meta_key varchar ( 255 ) default NULL ,
2005-06-12 16:49:13 -04:00
meta_value longtext ,
2004-09-04 21:22:17 -04:00
PRIMARY KEY ( meta_id ),
KEY post_id ( post_id ),
2015-02-05 23:51:22 -05:00
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 (
2005-02-04 17:55:11 -05:00
ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
2009-03-31 17:57:51 -04:00
post_author bigint ( 20 ) unsigned NOT NULL default '0' ,
2004-09-04 21:22:17 -04:00
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' ,
2005-02-02 04:41:06 -05:00
post_content longtext NOT NULL ,
2004-09-04 21:22:17 -04:00
post_title text NOT NULL ,
2005-12-09 14:04:12 -05:00
post_excerpt text NOT NULL ,
2008-02-05 16:05:56 -05:00
post_status varchar ( 20 ) NOT NULL default 'publish' ,
comment_status varchar ( 20 ) NOT NULL default 'open' ,
ping_status varchar ( 20 ) NOT NULL default 'open' ,
2004-09-04 21:22:17 -04:00
post_password varchar ( 20 ) NOT NULL default '' ,
post_name varchar ( 200 ) NOT NULL default '' ,
2005-12-09 14:04:12 -05:00
to_ping text NOT NULL ,
pinged text NOT NULL ,
2004-09-04 21:22:17 -04:00
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' ,
2012-02-08 09:51:18 -05:00
post_content_filtered longtext NOT NULL ,
2009-03-31 17:57:51 -04:00
post_parent bigint ( 20 ) unsigned NOT NULL default '0' ,
2004-09-04 21:43:40 -04:00
guid varchar ( 255 ) NOT NULL default '' ,
2004-10-05 04:27:13 -04:00
menu_order int ( 11 ) NOT NULL default '0' ,
2006-04-01 19:33:10 -05:00
post_type varchar ( 20 ) NOT NULL default 'post' ,
2005-11-22 19:38:56 -05:00
post_mime_type varchar ( 100 ) NOT NULL default '' ,
2005-11-16 01:29:36 -05:00
comment_count bigint ( 20 ) NOT NULL default '0' ,
2004-09-04 21:22:17 -04:00
PRIMARY KEY ( ID ),
2015-02-05 23:51:22 -05:00
KEY post_name ( post_name ( $max_index_length )),
2008-10-22 18:03:41 -04:00
KEY type_status_date ( post_type , post_status , post_date , ID ),
2010-03-03 14:08:30 -05:00
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 (
2005-02-04 17:55:11 -05:00
ID bigint ( 20 ) unsigned NOT NULL auto_increment ,
user_login varchar ( 60 ) NOT NULL default '' ,
2004-09-04 21:22:17 -04:00
user_pass varchar ( 64 ) NOT NULL default '' ,
user_nicename varchar ( 50 ) NOT NULL default '' ,
user_email varchar ( 100 ) NOT NULL default '' ,
user_url varchar ( 100 ) NOT NULL default '' ,
2004-12-17 14:27:35 -05:00
user_registered datetime NOT NULL default '0000-00-00 00:00:00' ,
2004-09-04 21:22:17 -04:00
user_activation_key varchar ( 60 ) NOT NULL default '' ,
user_status int ( 11 ) NOT NULL default '0' ,
2005-06-12 16:49:13 -04:00
display_name varchar ( 250 ) NOT NULL default '' ,
2004-09-04 21:22:17 -04:00
PRIMARY KEY ( ID ),
2007-09-11 14:13:56 -04:00
KEY user_login_key ( user_login ),
KEY user_nicename ( user_nicename )
2011-10-05 20:21:24 -04:00
) $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_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_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 )
) $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 (
2009-03-31 17:57:51 -04:00
umeta_id bigint ( 20 ) unsigned NOT NULL auto_increment ,
user_id bigint ( 20 ) unsigned NOT NULL default '0' ,
2005-06-12 16:49:13 -04:00
meta_key varchar ( 255 ) default NULL ,
meta_value longtext ,
PRIMARY KEY ( umeta_id ),
KEY user_id ( user_id ),
2015-02-05 23:51:22 -05:00
KEY meta_key ( meta_key ( $max_index_length ))
2011-10-05 20:21:24 -04:00
) $charset_collate ; \n " ;
// Global tables
if ( $is_multisite )
$global_tables = $users_multi_table . $usermeta_table ;
else
$global_tables = $users_single_table . $usermeta_table ;
// Multisite global tables.
$ms_global_tables = " CREATE TABLE $wpdb->blogs (
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' ,
2013-09-15 19:12:11 -04:00
archived tinyint ( 2 ) NOT NULL default '0' ,
2011-10-05 20:21:24 -04:00
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 )
) $charset_collate ;
CREATE TABLE $wpdb -> blog_versions (
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 )
) $charset_collate ;
CREATE TABLE $wpdb -> registration_log (
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 )
) $charset_collate ;
CREATE TABLE $wpdb -> site (
id bigint ( 20 ) NOT NULL auto_increment ,
domain varchar ( 200 ) NOT NULL default '' ,
path varchar ( 100 ) NOT NULL default '' ,
PRIMARY KEY ( id ),
2015-02-05 23:51:22 -05:00
KEY domain ( domain ( 140 ), path ( 51 ))
2011-10-05 20:21:24 -04:00
) $charset_collate ;
CREATE TABLE $wpdb -> sitemeta (
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 ),
2015-02-05 23:51:22 -05:00
KEY meta_key ( meta_key ( $max_index_length )),
2011-10-05 20:21:24 -04:00
KEY site_id ( site_id )
) $charset_collate ;
CREATE TABLE $wpdb -> signups (
2013-08-30 00:30:08 -04:00
signup_id bigint ( 20 ) NOT NULL auto_increment ,
2011-10-05 20:21:24 -04:00
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 ,
2013-08-30 00:30:08 -04:00
PRIMARY KEY ( signup_id ),
2011-10-05 20:21:24 -04:00
KEY activation_key ( activation_key ),
2013-09-12 16:16:11 -04:00
KEY user_email ( user_email ),
2013-08-30 00:30:08 -04:00
KEY user_login_email ( user_login , user_email ),
2015-02-05 23:51:22 -05:00
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 ) {
case 'blog' :
$queries = $blog_tables ;
break ;
case 'global' :
$queries = $global_tables ;
if ( $is_multisite )
$queries .= $ms_global_tables ;
break ;
case 'ms_global' :
$queries = $ms_global_tables ;
break ;
case 'all' :
2014-05-30 13:58:15 -04:00
default :
2011-10-05 20:21:24 -04:00
$queries = $global_tables . $blog_tables ;
if ( $is_multisite )
$queries .= $ms_global_tables ;
break ;
}
if ( isset ( $old_blog_id ) )
$wpdb -> set_blog_id ( $old_blog_id );
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
2014-10-31 13:56:22 -04:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-28 17:41:30 -04:00
* @ global int $wp_db_version
* @ global int $wp_current_db_version
2008-10-01 21:03:26 -04:00
*/
2004-09-04 21:22:17 -04:00
function populate_options () {
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
2006-01-14 17:09:51 -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
2011-11-10 16:06:57 -05:00
$template = WP_DEFAULT_THEME ;
// If default theme is a child theme, we need to get its template
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
$theme = wp_get_theme ( $template );
2012-04-04 21:05:49 -04:00
if ( ! $theme -> errors () )
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
$template = $theme -> get_template ();
2011-11-10 16:06:57 -05:00
2012-01-29 15:04:11 -05:00
$timezone_string = '' ;
$gmt_offset = 0 ;
/* 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 http :// us3 . php . net / manual / en / timezones . php
for all timezone strings supported by PHP .
*/
2012-01-29 18:43:14 -05:00
$offset_or_tz = _x ( '0' , 'default GMT offset or timezone string' );
2012-01-29 15:04:11 -05:00
if ( is_numeric ( $offset_or_tz ) )
$gmt_offset = $offset_or_tz ;
elseif ( $offset_or_tz && in_array ( $offset_or_tz , timezone_identifiers_list () ) )
$timezone_string = $offset_or_tz ;
2009-03-10 18:41:33 -04:00
$options = array (
'siteurl' => $guessurl ,
2014-05-05 17:57:14 -04:00
'home' => $guessurl ,
2010-04-29 23:17:49 -04:00
'blogname' => __ ( 'My Site' ),
2010-02-01 15:01:14 -05:00
/* translators: blog tagline */
'blogdescription' => __ ( 'Just another WordPress site' ),
2009-03-10 18:41:33 -04:00
'users_can_register' => 0 ,
'admin_email' => 'you@example.com' ,
2012-01-28 23:21:53 -05:00
/* translators: default start of the week. 0 = Sunday, 1 = Monday */
'start_of_week' => _x ( '1' , 'start of week' ),
2009-03-10 18:41:33 -04:00
'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 ,
2009-03-12 23:53:39 -04:00
/* translators: default date format, see http://php.net/date */
2009-03-10 18:41:33 -04:00
'date_format' => __ ( 'F j, Y' ),
2009-03-12 23:53:39 -04:00
/* translators: default time format, see http://php.net/date */
2009-03-10 18:41:33 -04:00
'time_format' => __ ( 'g:i a' ),
2009-03-12 23:53:39 -04:00
/* translators: links last updated date format, see http://php.net/date */
2009-03-10 18:41:33 -04:00
'links_updated_date_format' => __ ( 'F j, Y g:i a' ),
'comment_moderation' => 0 ,
'moderation_notify' => 1 ,
'permalink_structure' => '' ,
'gzipcompression' => 0 ,
'blog_charset' => 'UTF-8' ,
'moderation_keys' => '' ,
'active_plugins' => array (),
'category_base' => '' ,
'ping_sites' => 'http://rpc.pingomatic.com/' ,
'advanced_edit' => 0 ,
'comment_max_links' => 2 ,
2012-01-29 15:04:11 -05:00
'gmt_offset' => $gmt_offset ,
2009-03-10 18:41:33 -04:00
// 1.5
'default_email_category' => 1 ,
'recently_edited' => '' ,
2011-11-10 16:06:57 -05:00
'template' => $template ,
2010-03-17 13:42:49 -04:00
'stylesheet' => WP_DEFAULT_THEME ,
2009-03-10 18:41:33 -04:00
'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 ,
2009-12-15 12:53:51 -05:00
'upload_path' => '' ,
2009-03-10 18:41:33 -04:00
2006-02-18 02:40:43 -05:00
// 2.1
2009-03-10 18:41:33 -04:00
'blog_public' => '1' ,
'default_link_category' => 2 ,
'show_on_front' => 'posts' ,
2006-01-14 17:09:51 -05:00
2007-03-31 05:19:32 -04:00
// 2.2
2009-03-10 18:41:33 -04:00
'tag_base' => '' ,
2007-03-31 05:19:32 -04:00
2008-02-07 01:07:12 -05:00
// 2.5
2009-03-10 18:41:33 -04:00
'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 ,
2008-02-07 01:07:12 -05:00
2008-05-02 20:56:16 -04:00
// 2.6
2009-03-10 18:41:33 -04:00
'avatar_default' => 'mystery' ,
2008-08-09 01:36:14 -04:00
2008-08-15 11:40:35 -04:00
// 2.7
2009-03-10 18:41:33 -04:00
'large_size_w' => 1024 ,
'large_size_h' => 1024 ,
2015-08-25 08:13:23 -04:00
'image_default_link_type' => 'none' ,
2009-03-10 18:41:33 -04:00
'image_default_size' => '' ,
'image_default_align' => '' ,
'close_comments_for_old_posts' => 0 ,
'close_comments_days_old' => 14 ,
2010-02-20 20:02:00 -05:00
'thread_comments' => 1 ,
2009-03-10 18:41:33 -04:00
'thread_comments_depth' => 5 ,
'comments_per_page' => 50 ,
'default_comments_page' => 'newest' ,
'comment_order' => 'asc' ,
'sticky_posts' => array (),
'widget_categories' => array (),
'widget_text' => array (),
2009-05-11 13:31:30 -04:00
'widget_rss' => array (),
2012-03-02 15:13:35 -05:00
'uninstall_plugins' => array (),
2009-05-24 19:47:49 -04:00
2009-05-11 13:31:30 -04:00
// 2.8
2012-01-29 15:04:11 -05:00
'timezone_string' => $timezone_string ,
2009-10-13 13:04:22 -04:00
2010-06-11 13:04:06 -04:00
// 3.0
'page_for_posts' => 0 ,
'page_on_front' => 0 ,
2010-12-19 00:36:11 -05:00
// 3.1
'default_post_format' => 0 ,
2012-08-13 12:18:42 -04:00
// 3.5
'link_manager_enabled' => 0 ,
2015-08-17 10:29:25 -04:00
// 4.3.0
'finished_splitting_shared_terms' => 1 ,
2009-03-10 18:41:33 -04:00
);
2011-11-22 16:50:50 -05:00
// 3.3
if ( ! is_multisite () ) {
2011-11-22 17:05:42 -05:00
$options [ '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 () ) {
2010-02-01 15:01:14 -05:00
/* translators: blog tagline */
2013-11-12 22:23:10 -05:00
$options [ 'blogdescription' ] = sprintf ( __ ( 'Just another %s site' ), get_current_site () -> site_name );
2010-01-19 11:14:06 -05:00
$options [ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/' ;
2010-01-18 19:04:25 -05:00
}
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
2013-07-09 15:14:33 -04:00
$keys = " ' " . implode ( " ', ' " , array_keys ( $options ) ) . " ' " ;
$existing_options = $wpdb -> get_col ( " SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys ) " );
2009-03-10 18:41:33 -04:00
$insert = '' ;
foreach ( $options as $option => $value ) {
if ( in_array ( $option , $existing_options ) )
continue ;
2009-03-10 21:07:12 -04:00
if ( in_array ( $option , $fat_options ) )
$autoload = 'no' ;
else
$autoload = 'yes' ;
2009-03-26 13:59:27 -04:00
if ( is_array ( $value ) )
$value = serialize ( $value );
2009-03-10 18:41:33 -04:00
if ( ! empty ( $insert ) )
2009-03-17 22:43:45 -04:00
$insert .= ', ' ;
2013-03-01 12:01:01 -05:00
$insert .= $wpdb -> prepare ( " (%s, %s, %s) " , $option , $value , $autoload );
2009-03-10 18:41:33 -04:00
}
if ( ! empty ( $insert ) )
2009-03-10 21:07:12 -04:00
$wpdb -> query ( " INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert );
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".
2009-03-10 18:41:33 -04: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 (
'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' ,
2014-04-02 23:10:15 -04:00
'links_recently_updated_time' , 'links_recently_updated_prepend' , 'links_recently_updated_append' ,
2012-09-10 20:08:58 -04:00
'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' ,
2012-09-11 16:11:39 -04:00
'wporg_popular_tags' , 'what_to_show' , 'rss_language' , 'language' , 'enable_xmlrpc' , 'enable_app' ,
2015-09-25 16:50:25 -04:00
'embed_autourls' , 'default_post_edit_rows' , 'page_comments' ,
2012-09-10 20:08:58 -04:00
);
2010-06-19 03:28:27 -04:00
foreach ( $unusedoptions as $option )
2004-09-04 21:22:17 -04:00
delete_option ( $option );
2010-01-15 17:11:12 -05:00
2014-07-17 05:14:16 -04:00
// Delete obsolete magpie stuff.
2009-11-18 17:04:07 -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
2014-07-17 05:14:16 -04:00
/*
* 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 .
*/
2013-10-24 18:55:02 -04:00
$time = time ();
2014-06-09 20:44:15 -04:00
$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 ) );
2013-10-24 18:55:02 -04:00
if ( is_main_site () && is_main_network () ) {
2014-06-09 20:44:15 -04:00
$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 ) );
}
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
// Dummy gettext calls to get strings in the catalog.
2009-03-10 19:02:29 -04:00
/* translators: user role */
_x ( 'Administrator' , 'User role' );
/* translators: user role */
_x ( 'Editor' , 'User role' );
/* translators: user role */
_x ( 'Author' , 'User role' );
/* translators: user role */
_x ( 'Contributor' , 'User role' );
/* translators: user role */
_x ( 'Subscriber' , 'User role' );
2008-02-19 15:28:54 -05:00
2009-03-10 19:02:29 -04: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
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2005-09-20 19:48:28 -04:00
$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' );
2005-09-24 01:38:09 -04:00
$role -> add_cap ( 'level_5' );
2005-09-20 19:48:28 -04:00
$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
2013-05-28 13:06:39 -04:00
$role = get_role ( 'editor' );
2005-09-20 19:48:28 -04:00
$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' );
2005-09-24 01:38:09 -04:00
$role -> add_cap ( 'level_5' );
2005-09-20 19:48:28 -04:00
$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
2013-05-28 13:06:39 -04:00
$role = get_role ( 'author' );
2005-09-20 19:48:28 -04:00
$role -> add_cap ( 'upload_files' );
$role -> add_cap ( 'edit_posts' );
2005-11-30 02:47:22 -05:00
$role -> add_cap ( 'edit_published_posts' );
2005-09-20 19:48:28 -04:00
$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
2013-05-28 13:06:39 -04:00
$role = get_role ( 'contributor' );
2005-09-20 19:48:28 -04:00
$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
2013-05-28 13:06:39 -04:00
$role = get_role ( 'subscriber' );
2005-09-20 19:48:28 -04:00
$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 () {
$roles = array ( 'administrator' , 'editor' );
foreach ( $roles as $role ) {
2013-05-28 13:06:39 -04:00
$role = get_role ( $role );
2006-02-11 04:56:02 -05:00
if ( empty ( $role ) )
continue ;
$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' );
2006-05-11 19:13:35 -04:00
$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
2013-05-28 13:06:39 -04:00
$role = get_role ( 'administrator' );
2006-06-05 12:52:21 -04:00
if ( ! empty ( $role ) ) {
$role -> add_cap ( 'delete_users' );
$role -> add_cap ( 'create_users' );
}
2013-05-28 13:06:39 -04:00
$role = get_role ( 'author' );
2006-02-11 04:56:02 -05:00
if ( ! empty ( $role ) ) {
$role -> add_cap ( 'delete_posts' );
2006-02-12 02:53:23 -05:00
$role -> add_cap ( 'delete_published_posts' );
2006-02-11 04:56:02 -05:00
}
2013-05-28 13:06:39 -04:00
$role = get_role ( 'contributor' );
2006-02-11 04:56:02 -05:00
if ( ! empty ( $role ) ) {
$role -> add_cap ( 'delete_posts' );
}
}
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
2007-04-24 19:27:20 -04:00
if ( ! empty ( $role ) ) {
$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
if ( ! empty ( $role ) ) {
$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
if ( ! empty ( $role ) ) {
$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
if ( ! empty ( $role ) ) {
$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
if ( ! empty ( $role ) ) {
$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
if ( ! empty ( $role ) ) {
$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' );
2012-10-25 16:18:24 -04:00
2014-07-17 05:14:16 -04:00
/*
* Never used , will be removed . create_users or promote_users
* is the capability you ' re looking for .
*/
2010-04-21 12:33:13 -04:00
$role -> add_cap ( 'add_users' );
2012-10-25 16:18:24 -04:00
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
}
}
2011-10-05 20:21:24 -04:00
/**
* Install Network .
*
* @ since 3.0 . 0
*
*/
if ( ! function_exists ( 'install_network' ) ) :
function install_network () {
if ( ! defined ( 'WP_INSTALLING_NETWORK' ) )
define ( 'WP_INSTALLING_NETWORK' , true );
dbDelta ( wp_get_db_schema ( 'global' ) );
}
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
*
2015-05-28 22:06:31 -04:00
* @ global wpdb $wpdb
* @ global object $current_site
* @ global int $wp_db_version
* @ global WP_Rewrite $wp_rewrite
*
2013-10-26 16:29:10 -04:00
* @ param int $network_id ID of network to populate .
2010-03-10 20:51:24 -05:00
* @ return bool | WP_Error True on success , or WP_Error on warning ( with the install 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 ) {
2012-03-05 12:39:26 -05:00
global $wpdb , $current_site , $wp_db_version , $wp_rewrite ;
2010-01-18 19:04:25 -05:00
2010-03-10 20:51:24 -05:00
$errors = new WP_Error ();
if ( '' == $domain )
$errors -> add ( 'empty_domain' , __ ( 'You must provide a domain name.' ) );
if ( '' == $site_name )
$errors -> add ( 'empty_sitename' , __ ( 'You must provide a name for your network of sites.' ) );
2010-01-18 19:04:25 -05:00
2014-07-17 05:14:16 -04:00
// Check for network collision.
2010-03-10 20:51:24 -05:00
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
2011-08-05 12:57:31 -04:00
$site_user = get_user_by ( 'email' , $email );
2010-03-10 20:51:24 -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.' ) );
2010-03-10 20:51:24 -05:00
if ( $errors -> get_error_code () )
return $errors ;
2014-07-17 05:14:16 -04:00
// Set up site tables.
2010-01-18 19:04:25 -05:00
$template = get_option ( 'template' );
$stylesheet = get_option ( 'stylesheet' );
2010-02-12 17:45:35 -05:00
$allowed_themes = array ( $stylesheet => true );
2010-01-19 11:14:06 -05:00
if ( $template != $stylesheet )
2010-02-12 17:45:35 -05:00
$allowed_themes [ $template ] = true ;
2010-05-06 15:53:40 -04:00
if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template )
$allowed_themes [ WP_DEFAULT_THEME ] = true ;
2010-01-19 11:14:06 -05:00
2010-01-27 14:13:00 -05:00
if ( 1 == $network_id ) {
$wpdb -> insert ( $wpdb -> site , array ( 'domain' => $domain , 'path' => $path ) );
$network_id = $wpdb -> insert_id ;
} else {
2010-06-12 01:16:21 -04:00
$wpdb -> insert ( $wpdb -> site , array ( 'domain' => $domain , 'path' => $path , 'id' => $network_id ) );
2010-01-18 19:04:25 -05:00
}
2010-01-27 14:13:00 -05:00
2014-03-02 17:25:14 -05:00
wp_cache_delete ( 'networks_have_paths' , 'site-options' );
2010-01-18 19:04:25 -05:00
if ( ! is_multisite () ) {
$site_admins = array ( $site_user -> user_login );
2010-12-16 19:11:21 -05:00
$users = get_users ( array ( 'fields' => array ( 'ID' , 'user_login' ) ) );
2010-01-18 19:04:25 -05:00
if ( $users ) {
foreach ( $users as $user ) {
2010-01-19 11:14:06 -05:00
if ( is_super_admin ( $user -> ID ) && ! in_array ( $user -> user_login , $site_admins ) )
2010-01-18 19:04:25 -05:00
$site_admins [] = $user -> user_login ;
}
}
} else {
$site_admins = get_site_option ( 'site_admins' );
}
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. */
2015-02-10 02:47:27 -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
2010-01-27 14:13:00 -05:00
-- The Team @ SITE_NAME ' );
2014-06-25 14:00:15 -04:00
$misc_exts = array (
2014-07-17 05:14:16 -04:00
// Images.
2014-06-25 14:00:15 -04:00
'jpg' , 'jpeg' , 'png' , 'gif' ,
2014-07-17 05:14:16 -04:00
// Video.
2014-06-25 14:00:15 -04:00
'mov' , 'avi' , 'mpg' , '3gp' , '3g2' ,
2014-07-17 05:14:16 -04:00
// "audio".
2014-06-25 14:00:15 -04:00
'midi' , 'mid' ,
2014-07-17 05:14:16 -04:00
// Miscellaneous.
2014-06-25 14:00:15 -04:00
'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 ) );
2010-01-27 14:13:00 -05:00
$sitemeta = array (
2010-05-24 15:18:30 -04:00
'site_name' => $site_name ,
2010-01-27 14:13:00 -05:00
'admin_email' => $site_user -> user_email ,
'admin_user_id' => $site_user -> ID ,
'registration' => 'none' ,
2014-06-25 14:00:15 -04:00
'upload_filetypes' => implode ( ' ' , $upload_filetypes ),
2012-03-10 17:07:17 -05:00
'blog_upload_space' => 100 ,
2010-01-27 14:13:00 -05:00
'fileupload_maxk' => 1500 ,
'site_admins' => $site_admins ,
'allowedthemes' => $allowed_themes ,
2010-05-15 18:18:40 -04:00
'illegal_names' => array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' , 'files' ),
2010-01-27 14:13:00 -05:00
'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!' ),
// @todo - network admins should have a method of editing the network siteurl (used for cookie hash)
2010-03-18 19:35:04 -04:00
'siteurl' => get_option ( 'siteurl' ) . '/' ,
2010-03-05 16:01:08 -05:00
'add_new_users' => '0' ,
2012-09-12 11:48:40 -04:00
'upload_space_check_disabled' => is_multisite () ? get_site_option ( 'upload_space_check_disabled' ) : '1' ,
2010-03-10 03:34:42 -05:00
'subdomain_install' => intval ( $subdomain_install ),
2011-11-22 16:50:50 -05:00
'global_terms_enabled' => global_terms_enabled () ? '1' : '0' ,
2012-09-11 18:22:20 -04:00
'ms_files_rewriting' => is_multisite () ? get_site_option ( 'ms_files_rewriting' ) : '0' ,
2011-11-22 16:50:50 -05:00
'initial_db_version' => get_option ( 'initial_db_version' ),
2011-11-28 15:35:36 -05:00
'active_sitewide_plugins' => array (),
2012-10-17 16:29:53 -04:00
'WPLANG' => get_locale (),
2010-01-27 14:13:00 -05:00
);
2010-06-23 01:10:45 -04:00
if ( ! $subdomain_install )
2010-05-08 14:37:38 -04:00
$sitemeta [ 'illegal_names' ][] = 'blog' ;
2010-01-27 14:13:00 -05:00
2013-09-12 16:49:09 -04:00
/**
* Filter meta for a network on creation .
*
* @ 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 ) {
if ( is_array ( $meta_value ) )
$meta_value = serialize ( $meta_value );
if ( ! empty ( $insert ) )
$insert .= ', ' ;
2013-03-01 12:01:01 -05:00
$insert .= $wpdb -> prepare ( " ( %d, %s, %s) " , $network_id , $meta_key , $meta_value );
2010-01-27 14:13:00 -05:00
}
$wpdb -> query ( " INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert );
2010-01-18 19:04:25 -05:00
2014-07-17 05:14:16 -04:00
/*
* 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 .
*/
2012-10-15 17:41:29 -04:00
if ( ! is_multisite () ) {
$current_site = new stdClass ;
$current_site -> domain = $domain ;
$current_site -> path = $path ;
$current_site -> site_name = ucfirst ( $domain );
2013-08-16 16:08:09 -04:00
$wpdb -> insert ( $wpdb -> blogs , array ( 'site_id' => $network_id , 'blog_id' => 1 , 'domain' => $domain , 'path' => $path , 'registered' => current_time ( 'mysql' ) ) );
2012-10-15 17:41:29 -04:00
$current_site -> blog_id = $blog_id = $wpdb -> insert_id ;
2010-02-22 16:25:32 -05:00
update_user_meta ( $site_user -> ID , 'source_domain' , $domain );
update_user_meta ( $site_user -> ID , 'primary_blog' , $blog_id );
2010-01-18 19:04:25 -05:00
2012-10-15 17:41:29 -04:00
if ( $subdomain_install )
$wp_rewrite -> set_permalink_structure ( '/%year%/%monthnum%/%day%/%postname%/' );
else
$wp_rewrite -> set_permalink_structure ( '/blog/%year%/%monthnum%/%day%/%postname%/' );
2010-01-19 11:14:06 -05:00
2012-10-15 17:41:29 -04:00
flush_rewrite_rules ();
2010-01-18 19:04:25 -05:00
2013-08-29 15:31:09 -04:00
if ( ! $subdomain_install )
return true ;
2010-01-18 19:04:25 -05:00
$vhost_ok = false ;
2010-03-10 20:51:24 -05:00
$errstr = '' ;
2010-01-18 19:04:25 -05:00
$hostname = substr ( md5 ( time () ), 0 , 6 ) . '.' . $domain ; // Very random hostname!
$page = wp_remote_get ( 'http://' . $hostname , array ( 'timeout' => 5 , 'httpversion' => '1.1' ) );
2010-03-10 20:51:24 -05:00
if ( is_wp_error ( $page ) )
$errstr = $page -> get_error_message ();
2011-05-14 15:45:07 -04:00
elseif ( 200 == wp_remote_retrieve_response_code ( $page ) )
2010-01-18 19:04:25 -05:00
$vhost_ok = true ;
2010-03-10 20:51:24 -05:00
2010-03-10 03:17:07 -05:00
if ( ! $vhost_ok ) {
2010-03-10 20:51:24 -05:00
$msg = '<p><strong>' . __ ( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>' ;
2015-09-18 14:39:23 -04:00
2015-09-18 14:21:25 -04:00
$msg .= '<p>' . sprintf (
2015-09-18 14:39:23 -04:00
/* translators: %s: host name */
2015-09-18 14:21:25 -04:00
__ ( 'The installer attempted to contact a random hostname (%s) on your domain.' ),
'<code>' . $hostname . '</code>'
);
2015-09-18 14:39:23 -04:00
if ( ! empty ( $errstr ) ) {
/* translators: %s: error message */
2010-04-28 03:40:49 -04:00
$msg .= ' ' . sprintf ( __ ( 'This resulted in an error message: %s' ), '<code>' . $errstr . '</code>' );
2015-09-18 14:39:23 -04:00
}
2010-03-10 20:51:24 -05:00
$msg .= '</p>' ;
2015-09-18 14:39:23 -04:00
2015-09-18 14:21:25 -04:00
$msg .= '<p>' . sprintf (
2015-09-18 14:39:23 -04:00
/* translators: %s: asterisk symbol (*) */
2015-09-18 14:21:25 -04:00
__ ( '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>' ;
2015-09-18 14:39:23 -04:00
2010-03-10 20:51:24 -05:00
$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>' ;
2015-09-18 14:39:23 -04:00
2010-03-10 20:51:24 -05:00
return new WP_Error ( 'no_wildcard_dns' , $msg );
2010-01-18 19:04:25 -05:00
}
}
2010-03-10 20:51:24 -05:00
return true ;
2010-01-18 19:04:25 -05:00
}