X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/76aea3697c6043c1613370f172395b4f65ee71f0..refs/tags/wordpress-2.9:/wp-admin/includes/schema.php diff --git a/wp-admin/includes/schema.php b/wp-admin/includes/schema.php index 7162b42b..e7d37f4c 100644 --- a/wp-admin/includes/schema.php +++ b/wp-admin/includes/schema.php @@ -1,20 +1,32 @@ supports_collation() ) { - if ( ! empty($wpdb->charset) ) - $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; - if ( ! empty($wpdb->collate) ) - $charset_collate .= " COLLATE $wpdb->collate"; -} +if ( ! empty($wpdb->charset) ) + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; +if ( ! empty($wpdb->collate) ) + $charset_collate .= " COLLATE $wpdb->collate"; -$wp_queries="CREATE TABLE $wpdb->terms ( - term_id bigint(20) NOT NULL auto_increment, +/** Create WordPress database tables SQL */ +$wp_queries = "CREATE TABLE $wpdb->terms ( + term_id bigint(20) unsigned NOT NULL auto_increment, name varchar(200) NOT NULL default '', slug varchar(200) NOT NULL default '', term_group bigint(10) NOT NULL default 0, @@ -23,25 +35,35 @@ $wp_queries="CREATE TABLE $wpdb->terms ( KEY name (name) ) $charset_collate; CREATE TABLE $wpdb->term_taxonomy ( - term_taxonomy_id bigint(20) NOT NULL auto_increment, - term_id bigint(20) NOT NULL default 0, + term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment, + term_id bigint(20) unsigned NOT NULL default 0, taxonomy varchar(32) NOT NULL default '', description longtext NOT NULL, - parent bigint(20) NOT NULL default 0, + parent bigint(20) unsigned NOT NULL default 0, count bigint(20) NOT NULL default 0, PRIMARY KEY (term_taxonomy_id), - UNIQUE KEY term_id_taxonomy (term_id,taxonomy) + UNIQUE KEY term_id_taxonomy (term_id,taxonomy), + KEY taxonomy (taxonomy) ) $charset_collate; CREATE TABLE $wpdb->term_relationships ( - object_id bigint(20) NOT NULL default 0, - term_taxonomy_id bigint(20) NOT NULL default 0, + object_id bigint(20) unsigned NOT NULL default 0, + term_taxonomy_id bigint(20) unsigned NOT NULL default 0, term_order int(11) NOT NULL default 0, PRIMARY KEY (object_id,term_taxonomy_id), KEY term_taxonomy_id (term_taxonomy_id) ) $charset_collate; +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), + KEY comment_id (comment_id), + KEY meta_key (meta_key) +) $charset_collate; CREATE TABLE $wpdb->comments ( comment_ID bigint(20) unsigned NOT NULL auto_increment, - comment_post_ID int(11) NOT NULL default '0', + comment_post_ID bigint(20) unsigned NOT NULL default '0', comment_author tinytext NOT NULL, comment_author_email varchar(100) NOT NULL default '', comment_author_url varchar(200) NOT NULL default '', @@ -53,8 +75,8 @@ CREATE TABLE $wpdb->comments ( comment_approved varchar(20) NOT NULL default '1', comment_agent varchar(255) NOT NULL default '', comment_type varchar(20) NOT NULL default '', - comment_parent bigint(20) NOT NULL default '0', - user_id bigint(20) NOT NULL default '0', + comment_parent bigint(20) unsigned NOT NULL default '0', + user_id bigint(20) unsigned NOT NULL default '0', PRIMARY KEY (comment_ID), KEY comment_approved (comment_approved), KEY comment_post_ID (comment_post_ID), @@ -62,36 +84,34 @@ CREATE TABLE $wpdb->comments ( KEY comment_date_gmt (comment_date_gmt) ) $charset_collate; CREATE TABLE $wpdb->links ( - link_id bigint(20) NOT NULL auto_increment, + link_id bigint(20) unsigned NOT NULL auto_increment, link_url varchar(255) NOT NULL default '', link_name varchar(255) NOT NULL default '', link_image varchar(255) NOT NULL default '', link_target varchar(25) NOT NULL default '', - link_category bigint(20) NOT NULL default '0', link_description varchar(255) NOT NULL default '', link_visible varchar(20) NOT NULL default 'Y', - link_owner int(11) NOT NULL default '1', + link_owner bigint(20) unsigned NOT NULL default '1', link_rating int(11) NOT NULL default '0', link_updated datetime NOT NULL default '0000-00-00 00:00:00', link_rel varchar(255) NOT NULL default '', link_notes mediumtext NOT NULL, link_rss varchar(255) NOT NULL default '', PRIMARY KEY (link_id), - KEY link_category (link_category), KEY link_visible (link_visible) ) $charset_collate; CREATE TABLE $wpdb->options ( - option_id bigint(20) NOT NULL auto_increment, + option_id bigint(20) unsigned NOT NULL auto_increment, blog_id int(11) NOT NULL default '0', option_name varchar(64) NOT NULL default '', option_value longtext NOT NULL, autoload varchar(20) NOT NULL default 'yes', - PRIMARY KEY (option_id,blog_id,option_name), - KEY option_name (option_name) + PRIMARY KEY (option_id), + UNIQUE KEY option_name (option_name) ) $charset_collate; CREATE TABLE $wpdb->postmeta ( - meta_id bigint(20) NOT NULL auto_increment, - post_id bigint(20) NOT NULL default '0', + meta_id bigint(20) unsigned NOT NULL auto_increment, + post_id bigint(20) unsigned NOT NULL default '0', meta_key varchar(255) default NULL, meta_value longtext, PRIMARY KEY (meta_id), @@ -100,12 +120,11 @@ CREATE TABLE $wpdb->postmeta ( ) $charset_collate; CREATE TABLE $wpdb->posts ( ID bigint(20) unsigned NOT NULL auto_increment, - post_author bigint(20) NOT NULL default '0', + post_author bigint(20) unsigned NOT NULL default '0', post_date datetime NOT NULL default '0000-00-00 00:00:00', post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00', post_content longtext NOT NULL, post_title text NOT NULL, - post_category int(4) NOT NULL default '0', post_excerpt text NOT NULL, post_status varchar(20) NOT NULL default 'publish', comment_status varchar(20) NOT NULL default 'open', @@ -117,7 +136,7 @@ CREATE TABLE $wpdb->posts ( post_modified datetime NOT NULL default '0000-00-00 00:00:00', post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00', post_content_filtered text NOT NULL, - post_parent bigint(20) NOT NULL default '0', + post_parent bigint(20) unsigned NOT NULL default '0', guid varchar(255) NOT NULL default '', menu_order int(11) NOT NULL default '0', post_type varchar(20) NOT NULL default 'post', @@ -125,7 +144,8 @@ CREATE TABLE $wpdb->posts ( comment_count bigint(20) NOT NULL default '0', PRIMARY KEY (ID), KEY post_name (post_name), - KEY type_status_date (post_type,post_status,post_date,ID) + KEY type_status_date (post_type,post_status,post_date,ID), + KEY post_parent (post_parent) ) $charset_collate; CREATE TABLE $wpdb->users ( ID bigint(20) unsigned NOT NULL auto_increment, @@ -143,8 +163,8 @@ CREATE TABLE $wpdb->users ( KEY user_nicename (user_nicename) ) $charset_collate; CREATE TABLE $wpdb->usermeta ( - umeta_id bigint(20) NOT NULL auto_increment, - user_id bigint(20) NOT NULL default '0', + umeta_id bigint(20) unsigned NOT NULL auto_increment, + user_id bigint(20) unsigned NOT NULL default '0', meta_key varchar(255) default NULL, meta_value longtext, PRIMARY KEY (umeta_id), @@ -152,151 +172,233 @@ CREATE TABLE $wpdb->usermeta ( KEY meta_key (meta_key) ) $charset_collate;"; +/** + * Create WordPress options and set the default values. + * + * @since 1.5.0 + * @uses $wpdb + * @uses $wp_db_version + */ function populate_options() { global $wpdb, $wp_db_version; - + $guessurl = wp_guess_url(); - + do_action('populate_options'); - - add_option('siteurl', $guessurl); - add_option('blogname', __('My Blog')); - add_option('blogdescription', __('Just another WordPress weblog')); - add_option('users_can_register', 0); - add_option('admin_email', 'you@example.com'); - add_option('start_of_week', 1); - add_option('use_balanceTags', 0); - add_option('use_smilies', 1); - add_option('require_name_email', 1); - add_option('comments_notify', 1); - add_option('posts_per_rss', 10); - add_option('rss_excerpt_length', 50); - add_option('rss_use_excerpt', 0); - add_option('mailserver_url', 'mail.example.com'); - add_option('mailserver_login', 'login@example.com'); - add_option('mailserver_pass', 'password'); - add_option('mailserver_port', 110); - add_option('default_category', 1); - add_option('default_comment_status', 'open'); - add_option('default_ping_status', 'open'); - add_option('default_pingback_flag', 1); - add_option('default_post_edit_rows', 10); - add_option('posts_per_page', 10); - add_option('what_to_show', 'posts'); - add_option('date_format', __('F j, Y')); - add_option('time_format', __('g:i a')); - add_option('links_updated_date_format', __('F j, Y g:i a')); - add_option('links_recently_updated_prepend', ''); - add_option('links_recently_updated_append', ''); - add_option('links_recently_updated_time', 120); - add_option('comment_moderation', 0); - add_option('moderation_notify', 1); - add_option('permalink_structure'); - add_option('gzipcompression', 0); - add_option('hack_file', 0); - add_option('blog_charset', 'UTF-8'); - add_option('moderation_keys'); - add_option('active_plugins'); - add_option('home', $guessurl); - // in case it is set, but blank, update "home" - if ( !__get_option('home') ) update_option('home', $guessurl); - add_option('category_base'); - add_option('ping_sites', 'http://rpc.pingomatic.com/'); - add_option('advanced_edit', 0); - add_option('comment_max_links', 2); - add_option('gmt_offset', date('Z') / 3600); + + if ( ini_get('safe_mode') ) { + // Safe mode can break mkdir() so use a flat structure by default. + $uploads_use_yearmonth_folders = 0; + } else { + $uploads_use_yearmonth_folders = 1; + } + + $options = array( + 'siteurl' => $guessurl, + 'blogname' => __('My Blog'), + 'blogdescription' => __('Just another WordPress weblog'), + 'users_can_register' => 0, + 'admin_email' => 'you@example.com', + 'start_of_week' => 1, + '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, + 'default_post_edit_rows' => 10, + 'posts_per_page' => 10, + /* translators: default date format, see http://php.net/date */ + 'date_format' => __('F j, Y'), + /* translators: default time format, see http://php.net/date */ + 'time_format' => __('g:i a'), + /* translators: links last updated date format, see http://php.net/date */ + 'links_updated_date_format' => __('F j, Y g:i a'), + 'links_recently_updated_prepend' => '', + 'links_recently_updated_append' => '', + 'links_recently_updated_time' => 120, + 'comment_moderation' => 0, + 'moderation_notify' => 1, + 'permalink_structure' => '', + 'gzipcompression' => 0, + 'hack_file' => 0, + 'blog_charset' => 'UTF-8', + 'moderation_keys' => '', + 'active_plugins' => array(), + 'home' => $guessurl, + 'category_base' => '', + 'ping_sites' => 'http://rpc.pingomatic.com/', + 'advanced_edit' => 0, + 'comment_max_links' => 2, + 'gmt_offset' => date('Z') / 3600, + // 1.5 - add_option('default_email_category', 1); - add_option('recently_edited'); - add_option('use_linksupdate', 0); - add_option('template', 'default'); - add_option('stylesheet', 'default'); - add_option('comment_whitelist', 1); - add_option('page_uris'); - add_option('blacklist_keys'); - add_option('comment_registration', 0); - add_option('rss_language', 'en'); - add_option('html_type', 'text/html'); + 'default_email_category' => 1, + 'recently_edited' => '', + 'use_linksupdate' => 0, + 'template' => 'default', + 'stylesheet' => 'default', + 'comment_whitelist' => 1, + 'blacklist_keys' => '', + 'comment_registration' => 0, + 'rss_language' => 'en', + 'html_type' => 'text/html', + // 1.5.1 - add_option('use_trackback', 0); + 'use_trackback' => 0, + // 2.0 - add_option('default_role', 'subscriber'); - add_option('db_version', $wp_db_version); + 'default_role' => 'subscriber', + 'db_version' => $wp_db_version, + // 2.0.1 - if ( ini_get('safe_mode') ) { - // Safe mode screws up mkdir(), so we must use a flat structure. - add_option('uploads_use_yearmonth_folders', 0); - add_option('upload_path', WP_CONTENT_DIR); - } else { - add_option('uploads_use_yearmonth_folders', 1); - add_option('upload_path', WP_CONTENT_DIR . '/uploads'); - } + 'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders, + 'upload_path' => '', // 2.0.3 - add_option('secret', wp_generate_password(64)); + 'secret' => wp_generate_password(64), // 2.1 - add_option('blog_public', '1'); - add_option('default_link_category', 2); - add_option('show_on_front', 'posts'); + 'blog_public' => '1', + 'default_link_category' => 2, + 'show_on_front' => 'posts', // 2.2 - add_option('tag_base'); + 'tag_base' => '', // 2.5 - add_option('show_avatars', '1'); - add_option('avatar_rating', 'G'); - add_option('upload_url_path', ''); - add_option('thumbnail_size_w', 150); - add_option('thumbnail_size_h', 150); - add_option('thumbnail_crop', 1); - add_option('medium_size_w', 300); - add_option('medium_size_h', 300); + 'show_avatars' => '1', + 'avatar_rating' => 'G', + 'upload_url_path' => '', + 'thumbnail_size_w' => 150, + 'thumbnail_size_h' => 150, + 'thumbnail_crop' => 1, + 'medium_size_w' => 300, + 'medium_size_h' => 300, // 2.6 - add_option('avatar_default', 'mystery'); - add_option('enable_app', 0); - add_option('enable_xmlrpc', 0); - + 'avatar_default' => 'mystery', + 'enable_app' => 0, + 'enable_xmlrpc' => 0, + + // 2.7 + 'large_size_w' => 1024, + 'large_size_h' => 1024, + 'image_default_link_type' => 'file', + 'image_default_size' => '', + 'image_default_align' => '', + 'close_comments_for_old_posts' => 0, + 'close_comments_days_old' => 14, + 'thread_comments' => 0, + 'thread_comments_depth' => 5, + 'page_comments' => 1, + 'comments_per_page' => 50, + 'default_comments_page' => 'newest', + 'comment_order' => 'asc', + 'sticky_posts' => array(), + 'widget_categories' => array(), + 'widget_text' => array(), + 'widget_rss' => array(), + + // 2.8 + 'timezone_string' => '', + + // 2.9 + 'embed_autourls' => 1, + 'embed_size_w' => '', + 'embed_size_h' => 600, + ); + + // Set autoload to no for these options + $fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' ); + + $existing_options = $wpdb->get_col("SELECT option_name FROM $wpdb->options"); + + $insert = ''; + foreach ( $options as $option => $value ) { + if ( in_array($option, $existing_options) ) + continue; + if ( in_array($option, $fat_options) ) + $autoload = 'no'; + else + $autoload = 'yes'; + + $option = $wpdb->escape($option); + if ( is_array($value) ) + $value = serialize($value); + $value = $wpdb->escape($value); + if ( !empty($insert) ) + $insert .= ', '; + $insert .= "('$option', '$value', '$autoload')"; + } + + if ( !empty($insert) ) + $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert); + + // in case it is set, but blank, update "home" + if ( !__get_option('home') ) update_option('home', $guessurl); + // Delete unused options - $unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins'); - foreach ($unusedoptions as $option) : + $unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins', 'can_compress_scripts', + 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron', 'random_seed', 'rss_excerpt_length'); + foreach ($unusedoptions as $option) delete_option($option); - endforeach; - - // Set up a few options not to load by default - $fatoptions = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' ); - foreach ($fatoptions as $fatoption) : - $wpdb->query("UPDATE $wpdb->options SET `autoload` = 'no' WHERE option_name = '$fatoption'"); - endforeach; + + // delete obsolete magpie stuff + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'"); } +/** + * Execute WordPress role creation for the various WordPress versions. + * + * @since 2.0.0 + */ function populate_roles() { populate_roles_160(); populate_roles_210(); populate_roles_230(); populate_roles_250(); populate_roles_260(); + populate_roles_270(); + populate_roles_280(); } +/** + * Create the roles for WordPress 2.0 + * + * @since 2.0.0 + */ function populate_roles_160() { // Add roles // Dummy gettext calls to get strings in the catalog. - _c('Administrator|User role'); - _c('Editor|User role'); - _c('Author|User role'); - _c('Contributor|User role'); - _c('Subscriber|User role'); - - add_role('administrator', 'Administrator|User role'); - add_role('editor', 'Editor|User role'); - add_role('author', 'Author|User role'); - add_role('contributor', 'Contributor|User role'); - add_role('subscriber', 'Subscriber|User role'); + /* 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'); + + add_role('administrator', 'Administrator'); + add_role('editor', 'Editor'); + add_role('author', 'Author'); + add_role('contributor', 'Contributor'); + add_role('subscriber', 'Subscriber'); // Add caps for Administrator role - $role = get_role('administrator'); + $role =& get_role('administrator'); $role->add_cap('switch_themes'); $role->add_cap('edit_themes'); $role->add_cap('activate_plugins'); @@ -329,7 +431,7 @@ function populate_roles_160() { $role->add_cap('level_0'); // Add caps for Editor role - $role = get_role('editor'); + $role =& get_role('editor'); $role->add_cap('moderate_comments'); $role->add_cap('manage_categories'); $role->add_cap('manage_links'); @@ -351,7 +453,7 @@ function populate_roles_160() { $role->add_cap('level_0'); // Add caps for Author role - $role = get_role('author'); + $role =& get_role('author'); $role->add_cap('upload_files'); $role->add_cap('edit_posts'); $role->add_cap('edit_published_posts'); @@ -362,22 +464,27 @@ function populate_roles_160() { $role->add_cap('level_0'); // Add caps for Contributor role - $role = get_role('contributor'); + $role =& get_role('contributor'); $role->add_cap('edit_posts'); $role->add_cap('read'); $role->add_cap('level_1'); $role->add_cap('level_0'); // Add caps for Subscriber role - $role = get_role('subscriber'); + $role =& get_role('subscriber'); $role->add_cap('read'); $role->add_cap('level_0'); } +/** + * Create and modify WordPress roles for WordPress 2.1. + * + * @since 2.1.0 + */ function populate_roles_210() { $roles = array('administrator', 'editor'); foreach ($roles as $role) { - $role = get_role($role); + $role =& get_role($role); if ( empty($role) ) continue; @@ -398,42 +505,57 @@ function populate_roles_210() { $role->add_cap('read_private_pages'); } - $role = get_role('administrator'); + $role =& get_role('administrator'); if ( ! empty($role) ) { $role->add_cap('delete_users'); $role->add_cap('create_users'); } - $role = get_role('author'); + $role =& get_role('author'); if ( ! empty($role) ) { $role->add_cap('delete_posts'); $role->add_cap('delete_published_posts'); } - $role = get_role('contributor'); + $role =& get_role('contributor'); if ( ! empty($role) ) { $role->add_cap('delete_posts'); } } +/** + * Create and modify WordPress roles for WordPress 2.3. + * + * @since 2.3.0 + */ function populate_roles_230() { - $role = get_role( 'administrator' ); + $role =& get_role( 'administrator' ); if ( !empty( $role ) ) { $role->add_cap( 'unfiltered_upload' ); } } +/** + * Create and modify WordPress roles for WordPress 2.5. + * + * @since 2.5.0 + */ function populate_roles_250() { - $role = get_role( 'administrator' ); + $role =& get_role( 'administrator' ); if ( !empty( $role ) ) { $role->add_cap( 'edit_dashboard' ); } } +/** + * Create and modify WordPress roles for WordPress 2.6. + * + * @since 2.6.0 + */ function populate_roles_260() { - $role = get_role( 'administrator' ); + $role =& get_role( 'administrator' ); if ( !empty( $role ) ) { $role->add_cap( 'update_plugins' ); @@ -441,4 +563,31 @@ function populate_roles_260() { } } +/** + * Create and modify WordPress roles for WordPress 2.7. + * + * @since 2.7.0 + */ +function populate_roles_270() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'install_plugins' ); + $role->add_cap( 'update_themes' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.8. + * + * @since 2.8.0 + */ +function populate_roles_280() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'install_themes' ); + } +} + ?>