3 * WordPress Administration Scheme API
5 * Here we keep the DB structure and option values.
8 * @subpackage Administration
12 * The database character collate.
15 * @name $charset_collate
17 $charset_collate = '';
19 // Declare these as global in case schema.php is included from a function.
20 global $wpdb, $wp_queries;
22 if ( ! empty($wpdb->charset) )
23 $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
24 if ( ! empty($wpdb->collate) )
25 $charset_collate .= " COLLATE $wpdb->collate";
27 /** Create WordPress database tables SQL */
28 $wp_queries = "CREATE TABLE $wpdb->terms (
29 term_id bigint(20) unsigned NOT NULL auto_increment,
30 name varchar(200) NOT NULL default '',
31 slug varchar(200) NOT NULL default '',
32 term_group bigint(10) NOT NULL default 0,
33 PRIMARY KEY (term_id),
34 UNIQUE KEY slug (slug),
37 CREATE TABLE $wpdb->term_taxonomy (
38 term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,
39 term_id bigint(20) unsigned NOT NULL default 0,
40 taxonomy varchar(32) NOT NULL default '',
41 description longtext NOT NULL,
42 parent bigint(20) unsigned NOT NULL default 0,
43 count bigint(20) NOT NULL default 0,
44 PRIMARY KEY (term_taxonomy_id),
45 UNIQUE KEY term_id_taxonomy (term_id,taxonomy),
46 KEY taxonomy (taxonomy)
48 CREATE TABLE $wpdb->term_relationships (
49 object_id bigint(20) unsigned NOT NULL default 0,
50 term_taxonomy_id bigint(20) unsigned NOT NULL default 0,
51 term_order int(11) NOT NULL default 0,
52 PRIMARY KEY (object_id,term_taxonomy_id),
53 KEY term_taxonomy_id (term_taxonomy_id)
55 CREATE TABLE $wpdb->commentmeta (
56 meta_id bigint(20) unsigned NOT NULL auto_increment,
57 comment_id bigint(20) unsigned NOT NULL default '0',
58 meta_key varchar(255) default NULL,
60 PRIMARY KEY (meta_id),
61 KEY comment_id (comment_id),
62 KEY meta_key (meta_key)
64 CREATE TABLE $wpdb->comments (
65 comment_ID bigint(20) unsigned NOT NULL auto_increment,
66 comment_post_ID bigint(20) unsigned NOT NULL default '0',
67 comment_author tinytext NOT NULL,
68 comment_author_email varchar(100) NOT NULL default '',
69 comment_author_url varchar(200) NOT NULL default '',
70 comment_author_IP varchar(100) NOT NULL default '',
71 comment_date datetime NOT NULL default '0000-00-00 00:00:00',
72 comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
73 comment_content text NOT NULL,
74 comment_karma int(11) NOT NULL default '0',
75 comment_approved varchar(20) NOT NULL default '1',
76 comment_agent varchar(255) NOT NULL default '',
77 comment_type varchar(20) NOT NULL default '',
78 comment_parent bigint(20) unsigned NOT NULL default '0',
79 user_id bigint(20) unsigned NOT NULL default '0',
80 PRIMARY KEY (comment_ID),
81 KEY comment_approved (comment_approved),
82 KEY comment_post_ID (comment_post_ID),
83 KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
84 KEY comment_date_gmt (comment_date_gmt)
86 CREATE TABLE $wpdb->links (
87 link_id bigint(20) unsigned NOT NULL auto_increment,
88 link_url varchar(255) NOT NULL default '',
89 link_name varchar(255) NOT NULL default '',
90 link_image varchar(255) NOT NULL default '',
91 link_target varchar(25) NOT NULL default '',
92 link_description varchar(255) NOT NULL default '',
93 link_visible varchar(20) NOT NULL default 'Y',
94 link_owner bigint(20) unsigned NOT NULL default '1',
95 link_rating int(11) NOT NULL default '0',
96 link_updated datetime NOT NULL default '0000-00-00 00:00:00',
97 link_rel varchar(255) NOT NULL default '',
98 link_notes mediumtext NOT NULL,
99 link_rss varchar(255) NOT NULL default '',
100 PRIMARY KEY (link_id),
101 KEY link_visible (link_visible)
103 CREATE TABLE $wpdb->options (
104 option_id bigint(20) unsigned NOT NULL auto_increment,
105 blog_id int(11) NOT NULL default '0',
106 option_name varchar(64) NOT NULL default '',
107 option_value longtext NOT NULL,
108 autoload varchar(20) NOT NULL default 'yes',
109 PRIMARY KEY (option_id),
110 UNIQUE KEY option_name (option_name)
112 CREATE TABLE $wpdb->postmeta (
113 meta_id bigint(20) unsigned NOT NULL auto_increment,
114 post_id bigint(20) unsigned NOT NULL default '0',
115 meta_key varchar(255) default NULL,
117 PRIMARY KEY (meta_id),
118 KEY post_id (post_id),
119 KEY meta_key (meta_key)
121 CREATE TABLE $wpdb->posts (
122 ID bigint(20) unsigned NOT NULL auto_increment,
123 post_author bigint(20) unsigned NOT NULL default '0',
124 post_date datetime NOT NULL default '0000-00-00 00:00:00',
125 post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
126 post_content longtext NOT NULL,
127 post_title text NOT NULL,
128 post_excerpt text NOT NULL,
129 post_status varchar(20) NOT NULL default 'publish',
130 comment_status varchar(20) NOT NULL default 'open',
131 ping_status varchar(20) NOT NULL default 'open',
132 post_password varchar(20) NOT NULL default '',
133 post_name varchar(200) NOT NULL default '',
134 to_ping text NOT NULL,
135 pinged text NOT NULL,
136 post_modified datetime NOT NULL default '0000-00-00 00:00:00',
137 post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
138 post_content_filtered text NOT NULL,
139 post_parent bigint(20) unsigned NOT NULL default '0',
140 guid varchar(255) NOT NULL default '',
141 menu_order int(11) NOT NULL default '0',
142 post_type varchar(20) NOT NULL default 'post',
143 post_mime_type varchar(100) NOT NULL default '',
144 comment_count bigint(20) NOT NULL default '0',
146 KEY post_name (post_name),
147 KEY type_status_date (post_type,post_status,post_date,ID),
148 KEY post_parent (post_parent)
150 CREATE TABLE $wpdb->users (
151 ID bigint(20) unsigned NOT NULL auto_increment,
152 user_login varchar(60) NOT NULL default '',
153 user_pass varchar(64) NOT NULL default '',
154 user_nicename varchar(50) NOT NULL default '',
155 user_email varchar(100) NOT NULL default '',
156 user_url varchar(100) NOT NULL default '',
157 user_registered datetime NOT NULL default '0000-00-00 00:00:00',
158 user_activation_key varchar(60) NOT NULL default '',
159 user_status int(11) NOT NULL default '0',
160 display_name varchar(250) NOT NULL default '',
162 KEY user_login_key (user_login),
163 KEY user_nicename (user_nicename)
165 CREATE TABLE $wpdb->usermeta (
166 umeta_id bigint(20) unsigned NOT NULL auto_increment,
167 user_id bigint(20) unsigned NOT NULL default '0',
168 meta_key varchar(255) default NULL,
170 PRIMARY KEY (umeta_id),
171 KEY user_id (user_id),
172 KEY meta_key (meta_key)
173 ) $charset_collate;";
176 * Create WordPress options and set the default values.
180 * @uses $wp_db_version
182 function populate_options() {
183 global $wpdb, $wp_db_version;
185 $guessurl = wp_guess_url();
187 do_action('populate_options');
189 if ( ini_get('safe_mode') ) {
190 // Safe mode can break mkdir() so use a flat structure by default.
191 $uploads_use_yearmonth_folders = 0;
193 $uploads_use_yearmonth_folders = 1;
197 'siteurl' => $guessurl,
198 'blogname' => __('My Blog'),
199 'blogdescription' => __('Just another WordPress weblog'),
200 'users_can_register' => 0,
201 'admin_email' => 'you@example.com',
202 'start_of_week' => 1,
203 'use_balanceTags' => 0,
205 'require_name_email' => 1,
206 'comments_notify' => 1,
207 'posts_per_rss' => 10,
208 'rss_use_excerpt' => 0,
209 'mailserver_url' => 'mail.example.com',
210 'mailserver_login' => 'login@example.com',
211 'mailserver_pass' => 'password',
212 'mailserver_port' => 110,
213 'default_category' => 1,
214 'default_comment_status' => 'open',
215 'default_ping_status' => 'open',
216 'default_pingback_flag' => 1,
217 'default_post_edit_rows' => 10,
218 'posts_per_page' => 10,
219 /* translators: default date format, see http://php.net/date */
220 'date_format' => __('F j, Y'),
221 /* translators: default time format, see http://php.net/date */
222 'time_format' => __('g:i a'),
223 /* translators: links last updated date format, see http://php.net/date */
224 'links_updated_date_format' => __('F j, Y g:i a'),
225 'links_recently_updated_prepend' => '<em>',
226 'links_recently_updated_append' => '</em>',
227 'links_recently_updated_time' => 120,
228 'comment_moderation' => 0,
229 'moderation_notify' => 1,
230 'permalink_structure' => '',
231 'gzipcompression' => 0,
233 'blog_charset' => 'UTF-8',
234 'moderation_keys' => '',
235 'active_plugins' => array(),
237 'category_base' => '',
238 'ping_sites' => 'http://rpc.pingomatic.com/',
239 'advanced_edit' => 0,
240 'comment_max_links' => 2,
241 'gmt_offset' => date('Z') / 3600,
244 'default_email_category' => 1,
245 'recently_edited' => '',
246 'use_linksupdate' => 0,
247 'template' => 'default',
248 'stylesheet' => 'default',
249 'comment_whitelist' => 1,
250 'blacklist_keys' => '',
251 'comment_registration' => 0,
252 'rss_language' => 'en',
253 'html_type' => 'text/html',
256 'use_trackback' => 0,
259 'default_role' => 'subscriber',
260 'db_version' => $wp_db_version,
263 'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders,
267 'secret' => wp_generate_password(64),
270 'blog_public' => '1',
271 'default_link_category' => 2,
272 'show_on_front' => 'posts',
278 'show_avatars' => '1',
279 'avatar_rating' => 'G',
280 'upload_url_path' => '',
281 'thumbnail_size_w' => 150,
282 'thumbnail_size_h' => 150,
283 'thumbnail_crop' => 1,
284 'medium_size_w' => 300,
285 'medium_size_h' => 300,
288 'avatar_default' => 'mystery',
290 'enable_xmlrpc' => 0,
293 'large_size_w' => 1024,
294 'large_size_h' => 1024,
295 'image_default_link_type' => 'file',
296 'image_default_size' => '',
297 'image_default_align' => '',
298 'close_comments_for_old_posts' => 0,
299 'close_comments_days_old' => 14,
300 'thread_comments' => 0,
301 'thread_comments_depth' => 5,
302 'page_comments' => 1,
303 'comments_per_page' => 50,
304 'default_comments_page' => 'newest',
305 'comment_order' => 'asc',
306 'sticky_posts' => array(),
307 'widget_categories' => array(),
308 'widget_text' => array(),
309 'widget_rss' => array(),
312 'timezone_string' => '',
315 'embed_autourls' => 1,
316 'embed_size_w' => '',
317 'embed_size_h' => 600,
320 // Set autoload to no for these options
321 $fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' );
323 $existing_options = $wpdb->get_col("SELECT option_name FROM $wpdb->options");
326 foreach ( $options as $option => $value ) {
327 if ( in_array($option, $existing_options) )
329 if ( in_array($option, $fat_options) )
334 $option = $wpdb->escape($option);
335 if ( is_array($value) )
336 $value = serialize($value);
337 $value = $wpdb->escape($value);
338 if ( !empty($insert) )
340 $insert .= "('$option', '$value', '$autoload')";
343 if ( !empty($insert) )
344 $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert);
346 // in case it is set, but blank, update "home"
347 if ( !__get_option('home') ) update_option('home', $guessurl);
349 // Delete unused options
350 $unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins', 'can_compress_scripts',
351 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron', 'random_seed', 'rss_excerpt_length');
352 foreach ($unusedoptions as $option)
353 delete_option($option);
355 // delete obsolete magpie stuff
356 $wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'");
360 * Execute WordPress role creation for the various WordPress versions.
364 function populate_roles() {
365 populate_roles_160();
366 populate_roles_210();
367 populate_roles_230();
368 populate_roles_250();
369 populate_roles_260();
370 populate_roles_270();
371 populate_roles_280();
375 * Create the roles for WordPress 2.0
379 function populate_roles_160() {
382 // Dummy gettext calls to get strings in the catalog.
383 /* translators: user role */
384 _x('Administrator', 'User role');
385 /* translators: user role */
386 _x('Editor', 'User role');
387 /* translators: user role */
388 _x('Author', 'User role');
389 /* translators: user role */
390 _x('Contributor', 'User role');
391 /* translators: user role */
392 _x('Subscriber', 'User role');
394 add_role('administrator', 'Administrator');
395 add_role('editor', 'Editor');
396 add_role('author', 'Author');
397 add_role('contributor', 'Contributor');
398 add_role('subscriber', 'Subscriber');
400 // Add caps for Administrator role
401 $role =& get_role('administrator');
402 $role->add_cap('switch_themes');
403 $role->add_cap('edit_themes');
404 $role->add_cap('activate_plugins');
405 $role->add_cap('edit_plugins');
406 $role->add_cap('edit_users');
407 $role->add_cap('edit_files');
408 $role->add_cap('manage_options');
409 $role->add_cap('moderate_comments');
410 $role->add_cap('manage_categories');
411 $role->add_cap('manage_links');
412 $role->add_cap('upload_files');
413 $role->add_cap('import');
414 $role->add_cap('unfiltered_html');
415 $role->add_cap('edit_posts');
416 $role->add_cap('edit_others_posts');
417 $role->add_cap('edit_published_posts');
418 $role->add_cap('publish_posts');
419 $role->add_cap('edit_pages');
420 $role->add_cap('read');
421 $role->add_cap('level_10');
422 $role->add_cap('level_9');
423 $role->add_cap('level_8');
424 $role->add_cap('level_7');
425 $role->add_cap('level_6');
426 $role->add_cap('level_5');
427 $role->add_cap('level_4');
428 $role->add_cap('level_3');
429 $role->add_cap('level_2');
430 $role->add_cap('level_1');
431 $role->add_cap('level_0');
433 // Add caps for Editor role
434 $role =& get_role('editor');
435 $role->add_cap('moderate_comments');
436 $role->add_cap('manage_categories');
437 $role->add_cap('manage_links');
438 $role->add_cap('upload_files');
439 $role->add_cap('unfiltered_html');
440 $role->add_cap('edit_posts');
441 $role->add_cap('edit_others_posts');
442 $role->add_cap('edit_published_posts');
443 $role->add_cap('publish_posts');
444 $role->add_cap('edit_pages');
445 $role->add_cap('read');
446 $role->add_cap('level_7');
447 $role->add_cap('level_6');
448 $role->add_cap('level_5');
449 $role->add_cap('level_4');
450 $role->add_cap('level_3');
451 $role->add_cap('level_2');
452 $role->add_cap('level_1');
453 $role->add_cap('level_0');
455 // Add caps for Author role
456 $role =& get_role('author');
457 $role->add_cap('upload_files');
458 $role->add_cap('edit_posts');
459 $role->add_cap('edit_published_posts');
460 $role->add_cap('publish_posts');
461 $role->add_cap('read');
462 $role->add_cap('level_2');
463 $role->add_cap('level_1');
464 $role->add_cap('level_0');
466 // Add caps for Contributor role
467 $role =& get_role('contributor');
468 $role->add_cap('edit_posts');
469 $role->add_cap('read');
470 $role->add_cap('level_1');
471 $role->add_cap('level_0');
473 // Add caps for Subscriber role
474 $role =& get_role('subscriber');
475 $role->add_cap('read');
476 $role->add_cap('level_0');
480 * Create and modify WordPress roles for WordPress 2.1.
484 function populate_roles_210() {
485 $roles = array('administrator', 'editor');
486 foreach ($roles as $role) {
487 $role =& get_role($role);
491 $role->add_cap('edit_others_pages');
492 $role->add_cap('edit_published_pages');
493 $role->add_cap('publish_pages');
494 $role->add_cap('delete_pages');
495 $role->add_cap('delete_others_pages');
496 $role->add_cap('delete_published_pages');
497 $role->add_cap('delete_posts');
498 $role->add_cap('delete_others_posts');
499 $role->add_cap('delete_published_posts');
500 $role->add_cap('delete_private_posts');
501 $role->add_cap('edit_private_posts');
502 $role->add_cap('read_private_posts');
503 $role->add_cap('delete_private_pages');
504 $role->add_cap('edit_private_pages');
505 $role->add_cap('read_private_pages');
508 $role =& get_role('administrator');
509 if ( ! empty($role) ) {
510 $role->add_cap('delete_users');
511 $role->add_cap('create_users');
514 $role =& get_role('author');
515 if ( ! empty($role) ) {
516 $role->add_cap('delete_posts');
517 $role->add_cap('delete_published_posts');
520 $role =& get_role('contributor');
521 if ( ! empty($role) ) {
522 $role->add_cap('delete_posts');
527 * Create and modify WordPress roles for WordPress 2.3.
531 function populate_roles_230() {
532 $role =& get_role( 'administrator' );
534 if ( !empty( $role ) ) {
535 $role->add_cap( 'unfiltered_upload' );
540 * Create and modify WordPress roles for WordPress 2.5.
544 function populate_roles_250() {
545 $role =& get_role( 'administrator' );
547 if ( !empty( $role ) ) {
548 $role->add_cap( 'edit_dashboard' );
553 * Create and modify WordPress roles for WordPress 2.6.
557 function populate_roles_260() {
558 $role =& get_role( 'administrator' );
560 if ( !empty( $role ) ) {
561 $role->add_cap( 'update_plugins' );
562 $role->add_cap( 'delete_plugins' );
567 * Create and modify WordPress roles for WordPress 2.7.
571 function populate_roles_270() {
572 $role =& get_role( 'administrator' );
574 if ( !empty( $role ) ) {
575 $role->add_cap( 'install_plugins' );
576 $role->add_cap( 'update_themes' );
581 * Create and modify WordPress roles for WordPress 2.8.
585 function populate_roles_280() {
586 $role =& get_role( 'administrator' );
588 if ( !empty( $role ) ) {
589 $role->add_cap( 'install_themes' );