3
* WordPress Administration Scheme API
5
* Here we keep the DB structure and option values.
8
* @subpackage Administration
11
// Declare these as global in case schema.php is included from a function.
12
global $wpdb, $wp_queries, $charset_collate;
15
* The database character collate.
18
* @name $charset_collate
20
$charset_collate = $wpdb->get_charset_collate();
23
* Retrieve the SQL for creating database tables.
27
* @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all.
28
* @param int $blog_id Optional. The blog ID for which to retrieve SQL. Default is the current blog ID.
29
* @return string The SQL needed to create the requested tables.
31
function wp_get_db_schema( $scope = 'all', $blog_id = null ) {
34
$charset_collate = '';
36
if ( ! empty($wpdb->charset) )
37
$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
38
if ( ! empty($wpdb->collate) )
39
$charset_collate .= " COLLATE $wpdb->collate";
41
if ( $blog_id && $blog_id != $wpdb->blogid )
42
$old_blog_id = $wpdb->set_blog_id( $blog_id );
44
// Engage multisite if in the middle of turning it on from network.php.
45
$is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );
47
// Blog specific tables.
48
$blog_tables = "CREATE TABLE $wpdb->terms (
49
term_id bigint(20) unsigned NOT NULL auto_increment,
50
name varchar(200) NOT NULL default '',
51
slug varchar(200) NOT NULL default '',
52
term_group bigint(10) NOT NULL default 0,
53
PRIMARY KEY (term_id),
54
UNIQUE KEY slug (slug),
57
CREATE TABLE $wpdb->term_taxonomy (
58
term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,
59
term_id bigint(20) unsigned NOT NULL default 0,
60
taxonomy varchar(32) NOT NULL default '',
61
description longtext NOT NULL,
62
parent bigint(20) unsigned NOT NULL default 0,
63
count bigint(20) NOT NULL default 0,
64
PRIMARY KEY (term_taxonomy_id),
65
UNIQUE KEY term_id_taxonomy (term_id,taxonomy),
66
KEY taxonomy (taxonomy)
68
CREATE TABLE $wpdb->term_relationships (
69
object_id bigint(20) unsigned NOT NULL default 0,
70
term_taxonomy_id bigint(20) unsigned NOT NULL default 0,
71
term_order int(11) NOT NULL default 0,
72
PRIMARY KEY (object_id,term_taxonomy_id),
73
KEY term_taxonomy_id (term_taxonomy_id)
75
CREATE TABLE $wpdb->commentmeta (
76
meta_id bigint(20) unsigned NOT NULL auto_increment,
77
comment_id bigint(20) unsigned NOT NULL default '0',
78
meta_key varchar(255) default NULL,
80
PRIMARY KEY (meta_id),
81
KEY comment_id (comment_id),
82
KEY meta_key (meta_key)
84
CREATE TABLE $wpdb->comments (
85
comment_ID bigint(20) unsigned NOT NULL auto_increment,
86
comment_post_ID bigint(20) unsigned NOT NULL default '0',
87
comment_author tinytext NOT NULL,
88
comment_author_email varchar(100) NOT NULL default '',
89
comment_author_url varchar(200) NOT NULL default '',
90
comment_author_IP varchar(100) NOT NULL default '',
91
comment_date datetime NOT NULL default '0000-00-00 00:00:00',
92
comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
93
comment_content text NOT NULL,
94
comment_karma int(11) NOT NULL default '0',
95
comment_approved varchar(20) NOT NULL default '1',
96
comment_agent varchar(255) NOT NULL default '',
97
comment_type varchar(20) NOT NULL default '',
98
comment_parent bigint(20) unsigned NOT NULL default '0',
99
user_id bigint(20) unsigned NOT NULL default '0',
100
PRIMARY KEY (comment_ID),
101
KEY comment_post_ID (comment_post_ID),
102
KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
103
KEY comment_date_gmt (comment_date_gmt),
104
KEY comment_parent (comment_parent),
105
KEY comment_author_email (comment_author_email(10))
107
CREATE TABLE $wpdb->links (
108
link_id bigint(20) unsigned NOT NULL auto_increment,
109
link_url varchar(255) NOT NULL default '',
110
link_name varchar(255) NOT NULL default '',
111
link_image varchar(255) NOT NULL default '',
112
link_target varchar(25) NOT NULL default '',
113
link_description varchar(255) NOT NULL default '',
114
link_visible varchar(20) NOT NULL default 'Y',
115
link_owner bigint(20) unsigned NOT NULL default '1',
116
link_rating int(11) NOT NULL default '0',
117
link_updated datetime NOT NULL default '0000-00-00 00:00:00',
118
link_rel varchar(255) NOT NULL default '',
119
link_notes mediumtext NOT NULL,
120
link_rss varchar(255) NOT NULL default '',
121
PRIMARY KEY (link_id),
122
KEY link_visible (link_visible)
124
CREATE TABLE $wpdb->options (
125
option_id bigint(20) unsigned NOT NULL auto_increment,
126
option_name varchar(64) NOT NULL default '',
127
option_value longtext NOT NULL,
128
autoload varchar(20) NOT NULL default 'yes',
129
PRIMARY KEY (option_id),
130
UNIQUE KEY option_name (option_name)
132
CREATE TABLE $wpdb->postmeta (
133
meta_id bigint(20) unsigned NOT NULL auto_increment,
134
post_id bigint(20) unsigned NOT NULL default '0',
135
meta_key varchar(255) default NULL,
137
PRIMARY KEY (meta_id),
138
KEY post_id (post_id),
139
KEY meta_key (meta_key)
141
CREATE TABLE $wpdb->posts (
142
ID bigint(20) unsigned NOT NULL auto_increment,
143
post_author bigint(20) unsigned NOT NULL default '0',
144
post_date datetime NOT NULL default '0000-00-00 00:00:00',
145
post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
146
post_content longtext NOT NULL,
147
post_title text NOT NULL,
148
post_excerpt text NOT NULL,
149
post_status varchar(20) NOT NULL default 'publish',
150
comment_status varchar(20) NOT NULL default 'open',
151
ping_status varchar(20) NOT NULL default 'open',
152
post_password varchar(20) NOT NULL default '',
153
post_name varchar(200) NOT NULL default '',
154
to_ping text NOT NULL,
155
pinged text NOT NULL,
156
post_modified datetime NOT NULL default '0000-00-00 00:00:00',
157
post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
158
post_content_filtered longtext NOT NULL,
159
post_parent bigint(20) unsigned NOT NULL default '0',
160
guid varchar(255) NOT NULL default '',
161
menu_order int(11) NOT NULL default '0',
162
post_type varchar(20) NOT NULL default 'post',
163
post_mime_type varchar(100) NOT NULL default '',
164
comment_count bigint(20) NOT NULL default '0',
166
KEY post_name (post_name),
167
KEY type_status_date (post_type,post_status,post_date,ID),
168
KEY post_parent (post_parent),
169
KEY post_author (post_author)
170
) $charset_collate;\n";
172
// Single site users table. The multisite flavor of the users table is handled below.
173
$users_single_table = "CREATE TABLE $wpdb->users (
174
ID bigint(20) unsigned NOT NULL auto_increment,
175
user_login varchar(60) NOT NULL default '',
176
user_pass varchar(64) NOT NULL default '',
177
user_nicename varchar(50) NOT NULL default '',
178
user_email varchar(100) NOT NULL default '',
179
user_url varchar(100) NOT NULL default '',
180
user_registered datetime NOT NULL default '0000-00-00 00:00:00',
181
user_activation_key varchar(60) NOT NULL default '',
182
user_status int(11) NOT NULL default '0',
183
display_name varchar(250) NOT NULL default '',
185
KEY user_login_key (user_login),
186
KEY user_nicename (user_nicename)
187
) $charset_collate;\n";
189
// Multisite users table
190
$users_multi_table = "CREATE TABLE $wpdb->users (
191
ID bigint(20) unsigned NOT NULL auto_increment,
192
user_login varchar(60) NOT NULL default '',
193
user_pass varchar(64) NOT NULL default '',
194
user_nicename varchar(50) NOT NULL default '',
195
user_email varchar(100) NOT NULL default '',
196
user_url varchar(100) NOT NULL default '',
197
user_registered datetime NOT NULL default '0000-00-00 00:00:00',
198
user_activation_key varchar(60) NOT NULL default '',
199
user_status int(11) NOT NULL default '0',
200
display_name varchar(250) NOT NULL default '',
201
spam tinyint(2) NOT NULL default '0',
202
deleted tinyint(2) NOT NULL default '0',
204
KEY user_login_key (user_login),
205
KEY user_nicename (user_nicename)
206
) $charset_collate;\n";
209
$usermeta_table = "CREATE TABLE $wpdb->usermeta (
210
umeta_id bigint(20) unsigned NOT NULL auto_increment,
211
user_id bigint(20) unsigned NOT NULL default '0',
212
meta_key varchar(255) default NULL,
214
PRIMARY KEY (umeta_id),
215
KEY user_id (user_id),
216
KEY meta_key (meta_key)
217
) $charset_collate;\n";
221
$global_tables = $users_multi_table . $usermeta_table;
223
$global_tables = $users_single_table . $usermeta_table;
225
// Multisite global tables.
226
$ms_global_tables = "CREATE TABLE $wpdb->blogs (
227
blog_id bigint(20) NOT NULL auto_increment,
228
site_id bigint(20) NOT NULL default '0',
229
domain varchar(200) NOT NULL default '',
230
path varchar(100) NOT NULL default '',
231
registered datetime NOT NULL default '0000-00-00 00:00:00',
232
last_updated datetime NOT NULL default '0000-00-00 00:00:00',
233
public tinyint(2) NOT NULL default '1',
234
archived tinyint(2) NOT NULL default '0',
235
mature tinyint(2) NOT NULL default '0',
236
spam tinyint(2) NOT NULL default '0',
237
deleted tinyint(2) NOT NULL default '0',
238
lang_id int(11) NOT NULL default '0',
239
PRIMARY KEY (blog_id),
240
KEY domain (domain(50),path(5)),
241
KEY lang_id (lang_id)
243
CREATE TABLE $wpdb->blog_versions (
244
blog_id bigint(20) NOT NULL default '0',
245
db_version varchar(20) NOT NULL default '',
246
last_updated datetime NOT NULL default '0000-00-00 00:00:00',
247
PRIMARY KEY (blog_id),
248
KEY db_version (db_version)
250
CREATE TABLE $wpdb->registration_log (
251
ID bigint(20) NOT NULL auto_increment,
252
email varchar(255) NOT NULL default '',
253
IP varchar(30) NOT NULL default '',
254
blog_id bigint(20) NOT NULL default '0',
255
date_registered datetime NOT NULL default '0000-00-00 00:00:00',
259
CREATE TABLE $wpdb->site (
260
id bigint(20) NOT NULL auto_increment,
261
domain varchar(200) NOT NULL default '',
262
path varchar(100) NOT NULL default '',
264
KEY domain (domain,path)
266
CREATE TABLE $wpdb->sitemeta (
267
meta_id bigint(20) NOT NULL auto_increment,
268
site_id bigint(20) NOT NULL default '0',
269
meta_key varchar(255) default NULL,
271
PRIMARY KEY (meta_id),
272
KEY meta_key (meta_key),
273
KEY site_id (site_id)
275
CREATE TABLE $wpdb->signups (
276
signup_id bigint(20) NOT NULL auto_increment,
277
domain varchar(200) NOT NULL default '',
278
path varchar(100) NOT NULL default '',
279
title longtext NOT NULL,
280
user_login varchar(60) NOT NULL default '',
281
user_email varchar(100) NOT NULL default '',
282
registered datetime NOT NULL default '0000-00-00 00:00:00',
283
activated datetime NOT NULL default '0000-00-00 00:00:00',
284
active tinyint(1) NOT NULL default '0',
285
activation_key varchar(50) NOT NULL default '',
287
PRIMARY KEY (signup_id),
288
KEY activation_key (activation_key),
289
KEY user_email (user_email),
290
KEY user_login_email (user_login,user_email),
291
KEY domain_path (domain,path)
292
) $charset_collate;";
296
$queries = $blog_tables;
299
$queries = $global_tables;
301
$queries .= $ms_global_tables;
304
$queries = $ms_global_tables;
308
$queries = $global_tables . $blog_tables;
310
$queries .= $ms_global_tables;
314
if ( isset( $old_blog_id ) )
315
$wpdb->set_blog_id( $old_blog_id );
320
// Populate for back compat.
321
$wp_queries = wp_get_db_schema( 'all' );
324
* Create WordPress options and set the default values.
328
* @uses $wp_db_version
330
function populate_options() {
331
global $wpdb, $wp_db_version, $wp_current_db_version;
333
$guessurl = wp_guess_url();
335
* Fires before creating WordPress options and populating their default values.
339
do_action( 'populate_options' );
341
if ( ini_get('safe_mode') ) {
342
// Safe mode can break mkdir() so use a flat structure by default.
343
$uploads_use_yearmonth_folders = 0;
345
$uploads_use_yearmonth_folders = 1;
348
$template = WP_DEFAULT_THEME;
349
// If default theme is a child theme, we need to get its template
350
$theme = wp_get_theme( $template );
351
if ( ! $theme->errors() )
352
$template = $theme->get_template();
354
$timezone_string = '';
356
/* translators: default GMT offset or timezone string. Must be either a valid offset (-12 to 14)
357
or a valid timezone string (America/New_York). See http://us3.php.net/manual/en/timezones.php
358
for all timezone strings supported by PHP.
360
$offset_or_tz = _x( '0', 'default GMT offset or timezone string' );
361
if ( is_numeric( $offset_or_tz ) )
362
$gmt_offset = $offset_or_tz;
363
elseif ( $offset_or_tz && in_array( $offset_or_tz, timezone_identifiers_list() ) )
364
$timezone_string = $offset_or_tz;
367
'siteurl' => $guessurl,
369
'blogname' => __('My Site'),
370
/* translators: blog tagline */
371
'blogdescription' => __('Just another WordPress site'),
372
'users_can_register' => 0,
373
'admin_email' => 'you@example.com',
374
/* translators: default start of the week. 0 = Sunday, 1 = Monday */
375
'start_of_week' => _x( '1', 'start of week' ),
376
'use_balanceTags' => 0,
378
'require_name_email' => 1,
379
'comments_notify' => 1,
380
'posts_per_rss' => 10,
381
'rss_use_excerpt' => 0,
382
'mailserver_url' => 'mail.example.com',
383
'mailserver_login' => 'login@example.com',
384
'mailserver_pass' => 'password',
385
'mailserver_port' => 110,
386
'default_category' => 1,
387
'default_comment_status' => 'open',
388
'default_ping_status' => 'open',
389
'default_pingback_flag' => 1,
390
'posts_per_page' => 10,
391
/* translators: default date format, see http://php.net/date */
392
'date_format' => __('F j, Y'),
393
/* translators: default time format, see http://php.net/date */
394
'time_format' => __('g:i a'),
395
/* translators: links last updated date format, see http://php.net/date */
396
'links_updated_date_format' => __('F j, Y g:i a'),
397
'comment_moderation' => 0,
398
'moderation_notify' => 1,
399
'permalink_structure' => '',
400
'gzipcompression' => 0,
402
'blog_charset' => 'UTF-8',
403
'moderation_keys' => '',
404
'active_plugins' => array(),
405
'category_base' => '',
406
'ping_sites' => 'http://rpc.pingomatic.com/',
407
'advanced_edit' => 0,
408
'comment_max_links' => 2,
409
'gmt_offset' => $gmt_offset,
412
'default_email_category' => 1,
413
'recently_edited' => '',
414
'template' => $template,
415
'stylesheet' => WP_DEFAULT_THEME,
416
'comment_whitelist' => 1,
417
'blacklist_keys' => '',
418
'comment_registration' => 0,
419
'html_type' => 'text/html',
422
'use_trackback' => 0,
425
'default_role' => 'subscriber',
426
'db_version' => $wp_db_version,
429
'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders,
433
'blog_public' => '1',
434
'default_link_category' => 2,
435
'show_on_front' => 'posts',
441
'show_avatars' => '1',
442
'avatar_rating' => 'G',
443
'upload_url_path' => '',
444
'thumbnail_size_w' => 150,
445
'thumbnail_size_h' => 150,
446
'thumbnail_crop' => 1,
447
'medium_size_w' => 300,
448
'medium_size_h' => 300,
451
'avatar_default' => 'mystery',
454
'large_size_w' => 1024,
455
'large_size_h' => 1024,
456
'image_default_link_type' => 'file',
457
'image_default_size' => '',
458
'image_default_align' => '',
459
'close_comments_for_old_posts' => 0,
460
'close_comments_days_old' => 14,
461
'thread_comments' => 1,
462
'thread_comments_depth' => 5,
463
'page_comments' => 0,
464
'comments_per_page' => 50,
465
'default_comments_page' => 'newest',
466
'comment_order' => 'asc',
467
'sticky_posts' => array(),
468
'widget_categories' => array(),
469
'widget_text' => array(),
470
'widget_rss' => array(),
471
'uninstall_plugins' => array(),
474
'timezone_string' => $timezone_string,
477
'page_for_posts' => 0,
478
'page_on_front' => 0,
481
'default_post_format' => 0,
484
'link_manager_enabled' => 0,
488
if ( ! is_multisite() ) {
489
$options['initial_db_version'] = ! empty( $wp_current_db_version ) && $wp_current_db_version < $wp_db_version
490
? $wp_current_db_version : $wp_db_version;
494
if ( is_multisite() ) {
495
/* translators: blog tagline */
496
$options[ 'blogdescription' ] = sprintf(__('Just another %s site'), get_current_site()->site_name );
497
$options[ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/';
500
// Set autoload to no for these options
501
$fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys', 'uninstall_plugins' );
503
$keys = "'" . implode( "', '", array_keys( $options ) ) . "'";
504
$existing_options = $wpdb->get_col( "SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys )" );
507
foreach ( $options as $option => $value ) {
508
if ( in_array($option, $existing_options) )
510
if ( in_array($option, $fat_options) )
515
if ( is_array($value) )
516
$value = serialize($value);
517
if ( !empty($insert) )
519
$insert .= $wpdb->prepare( "(%s, %s, %s)", $option, $value, $autoload );
522
if ( !empty($insert) )
523
$wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert);
525
// In case it is set, but blank, update "home".
526
if ( !__get_option('home') ) update_option('home', $guessurl);
528
// Delete unused options.
529
$unusedoptions = array(
530
'blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory',
531
'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping',
532
'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers',
533
'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference',
534
'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char',
535
'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1',
536
'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5',
537
'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9',
538
'links_recently_updated_time', 'links_recently_updated_prepend', 'links_recently_updated_append',
539
'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat',
540
'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce',
541
'_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins',
542
'can_compress_scripts', 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron',
543
'random_seed', 'rss_excerpt_length', 'secret', 'use_linksupdate', 'default_comment_status_page',
544
'wporg_popular_tags', 'what_to_show', 'rss_language', 'language', 'enable_xmlrpc', 'enable_app',
545
'embed_autourls', 'default_post_edit_rows',
547
foreach ( $unusedoptions as $option )
548
delete_option($option);
550
// Delete obsolete magpie stuff.
551
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'");
554
* Deletes all expired transients. The multi-table delete syntax is used
555
* to delete the transient record from table a, and the corresponding
556
* transient_timeout record from table b.
559
$sql = "DELETE a, b FROM $wpdb->options a, $wpdb->options b
560
WHERE a.option_name LIKE %s
561
AND a.option_name NOT LIKE %s
562
AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
563
AND b.option_value < %d";
564
$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_transient_' ) . '%', $wpdb->esc_like( '_transient_timeout_' ) . '%', $time ) );
566
if ( is_main_site() && is_main_network() ) {
567
$sql = "DELETE a, b FROM $wpdb->options a, $wpdb->options b
568
WHERE a.option_name LIKE %s
569
AND a.option_name NOT LIKE %s
570
AND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )
571
AND b.option_value < %d";
572
$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like( '_site_transient_timeout_' ) . '%', $time ) );
577
* Execute WordPress role creation for the various WordPress versions.
581
function populate_roles() {
582
populate_roles_160();
583
populate_roles_210();
584
populate_roles_230();
585
populate_roles_250();
586
populate_roles_260();
587
populate_roles_270();
588
populate_roles_280();
589
populate_roles_300();
593
* Create the roles for WordPress 2.0
597
function populate_roles_160() {
600
// Dummy gettext calls to get strings in the catalog.
601
/* translators: user role */
602
_x('Administrator', 'User role');
603
/* translators: user role */
604
_x('Editor', 'User role');
605
/* translators: user role */
606
_x('Author', 'User role');
607
/* translators: user role */
608
_x('Contributor', 'User role');
609
/* translators: user role */
610
_x('Subscriber', 'User role');
612
add_role('administrator', 'Administrator');
613
add_role('editor', 'Editor');
614
add_role('author', 'Author');
615
add_role('contributor', 'Contributor');
616
add_role('subscriber', 'Subscriber');
618
// Add caps for Administrator role
619
$role = get_role('administrator');
620
$role->add_cap('switch_themes');
621
$role->add_cap('edit_themes');
622
$role->add_cap('activate_plugins');
623
$role->add_cap('edit_plugins');
624
$role->add_cap('edit_users');
625
$role->add_cap('edit_files');
626
$role->add_cap('manage_options');
627
$role->add_cap('moderate_comments');
628
$role->add_cap('manage_categories');
629
$role->add_cap('manage_links');
630
$role->add_cap('upload_files');
631
$role->add_cap('import');
632
$role->add_cap('unfiltered_html');
633
$role->add_cap('edit_posts');
634
$role->add_cap('edit_others_posts');
635
$role->add_cap('edit_published_posts');
636
$role->add_cap('publish_posts');
637
$role->add_cap('edit_pages');
638
$role->add_cap('read');
639
$role->add_cap('level_10');
640
$role->add_cap('level_9');
641
$role->add_cap('level_8');
642
$role->add_cap('level_7');
643
$role->add_cap('level_6');
644
$role->add_cap('level_5');
645
$role->add_cap('level_4');
646
$role->add_cap('level_3');
647
$role->add_cap('level_2');
648
$role->add_cap('level_1');
649
$role->add_cap('level_0');
651
// Add caps for Editor role
652
$role = get_role('editor');
653
$role->add_cap('moderate_comments');
654
$role->add_cap('manage_categories');
655
$role->add_cap('manage_links');
656
$role->add_cap('upload_files');
657
$role->add_cap('unfiltered_html');
658
$role->add_cap('edit_posts');
659
$role->add_cap('edit_others_posts');
660
$role->add_cap('edit_published_posts');
661
$role->add_cap('publish_posts');
662
$role->add_cap('edit_pages');
663
$role->add_cap('read');
664
$role->add_cap('level_7');
665
$role->add_cap('level_6');
666
$role->add_cap('level_5');
667
$role->add_cap('level_4');
668
$role->add_cap('level_3');
669
$role->add_cap('level_2');
670
$role->add_cap('level_1');
671
$role->add_cap('level_0');
673
// Add caps for Author role
674
$role = get_role('author');
675
$role->add_cap('upload_files');
676
$role->add_cap('edit_posts');
677
$role->add_cap('edit_published_posts');
678
$role->add_cap('publish_posts');
679
$role->add_cap('read');
680
$role->add_cap('level_2');
681
$role->add_cap('level_1');
682
$role->add_cap('level_0');
684
// Add caps for Contributor role
685
$role = get_role('contributor');
686
$role->add_cap('edit_posts');
687
$role->add_cap('read');
688
$role->add_cap('level_1');
689
$role->add_cap('level_0');
691
// Add caps for Subscriber role
692
$role = get_role('subscriber');
693
$role->add_cap('read');
694
$role->add_cap('level_0');
698
* Create and modify WordPress roles for WordPress 2.1.
702
function populate_roles_210() {
703
$roles = array('administrator', 'editor');
704
foreach ($roles as $role) {
705
$role = get_role($role);
709
$role->add_cap('edit_others_pages');
710
$role->add_cap('edit_published_pages');
711
$role->add_cap('publish_pages');
712
$role->add_cap('delete_pages');
713
$role->add_cap('delete_others_pages');
714
$role->add_cap('delete_published_pages');
715
$role->add_cap('delete_posts');
716
$role->add_cap('delete_others_posts');
717
$role->add_cap('delete_published_posts');
718
$role->add_cap('delete_private_posts');
719
$role->add_cap('edit_private_posts');
720
$role->add_cap('read_private_posts');
721
$role->add_cap('delete_private_pages');
722
$role->add_cap('edit_private_pages');
723
$role->add_cap('read_private_pages');
726
$role = get_role('administrator');
727
if ( ! empty($role) ) {
728
$role->add_cap('delete_users');
729
$role->add_cap('create_users');
732
$role = get_role('author');
733
if ( ! empty($role) ) {
734
$role->add_cap('delete_posts');
735
$role->add_cap('delete_published_posts');
738
$role = get_role('contributor');
739
if ( ! empty($role) ) {
740
$role->add_cap('delete_posts');
745
* Create and modify WordPress roles for WordPress 2.3.
749
function populate_roles_230() {
750
$role = get_role( 'administrator' );
752
if ( !empty( $role ) ) {
753
$role->add_cap( 'unfiltered_upload' );
758
* Create and modify WordPress roles for WordPress 2.5.
762
function populate_roles_250() {
763
$role = get_role( 'administrator' );
765
if ( !empty( $role ) ) {
766
$role->add_cap( 'edit_dashboard' );
771
* Create and modify WordPress roles for WordPress 2.6.
775
function populate_roles_260() {
776
$role = get_role( 'administrator' );
778
if ( !empty( $role ) ) {
779
$role->add_cap( 'update_plugins' );
780
$role->add_cap( 'delete_plugins' );
785
* Create and modify WordPress roles for WordPress 2.7.
789
function populate_roles_270() {
790
$role = get_role( 'administrator' );
792
if ( !empty( $role ) ) {
793
$role->add_cap( 'install_plugins' );
794
$role->add_cap( 'update_themes' );
799
* Create and modify WordPress roles for WordPress 2.8.
803
function populate_roles_280() {
804
$role = get_role( 'administrator' );
806
if ( !empty( $role ) ) {
807
$role->add_cap( 'install_themes' );
812
* Create and modify WordPress roles for WordPress 3.0.
816
function populate_roles_300() {
817
$role = get_role( 'administrator' );
819
if ( !empty( $role ) ) {
820
$role->add_cap( 'update_core' );
821
$role->add_cap( 'list_users' );
822
$role->add_cap( 'remove_users' );
825
* Never used, will be removed. create_users or promote_users
826
* is the capability you're looking for.
828
$role->add_cap( 'add_users' );
830
$role->add_cap( 'promote_users' );
831
$role->add_cap( 'edit_theme_options' );
832
$role->add_cap( 'delete_themes' );
833
$role->add_cap( 'export' );
843
if ( !function_exists( 'install_network' ) ) :
844
function install_network() {
845
if ( ! defined( 'WP_INSTALLING_NETWORK' ) )
846
define( 'WP_INSTALLING_NETWORK', true );
848
dbDelta( wp_get_db_schema( 'global' ) );
853
* Populate network settings.
857
* @param int $network_id ID of network to populate.
858
* @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful,
859
* so the error code must be checked) or failure.
861
function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) {
862
global $wpdb, $current_site, $wp_db_version, $wp_rewrite;
864
$errors = new WP_Error();
866
$errors->add( 'empty_domain', __( 'You must provide a domain name.' ) );
867
if ( '' == $site_name )
868
$errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) );
870
// Check for network collision.
871
if ( $network_id == $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE id = %d", $network_id ) ) )
872
$errors->add( 'siteid_exists', __( 'The network already exists.' ) );
874
$site_user = get_user_by( 'email', $email );
875
if ( ! is_email( $email ) )
876
$errors->add( 'invalid_email', __( 'You must provide a valid e-mail address.' ) );
878
if ( $errors->get_error_code() )
881
// Set up site tables.
882
$template = get_option( 'template' );
883
$stylesheet = get_option( 'stylesheet' );
884
$allowed_themes = array( $stylesheet => true );
885
if ( $template != $stylesheet )
886
$allowed_themes[ $template ] = true;
887
if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template )
888
$allowed_themes[ WP_DEFAULT_THEME ] = true;
890
if ( 1 == $network_id ) {
891
$wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path ) );
892
$network_id = $wpdb->insert_id;
894
$wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path, 'id' => $network_id ) );
897
wp_cache_delete( 'networks_have_paths', 'site-options' );
899
if ( !is_multisite() ) {
900
$site_admins = array( $site_user->user_login );
901
$users = get_users( array( 'fields' => array( 'ID', 'user_login' ) ) );
903
foreach ( $users as $user ) {
904
if ( is_super_admin( $user->ID ) && !in_array( $user->user_login, $site_admins ) )
905
$site_admins[] = $user->user_login;
909
$site_admins = get_site_option( 'site_admins' );
912
$welcome_email = __( 'Dear User,
914
Your new SITE_NAME site has been successfully set up at:
917
You can log in to the administrator account with the following information:
920
Log in here: BLOG_URLwp-login.php
922
We hope you enjoy your new site. Thanks!
924
--The Team @ SITE_NAME' );
928
'jpg', 'jpeg', 'png', 'gif',
930
'mov', 'avi', 'mpg', '3gp', '3g2',
934
'pdf', 'doc', 'ppt', 'odt', 'pptx', 'docx', 'pps', 'ppsx', 'xls', 'xlsx', 'key',
936
$audio_exts = wp_get_audio_extensions();
937
$video_exts = wp_get_video_extensions();
938
$upload_filetypes = array_unique( array_merge( $misc_exts, $audio_exts, $video_exts ) );
941
'site_name' => $site_name,
942
'admin_email' => $site_user->user_email,
943
'admin_user_id' => $site_user->ID,
944
'registration' => 'none',
945
'upload_filetypes' => implode( ' ', $upload_filetypes ),
946
'blog_upload_space' => 100,
947
'fileupload_maxk' => 1500,
948
'site_admins' => $site_admins,
949
'allowedthemes' => $allowed_themes,
950
'illegal_names' => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ),
951
'wpmu_upgrade_site' => $wp_db_version,
952
'welcome_email' => $welcome_email,
953
'first_post' => __( 'Welcome to <a href="SITE_URL">SITE_NAME</a>. This is your first post. Edit or delete it, then start blogging!' ),
954
// @todo - network admins should have a method of editing the network siteurl (used for cookie hash)
955
'siteurl' => get_option( 'siteurl' ) . '/',
956
'add_new_users' => '0',
957
'upload_space_check_disabled' => is_multisite() ? get_site_option( 'upload_space_check_disabled' ) : '1',
958
'subdomain_install' => intval( $subdomain_install ),
959
'global_terms_enabled' => global_terms_enabled() ? '1' : '0',
960
'ms_files_rewriting' => is_multisite() ? get_site_option( 'ms_files_rewriting' ) : '0',
961
'initial_db_version' => get_option( 'initial_db_version' ),
962
'active_sitewide_plugins' => array(),
963
'WPLANG' => get_locale(),
965
if ( ! $subdomain_install )
966
$sitemeta['illegal_names'][] = 'blog';
969
* Filter meta for a network on creation.
973
* @param array $sitemeta Associative array of network meta keys and values to be inserted.
974
* @param int $network_id ID of network to populate.
976
$sitemeta = apply_filters( 'populate_network_meta', $sitemeta, $network_id );
979
foreach ( $sitemeta as $meta_key => $meta_value ) {
980
if ( is_array( $meta_value ) )
981
$meta_value = serialize( $meta_value );
982
if ( !empty( $insert ) )
984
$insert .= $wpdb->prepare( "( %d, %s, %s)", $network_id, $meta_key, $meta_value );
986
$wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert );
989
* When upgrading from single to multisite, assume the current site will
990
* become the main site of the network. When using populate_network()
991
* to create another network in an existing multisite environment, skip
992
* these steps since the main site of the new network has not yet been
995
if ( ! is_multisite() ) {
996
$current_site = new stdClass;
997
$current_site->domain = $domain;
998
$current_site->path = $path;
999
$current_site->site_name = ucfirst( $domain );
1000
$wpdb->insert( $wpdb->blogs, array( 'site_id' => $network_id, 'blog_id' => 1, 'domain' => $domain, 'path' => $path, 'registered' => current_time( 'mysql' ) ) );
1001
$current_site->blog_id = $blog_id = $wpdb->insert_id;
1002
update_user_meta( $site_user->ID, 'source_domain', $domain );
1003
update_user_meta( $site_user->ID, 'primary_blog', $blog_id );
1005
if ( $subdomain_install )
1006
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
1008
$wp_rewrite->set_permalink_structure( '/blog/%year%/%monthnum%/%day%/%postname%/' );
1010
flush_rewrite_rules();
1012
if ( ! $subdomain_install )
1017
$hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname!
1018
$page = wp_remote_get( 'http://' . $hostname, array( 'timeout' => 5, 'httpversion' => '1.1' ) );
1019
if ( is_wp_error( $page ) )
1020
$errstr = $page->get_error_message();
1021
elseif ( 200 == wp_remote_retrieve_response_code( $page ) )
1024
if ( ! $vhost_ok ) {
1025
$msg = '<p><strong>' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>';
1026
$msg .= '<p>' . sprintf( __( 'The installer attempted to contact a random hostname (<code>%1$s</code>) on your domain.' ), $hostname );
1027
if ( ! empty ( $errstr ) )
1028
$msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '<code>' . $errstr . '</code>' );
1030
$msg .= '<p>' . __( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a <code>*</code> hostname record pointing at your web server in your DNS configuration tool.' ) . '</p>';
1031
$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>';
1032
return new WP_Error( 'no_wildcard_dns', $msg );