]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-admin/includes/upgrade.php
Wordpress 3.0-scripts
[autoinstalls/wordpress.git] / wp-admin / includes / upgrade.php
1 <?php
2 /**
3  * WordPress Upgrade API
4  *
5  * Most of the functions are pluggable and can be overwritten
6  *
7  * @package WordPress
8  * @subpackage Administration
9  */
10
11 /** Include user install customize script. */
12 if ( file_exists(WP_CONTENT_DIR . '/install.php') )
13         require (WP_CONTENT_DIR . '/install.php');
14
15 /** WordPress Administration API */
16 require_once(ABSPATH . 'wp-admin/includes/admin.php');
17
18 /** WordPress Schema API */
19 require_once(ABSPATH . 'wp-admin/includes/schema.php');
20
21 if ( !function_exists('wp_install') ) :
22 /**
23  * Installs the blog
24  *
25  * {@internal Missing Long Description}}
26  *
27  * @since unknown
28  *
29  * @param string $blog_title Blog title.
30  * @param string $user_name User's username.
31  * @param string $user_email User's email.
32  * @param bool $public Whether blog is public.
33  * @param null $deprecated Optional. Not used.
34  * @param string $user_password Optional. User's chosen password. Will default to a random password.
35  * @return array Array keys 'url', 'user_id', 'password', 'password_message'.
36  */
37 function wp_install( $blog_title, $user_name, $user_email, $public, $deprecated = '', $user_password = '' ) {
38         global $wp_rewrite;
39
40         if ( !empty( $deprecated ) )
41                 _deprecated_argument( __FUNCTION__, '2.6' );
42
43         wp_check_mysql_version();
44         wp_cache_flush();
45         make_db_current_silent();
46         populate_options();
47         populate_roles();
48
49         update_option('blogname', $blog_title);
50         update_option('admin_email', $user_email);
51         update_option('blog_public', $public);
52
53         $guessurl = wp_guess_url();
54
55         update_option('siteurl', $guessurl);
56
57         // If not a public blog, don't ping.
58         if ( ! $public )
59                 update_option('default_pingback_flag', 0);
60
61         // Create default user.  If the user already exists, the user tables are
62         // being shared among blogs.  Just set the role in that case.
63         $user_id = username_exists($user_name);
64         $user_password = trim($user_password);
65         $email_password = false;
66         if ( !$user_id && empty($user_password) ) {
67                 $user_password = wp_generate_password();
68                 $message = __('<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you.');
69                 $user_id = wp_create_user($user_name, $user_password, $user_email);
70                 update_user_option($user_id, 'default_password_nag', true, true);
71                 $email_password = true;
72         } else if ( !$user_id ) {
73                 // Password has been provided
74                 $message = '<em>'.__('Your chosen password.').'</em>';
75                 $user_id = wp_create_user($user_name, $user_password, $user_email);
76         } else {
77                 $message =  __('User already exists. Password inherited.');
78         }
79
80         $user = new WP_User($user_id);
81         $user->set_role('administrator');
82
83         wp_install_defaults($user_id);
84
85         $wp_rewrite->flush_rules();
86
87         wp_new_blog_notification($blog_title, $guessurl, $user_id, ($email_password ? $user_password : __('The password you chose during the install.') ) );
88
89         wp_cache_flush();
90
91         return array('url' => $guessurl, 'user_id' => $user_id, 'password' => $user_password, 'password_message' => $message);
92 }
93 endif;
94
95 if ( !function_exists('wp_install_defaults') ) :
96 /**
97  * {@internal Missing Short Description}}
98  *
99  * {@internal Missing Long Description}}
100  *
101  * @since unknown
102  *
103  * @param int $user_id User ID.
104  */
105 function wp_install_defaults($user_id) {
106         global $wpdb, $wp_rewrite, $current_site, $table_prefix;
107
108         // Default category
109         $cat_name = __('Uncategorized');
110         /* translators: Default category slug */
111         $cat_slug = sanitize_title(_x('Uncategorized', 'Default category slug'));
112
113         if ( global_terms_enabled() ) {
114                 $cat_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) );
115                 if ( $cat_id == null ) {
116                         $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) );
117                         $cat_id = $wpdb->insert_id;
118                 }
119                 update_option('default_category', $cat_id);
120         } else {
121                 $cat_id = 1;
122         }
123
124         $wpdb->insert( $wpdb->terms, array('term_id' => $cat_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );
125         $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $cat_id, 'taxonomy' => 'category', 'description' => '', 'parent' => 0, 'count' => 1));
126         $cat_tt_id = $wpdb->insert_id;
127
128         // Default link category
129         $cat_name = __('Blogroll');
130         /* translators: Default link category slug */
131         $cat_slug = sanitize_title(_x('Blogroll', 'Default link category slug'));
132
133         if ( global_terms_enabled() ) {
134                 $blogroll_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) );
135                 if ( $blogroll_id == null ) {
136                         $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) );
137                         $blogroll_id = $wpdb->insert_id;
138                 }
139                 update_option('default_link_category', $blogroll_id);
140         } else {
141                 $blogroll_id = 2;
142         }
143
144         $wpdb->insert( $wpdb->terms, array('term_id' => $blogroll_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );
145         $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $blogroll_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 7));
146         $blogroll_tt_id = $wpdb->insert_id;
147
148         // Now drop in some default links
149         $default_links = array();
150         $default_links[] = array(       'link_url' => 'http://codex.wordpress.org/',
151                                                                 'link_name' => 'Documentation',
152                                                                 'link_rss' => '',
153                                                                 'link_notes' => '');
154
155         $default_links[] = array(       'link_url' => 'http://wordpress.org/development/',
156                                                                 'link_name' => 'WordPress Blog',
157                                                                 'link_rss' => 'http://wordpress.org/development/feed/',
158                                                                 'link_notes' => '');
159
160         $default_links[] = array(       'link_url' => 'http://wordpress.org/extend/ideas/',
161                                                                 'link_name' => 'Suggest Ideas',
162                                                                 'link_rss' => '',
163                                                                 'link_notes' =>'');
164
165         $default_links[] = array(       'link_url' => 'http://wordpress.org/support/',
166                                                                 'link_name' => 'Support Forum',
167                                                                 'link_rss' => '',
168                                                                 'link_notes' =>'');
169
170         $default_links[] = array(       'link_url' => 'http://wordpress.org/extend/plugins/',
171                                                                 'link_name' => 'Plugins',
172                                                                 'link_rss' => '',
173                                                                 'link_notes' =>'');
174
175         $default_links[] = array(       'link_url' => 'http://wordpress.org/extend/themes/',
176                                                                 'link_name' => 'Themes',
177                                                                 'link_rss' => '',
178                                                                 'link_notes' =>'');
179
180         $default_links[] = array(       'link_url' => 'http://planet.wordpress.org/',
181                                                                 'link_name' => 'WordPress Planet',
182                                                                 'link_rss' => '',
183                                                                 'link_notes' =>'');
184
185         foreach ( $default_links as $link ) {
186                 $wpdb->insert( $wpdb->links, $link);
187                 $wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $blogroll_tt_id, 'object_id' => $wpdb->insert_id) );
188         }
189
190         // First post
191         $now = date('Y-m-d H:i:s');
192         $now_gmt = gmdate('Y-m-d H:i:s');
193         $first_post_guid = get_option('home') . '/?p=1';
194
195         if ( is_multisite() ) {
196                 $first_post = get_site_option( 'first_post' );
197
198                 if ( empty($first_post) )
199                         $first_post = stripslashes( __( 'Welcome to <a href="SITE_URL">SITE_NAME</a>. This is your first post. Edit or delete it, then start blogging!' ) );
200
201                 $first_post = str_replace( "SITE_URL", esc_url( network_home_url() ), $first_post );
202                 $first_post = str_replace( "SITE_NAME", $current_site->site_name, $first_post );
203         } else {
204                 $first_post = __('Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!');
205         }
206
207         $wpdb->insert( $wpdb->posts, array(
208                                                                 'post_author' => $user_id,
209                                                                 'post_date' => $now,
210                                                                 'post_date_gmt' => $now_gmt,
211                                                                 'post_content' => $first_post,
212                                                                 'post_excerpt' => '',
213                                                                 'post_title' => __('Hello world!'),
214                                                                 /* translators: Default post slug */
215                                                                 'post_name' => sanitize_title( _x('hello-world', 'Default post slug') ),
216                                                                 'post_modified' => $now,
217                                                                 'post_modified_gmt' => $now_gmt,
218                                                                 'guid' => $first_post_guid,
219                                                                 'comment_count' => 1,
220                                                                 'to_ping' => '',
221                                                                 'pinged' => '',
222                                                                 'post_content_filtered' => ''
223                                                                 ));
224         $wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $cat_tt_id, 'object_id' => 1) );
225
226         // Default comment
227         $first_comment_author = __('Mr WordPress');
228         $first_comment_url = 'http://wordpress.org/';
229         $first_comment = __('Hi, this is a comment.<br />To delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them.');
230         if ( is_multisite() ) {
231                 $first_comment_author = get_site_option( 'first_comment_author', $first_comment_author );
232                 $first_comment_url = get_site_option( 'first_comment_url', network_home_url() );
233                 $first_comment = get_site_option( 'first_comment', $first_comment );
234         }
235         $wpdb->insert( $wpdb->comments, array(
236                                                                 'comment_post_ID' => 1,
237                                                                 'comment_author' => $first_comment_author,
238                                                                 'comment_author_email' => '',
239                                                                 'comment_author_url' => $first_comment_url,
240                                                                 'comment_date' => $now,
241                                                                 'comment_date_gmt' => $now_gmt,
242                                                                 'comment_content' => $first_comment
243                                                                 ));
244
245         // First Page
246         $first_page = __('This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from. You can create as many pages like this one or sub-pages as you like and manage all of your content inside of WordPress.');
247         if ( is_multisite() )
248                 $first_page = get_site_option( 'first_page', $first_page );
249         $first_post_guid = get_option('home') . '/?page_id=2';
250         $wpdb->insert( $wpdb->posts, array(
251                                                                 'post_author' => $user_id,
252                                                                 'post_date' => $now,
253                                                                 'post_date_gmt' => $now_gmt,
254                                                                 'post_content' => $first_page,
255                                                                 'post_excerpt' => '',
256                                                                 'post_title' => __('About'),
257                                                                 /* translators: Default page slug */
258                                                                 'post_name' => _x('about', 'Default page slug'),
259                                                                 'post_modified' => $now,
260                                                                 'post_modified_gmt' => $now_gmt,
261                                                                 'guid' => $first_post_guid,
262                                                                 'post_type' => 'page',
263                                                                 'to_ping' => '',
264                                                                 'pinged' => '',
265                                                                 'post_content_filtered' => ''
266                                                                 ));
267         $wpdb->insert( $wpdb->postmeta, array( 'post_id' => 2, 'meta_key' => '_wp_page_template', 'meta_value' => 'default' ) );
268
269         // Setup default widgets for default theme.
270         update_option( 'widget_search', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );
271         update_option( 'widget_recent-posts', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );
272         update_option( 'widget_recent-comments', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );
273         update_option( 'widget_archives', array ( 2 => array ( 'title' => '', 'count' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );
274         update_option( 'widget_categories', array ( 2 => array ( 'title' => '', 'count' => 0, 'hierarchical' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );
275         update_option( 'widget_meta', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );
276         update_option( 'sidebars_widgets', array ( 'wp_inactive_widgets' => array ( ), 'primary-widget-area' => array ( 0 => 'search-2', 1 => 'recent-posts-2', 2 => 'recent-comments-2', 3 => 'archives-2', 4 => 'categories-2', 5 => 'meta-2', ), 'secondary-widget-area' => array ( ), 'first-footer-widget-area' => array ( ), 'second-footer-widget-area' => array ( ), 'third-footer-widget-area' => array ( ), 'fourth-footer-widget-area' => array ( ), 'array_version' => 3 ) );
277
278         if ( is_multisite() ) {
279                 // Flush rules to pick up the new page.
280                 $wp_rewrite->init();
281                 $wp_rewrite->flush_rules();
282
283                 $user = new WP_User($user_id);
284                 $wpdb->update( $wpdb->options, array('option_value' => $user->user_email), array('option_name' => 'admin_email') );
285
286                 // Remove all perms except for the login user.
287                 $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'user_level') );
288                 $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'capabilities') );
289
290                 // Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) TODO: Get previous_blog_id.
291                 if ( !is_super_admin( $user_id ) && $user_id != 1 )
292                         $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $wpdb->base_prefix.'1_capabilities') );
293         }
294 }
295 endif;
296
297 if ( !function_exists('wp_new_blog_notification') ) :
298 /**
299  * {@internal Missing Short Description}}
300  *
301  * {@internal Missing Long Description}}
302  *
303  * @since unknown
304  *
305  * @param string $blog_title Blog title.
306  * @param string $blog_url Blog url.
307  * @param int $user_id User ID.
308  * @param string $password User's Password.
309  */
310 function wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) {
311         $user = new WP_User($user_id);
312         $email = $user->user_email;
313         $name = $user->user_login;
314         $message = sprintf(__("Your new WordPress site has been successfully set up at:
315
316 %1\$s
317
318 You can log in to the administrator account with the following information:
319
320 Username: %2\$s
321 Password: %3\$s
322
323 We hope you enjoy your new site. Thanks!
324
325 --The WordPress Team
326 http://wordpress.org/
327 "), $blog_url, $name, $password);
328
329         @wp_mail($email, __('New WordPress Site'), $message);
330 }
331 endif;
332
333 if ( !function_exists('wp_upgrade') ) :
334 /**
335  * Run WordPress Upgrade functions.
336  *
337  * {@internal Missing Long Description}}
338  *
339  * @since unknown
340  *
341  * @return null
342  */
343 function wp_upgrade() {
344         global $wp_current_db_version, $wp_db_version, $wpdb;
345
346         $wp_current_db_version = __get_option('db_version');
347
348         // We are up-to-date.  Nothing to do.
349         if ( $wp_db_version == $wp_current_db_version )
350                 return;
351
352         if ( ! is_blog_installed() )
353                 return;
354
355         wp_check_mysql_version();
356         wp_cache_flush();
357         pre_schema_upgrade();
358         make_db_current_silent();
359         upgrade_all();
360         if ( is_multisite() && is_main_site() )
361                 upgrade_network();
362         wp_cache_flush();
363
364         if ( is_multisite() ) {
365                 if ( $wpdb->get_row( "SELECT blog_id FROM {$wpdb->blog_versions} WHERE blog_id = '{$wpdb->blogid}'" ) )
366                         $wpdb->query( "UPDATE {$wpdb->blog_versions} SET db_version = '{$wp_db_version}' WHERE blog_id = '{$wpdb->blogid}'" );
367                 else
368                         $wpdb->query( "INSERT INTO {$wpdb->blog_versions} ( `blog_id` , `db_version` , `last_updated` ) VALUES ( '{$wpdb->blogid}', '{$wp_db_version}', NOW());" );
369         }
370 }
371 endif;
372
373 /**
374  * Functions to be called in install and upgrade scripts.
375  *
376  * {@internal Missing Long Description}}
377  *
378  * @since unknown
379  */
380 function upgrade_all() {
381         global $wp_current_db_version, $wp_db_version, $wp_rewrite;
382         $wp_current_db_version = __get_option('db_version');
383
384         // We are up-to-date.  Nothing to do.
385         if ( $wp_db_version == $wp_current_db_version )
386                 return;
387
388         // If the version is not set in the DB, try to guess the version.
389         if ( empty($wp_current_db_version) ) {
390                 $wp_current_db_version = 0;
391
392                 // If the template option exists, we have 1.5.
393                 $template = __get_option('template');
394                 if ( !empty($template) )
395                         $wp_current_db_version = 2541;
396         }
397
398         if ( $wp_current_db_version < 6039 )
399                 upgrade_230_options_table();
400
401         populate_options();
402
403         if ( $wp_current_db_version < 2541 ) {
404                 upgrade_100();
405                 upgrade_101();
406                 upgrade_110();
407                 upgrade_130();
408         }
409
410         if ( $wp_current_db_version < 3308 )
411                 upgrade_160();
412
413         if ( $wp_current_db_version < 4772 )
414                 upgrade_210();
415
416         if ( $wp_current_db_version < 4351 )
417                 upgrade_old_slugs();
418
419         if ( $wp_current_db_version < 5539 )
420                 upgrade_230();
421
422         if ( $wp_current_db_version < 6124 )
423                 upgrade_230_old_tables();
424
425         if ( $wp_current_db_version < 7499 )
426                 upgrade_250();
427
428         if ( $wp_current_db_version < 7935 )
429                 upgrade_252();
430
431         if ( $wp_current_db_version < 8201 )
432                 upgrade_260();
433
434         if ( $wp_current_db_version < 8989 )
435                 upgrade_270();
436
437         if ( $wp_current_db_version < 10360 )
438                 upgrade_280();
439
440         if ( $wp_current_db_version < 11958 )
441                 upgrade_290();
442
443         if ( $wp_current_db_version < 15260 )
444                 upgrade_300();
445
446         maybe_disable_automattic_widgets();
447
448         update_option( 'db_version', $wp_db_version );
449         update_option( 'db_upgraded', true );
450 }
451
452 /**
453  * Execute changes made in WordPress 1.0.
454  *
455  * @since 1.0.0
456  */
457 function upgrade_100() {
458         global $wpdb;
459
460         // Get the title and ID of every post, post_name to check if it already has a value
461         $posts = $wpdb->get_results("SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''");
462         if ($posts) {
463                 foreach($posts as $post) {
464                         if ('' == $post->post_name) {
465                                 $newtitle = sanitize_title($post->post_title);
466                                 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d", $newtitle, $post->ID) );
467                         }
468                 }
469         }
470
471         $categories = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories");
472         foreach ($categories as $category) {
473                 if ('' == $category->category_nicename) {
474                         $newtitle = sanitize_title($category->cat_name);
475                         $wpdb>update( $wpdb->categories, array('category_nicename' => $newtitle), array('cat_ID' => $category->cat_ID) );
476                 }
477         }
478
479         $wpdb->query("UPDATE $wpdb->options SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')
480         WHERE option_name LIKE 'links_rating_image%'
481         AND option_value LIKE 'wp-links/links-images/%'");
482
483         $done_ids = $wpdb->get_results("SELECT DISTINCT post_id FROM $wpdb->post2cat");
484         if ($done_ids) :
485                 foreach ($done_ids as $done_id) :
486                         $done_posts[] = $done_id->post_id;
487                 endforeach;
488                 $catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')';
489         else:
490                 $catwhere = '';
491         endif;
492
493         $allposts = $wpdb->get_results("SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere");
494         if ($allposts) :
495                 foreach ($allposts as $post) {
496                         // Check to see if it's already been imported
497                         $cat = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d", $post->ID, $post->post_category) );
498                         if (!$cat && 0 != $post->post_category) { // If there's no result
499                                 $wpdb->insert( $wpdb->post2cat, array('post_id' => $post->ID, 'category_id' => $post->post_category) );
500                         }
501                 }
502         endif;
503 }
504
505 /**
506  * Execute changes made in WordPress 1.0.1.
507  *
508  * @since 1.0.1
509  */
510 function upgrade_101() {
511         global $wpdb;
512
513         // Clean up indices, add a few
514         add_clean_index($wpdb->posts, 'post_name');
515         add_clean_index($wpdb->posts, 'post_status');
516         add_clean_index($wpdb->categories, 'category_nicename');
517         add_clean_index($wpdb->comments, 'comment_approved');
518         add_clean_index($wpdb->comments, 'comment_post_ID');
519         add_clean_index($wpdb->links , 'link_category');
520         add_clean_index($wpdb->links , 'link_visible');
521 }
522
523 /**
524  * Execute changes made in WordPress 1.2.
525  *
526  * @since 1.2.0
527  */
528 function upgrade_110() {
529         global $wpdb;
530
531         // Set user_nicename.
532         $users = $wpdb->get_results("SELECT ID, user_nickname, user_nicename FROM $wpdb->users");
533         foreach ($users as $user) {
534                 if ('' == $user->user_nicename) {
535                         $newname = sanitize_title($user->user_nickname);
536                         $wpdb->update( $wpdb->users, array('user_nicename' => $newname), array('ID' => $user->ID) );
537                 }
538         }
539
540         $users = $wpdb->get_results("SELECT ID, user_pass from $wpdb->users");
541         foreach ($users as $row) {
542                 if (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) {
543                         $wpdb->update( $wpdb->users, array('user_pass' => md5($row->user_pass)), array('ID' => $row->ID) );
544                 }
545         }
546
547         // Get the GMT offset, we'll use that later on
548         $all_options = get_alloptions_110();
549
550         $time_difference = $all_options->time_difference;
551
552         $server_time = time()+date('Z');
553         $weblogger_time = $server_time + $time_difference*3600;
554         $gmt_time = time();
555
556         $diff_gmt_server = ($gmt_time - $server_time) / 3600;
557         $diff_weblogger_server = ($weblogger_time - $server_time) / 3600;
558         $diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server;
559         $gmt_offset = -$diff_gmt_weblogger;
560
561         // Add a gmt_offset option, with value $gmt_offset
562         add_option('gmt_offset', $gmt_offset);
563
564         // Check if we already set the GMT fields (if we did, then
565         // MAX(post_date_gmt) can't be '0000-00-00 00:00:00'
566         // <michel_v> I just slapped myself silly for not thinking about it earlier
567         $got_gmt_fields = ! ($wpdb->get_var("SELECT MAX(post_date_gmt) FROM $wpdb->posts") == '0000-00-00 00:00:00');
568
569         if (!$got_gmt_fields) {
570
571                 // Add or substract time to all dates, to get GMT dates
572                 $add_hours = intval($diff_gmt_weblogger);
573                 $add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours));
574                 $wpdb->query("UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
575                 $wpdb->query("UPDATE $wpdb->posts SET post_modified = post_date");
576                 $wpdb->query("UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'");
577                 $wpdb->query("UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
578                 $wpdb->query("UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
579         }
580
581 }
582
583 /**
584  * Execute changes made in WordPress 1.5.
585  *
586  * @since 1.5.0
587  */
588 function upgrade_130() {
589         global $wpdb;
590
591         // Remove extraneous backslashes.
592         $posts = $wpdb->get_results("SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts");
593         if ($posts) {
594                 foreach($posts as $post) {
595                         $post_content = addslashes(deslash($post->post_content));
596                         $post_title = addslashes(deslash($post->post_title));
597                         $post_excerpt = addslashes(deslash($post->post_excerpt));
598                         if ( empty($post->guid) )
599                                 $guid = get_permalink($post->ID);
600                         else
601                                 $guid = $post->guid;
602
603                         $wpdb->update( $wpdb->posts, compact('post_title', 'post_content', 'post_excerpt', 'guid'), array('ID' => $post->ID) );
604
605                 }
606         }
607
608         // Remove extraneous backslashes.
609         $comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments");
610         if ($comments) {
611                 foreach($comments as $comment) {
612                         $comment_content = deslash($comment->comment_content);
613                         $comment_author = deslash($comment->comment_author);
614
615                         $wpdb->update($wpdb->comments, compact('comment_content', 'comment_author'), array('comment_ID' => $comment->comment_ID) );
616                 }
617         }
618
619         // Remove extraneous backslashes.
620         $links = $wpdb->get_results("SELECT link_id, link_name, link_description FROM $wpdb->links");
621         if ($links) {
622                 foreach($links as $link) {
623                         $link_name = deslash($link->link_name);
624                         $link_description = deslash($link->link_description);
625
626                         $wpdb->update( $wpdb->links, compact('link_name', 'link_description'), array('link_id' => $link->link_id) );
627                 }
628         }
629
630         $active_plugins = __get_option('active_plugins');
631
632         // If plugins are not stored in an array, they're stored in the old
633         // newline separated format.  Convert to new format.
634         if ( !is_array( $active_plugins ) ) {
635                 $active_plugins = explode("\n", trim($active_plugins));
636                 update_option('active_plugins', $active_plugins);
637         }
638
639         // Obsolete tables
640         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues');
641         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes');
642         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups');
643         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options');
644
645         // Update comments table to use comment_type
646         $wpdb->query("UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'");
647         $wpdb->query("UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'");
648
649         // Some versions have multiple duplicate option_name rows with the same values
650         $options = $wpdb->get_results("SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name");
651         foreach ( $options as $option ) {
652                 if ( 1 != $option->dupes ) { // Could this be done in the query?
653                         $limit = $option->dupes - 1;
654                         $dupe_ids = $wpdb->get_col( $wpdb->prepare("SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit) );
655                         if ( $dupe_ids ) {
656                                 $dupe_ids = join($dupe_ids, ',');
657                                 $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
658                         }
659                 }
660         }
661
662         make_site_theme();
663 }
664
665 /**
666  * Execute changes made in WordPress 2.0.
667  *
668  * @since 2.0.0
669  */
670 function upgrade_160() {
671         global $wpdb, $wp_current_db_version;
672
673         populate_roles_160();
674
675         $users = $wpdb->get_results("SELECT * FROM $wpdb->users");
676         foreach ( $users as $user ) :
677                 if ( !empty( $user->user_firstname ) )
678                         update_user_meta( $user->ID, 'first_name', $wpdb->escape($user->user_firstname) );
679                 if ( !empty( $user->user_lastname ) )
680                         update_user_meta( $user->ID, 'last_name', $wpdb->escape($user->user_lastname) );
681                 if ( !empty( $user->user_nickname ) )
682                         update_user_meta( $user->ID, 'nickname', $wpdb->escape($user->user_nickname) );
683                 if ( !empty( $user->user_level ) )
684                         update_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );
685                 if ( !empty( $user->user_icq ) )
686                         update_user_meta( $user->ID, 'icq', $wpdb->escape($user->user_icq) );
687                 if ( !empty( $user->user_aim ) )
688                         update_user_meta( $user->ID, 'aim', $wpdb->escape($user->user_aim) );
689                 if ( !empty( $user->user_msn ) )
690                         update_user_meta( $user->ID, 'msn', $wpdb->escape($user->user_msn) );
691                 if ( !empty( $user->user_yim ) )
692                         update_user_meta( $user->ID, 'yim', $wpdb->escape($user->user_icq) );
693                 if ( !empty( $user->user_description ) )
694                         update_user_meta( $user->ID, 'description', $wpdb->escape($user->user_description) );
695
696                 if ( isset( $user->user_idmode ) ):
697                         $idmode = $user->user_idmode;
698                         if ($idmode == 'nickname') $id = $user->user_nickname;
699                         if ($idmode == 'login') $id = $user->user_login;
700                         if ($idmode == 'firstname') $id = $user->user_firstname;
701                         if ($idmode == 'lastname') $id = $user->user_lastname;
702                         if ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname;
703                         if ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname;
704                         if (!$idmode) $id = $user->user_nickname;
705                         $wpdb->update( $wpdb->users, array('display_name' => $id), array('ID' => $user->ID) );
706                 endif;
707
708                 // FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.
709                 $caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities');
710                 if ( empty($caps) || defined('RESET_CAPS') ) {
711                         $level = get_user_meta($user->ID, $wpdb->prefix . 'user_level', true);
712                         $role = translate_level_to_role($level);
713                         update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) );
714                 }
715
716         endforeach;
717         $old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' );
718         $wpdb->hide_errors();
719         foreach ( $old_user_fields as $old )
720                 $wpdb->query("ALTER TABLE $wpdb->users DROP $old");
721         $wpdb->show_errors();
722
723         // populate comment_count field of posts table
724         $comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" );
725         if ( is_array( $comments ) )
726                 foreach ($comments as $comment)
727                         $wpdb->update( $wpdb->posts, array('comment_count' => $comment->c), array('ID' => $comment->comment_post_ID) );
728
729         // Some alpha versions used a post status of object instead of attachment and put
730         // the mime type in post_type instead of post_mime_type.
731         if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {
732                 $objects = $wpdb->get_results("SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'");
733                 foreach ($objects as $object) {
734                         $wpdb->update( $wpdb->posts, array(     'post_status' => 'attachment',
735                                                                                                 'post_mime_type' => $object->post_type,
736                                                                                                 'post_type' => ''),
737                                                                                  array( 'ID' => $object->ID ) );
738
739                         $meta = get_post_meta($object->ID, 'imagedata', true);
740                         if ( ! empty($meta['file']) )
741                                 update_attached_file( $object->ID, $meta['file'] );
742                 }
743         }
744 }
745
746 /**
747  * Execute changes made in WordPress 2.1.
748  *
749  * @since 2.1.0
750  */
751 function upgrade_210() {
752         global $wpdb, $wp_current_db_version;
753
754         if ( $wp_current_db_version < 3506 ) {
755                 // Update status and type.
756                 $posts = $wpdb->get_results("SELECT ID, post_status FROM $wpdb->posts");
757
758                 if ( ! empty($posts) ) foreach ($posts as $post) {
759                         $status = $post->post_status;
760                         $type = 'post';
761
762                         if ( 'static' == $status ) {
763                                 $status = 'publish';
764                                 $type = 'page';
765                         } else if ( 'attachment' == $status ) {
766                                 $status = 'inherit';
767                                 $type = 'attachment';
768                         }
769
770                         $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d", $status, $type, $post->ID) );
771                 }
772         }
773
774         if ( $wp_current_db_version < 3845 ) {
775                 populate_roles_210();
776         }
777
778         if ( $wp_current_db_version < 3531 ) {
779                 // Give future posts a post_status of future.
780                 $now = gmdate('Y-m-d H:i:59');
781                 $wpdb->query ("UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'");
782
783                 $posts = $wpdb->get_results("SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'");
784                 if ( !empty($posts) )
785                         foreach ( $posts as $post )
786                                 wp_schedule_single_event(mysql2date('U', $post->post_date, false), 'publish_future_post', array($post->ID));
787         }
788 }
789
790 /**
791  * Execute changes made in WordPress 2.3.
792  *
793  * @since 2.3.0
794  */
795 function upgrade_230() {
796         global $wp_current_db_version, $wpdb;
797
798         if ( $wp_current_db_version < 5200 ) {
799                 populate_roles_230();
800         }
801
802         // Convert categories to terms.
803         $tt_ids = array();
804         $have_tags = false;
805         $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_ID");
806         foreach ($categories as $category) {
807                 $term_id = (int) $category->cat_ID;
808                 $name = $category->cat_name;
809                 $description = $category->category_description;
810                 $slug = $category->category_nicename;
811                 $parent = $category->category_parent;
812                 $term_group = 0;
813
814                 // Associate terms with the same slug in a term group and make slugs unique.
815                 if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) {
816                         $term_group = $exists[0]->term_group;
817                         $id = $exists[0]->term_id;
818                         $num = 2;
819                         do {
820                                 $alt_slug = $slug . "-$num";
821                                 $num++;
822                                 $slug_check = $wpdb->get_var( $wpdb->prepare("SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug) );
823                         } while ( $slug_check );
824
825                         $slug = $alt_slug;
826
827                         if ( empty( $term_group ) ) {
828                                 $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group") + 1;
829                                 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $id) );
830                         }
831                 }
832
833                 $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES
834                 (%d, %s, %s, %d)", $term_id, $name, $slug, $term_group) );
835
836                 $count = 0;
837                 if ( !empty($category->category_count) ) {
838                         $count = (int) $category->category_count;
839                         $taxonomy = 'category';
840                         $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count) );
841                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
842                 }
843
844                 if ( !empty($category->link_count) ) {
845                         $count = (int) $category->link_count;
846                         $taxonomy = 'link_category';
847                         $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count) );
848                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
849                 }
850
851                 if ( !empty($category->tag_count) ) {
852                         $have_tags = true;
853                         $count = (int) $category->tag_count;
854                         $taxonomy = 'post_tag';
855                         $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );
856                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
857                 }
858
859                 if ( empty($count) ) {
860                         $count = 0;
861                         $taxonomy = 'category';
862                         $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );
863                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
864                 }
865         }
866
867         $select = 'post_id, category_id';
868         if ( $have_tags )
869                 $select .= ', rel_type';
870
871         $posts = $wpdb->get_results("SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id");
872         foreach ( $posts as $post ) {
873                 $post_id = (int) $post->post_id;
874                 $term_id = (int) $post->category_id;
875                 $taxonomy = 'category';
876                 if ( !empty($post->rel_type) && 'tag' == $post->rel_type)
877                         $taxonomy = 'tag';
878                 $tt_id = $tt_ids[$term_id][$taxonomy];
879                 if ( empty($tt_id) )
880                         continue;
881
882                 $wpdb->insert( $wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $tt_id) );
883         }
884
885         // < 3570 we used linkcategories.  >= 3570 we used categories and link2cat.
886         if ( $wp_current_db_version < 3570 ) {
887                 // Create link_category terms for link categories.  Create a map of link cat IDs
888                 // to link_category terms.
889                 $link_cat_id_map = array();
890                 $default_link_cat = 0;
891                 $tt_ids = array();
892                 $link_cats = $wpdb->get_results("SELECT cat_id, cat_name FROM " . $wpdb->prefix . 'linkcategories');
893                 foreach ( $link_cats as $category) {
894                         $cat_id = (int) $category->cat_id;
895                         $term_id = 0;
896                         $name = $wpdb->escape($category->cat_name);
897                         $slug = sanitize_title($name);
898                         $term_group = 0;
899
900                         // Associate terms with the same slug in a term group and make slugs unique.
901                         if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) {
902                                 $term_group = $exists[0]->term_group;
903                                 $term_id = $exists[0]->term_id;
904                         }
905
906                         if ( empty($term_id) ) {
907                                 $wpdb->insert( $wpdb->terms, compact('name', 'slug', 'term_group') );
908                                 $term_id = (int) $wpdb->insert_id;
909                         }
910
911                         $link_cat_id_map[$cat_id] = $term_id;
912                         $default_link_cat = $term_id;
913
914                         $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $term_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 0) );
915                         $tt_ids[$term_id] = (int) $wpdb->insert_id;
916                 }
917
918                 // Associate links to cats.
919                 $links = $wpdb->get_results("SELECT link_id, link_category FROM $wpdb->links");
920                 if ( !empty($links) ) foreach ( $links as $link ) {
921                         if ( 0 == $link->link_category )
922                                 continue;
923                         if ( ! isset($link_cat_id_map[$link->link_category]) )
924                                 continue;
925                         $term_id = $link_cat_id_map[$link->link_category];
926                         $tt_id = $tt_ids[$term_id];
927                         if ( empty($tt_id) )
928                                 continue;
929
930                         $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link->link_id, 'term_taxonomy_id' => $tt_id) );
931                 }
932
933                 // Set default to the last category we grabbed during the upgrade loop.
934                 update_option('default_link_category', $default_link_cat);
935         } else {
936                 $links = $wpdb->get_results("SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id");
937                 foreach ( $links as $link ) {
938                         $link_id = (int) $link->link_id;
939                         $term_id = (int) $link->category_id;
940                         $taxonomy = 'link_category';
941                         $tt_id = $tt_ids[$term_id][$taxonomy];
942                         if ( empty($tt_id) )
943                                 continue;
944                         $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link_id, 'term_taxonomy_id' => $tt_id) );
945                 }
946         }
947
948         if ( $wp_current_db_version < 4772 ) {
949                 // Obsolete linkcategories table
950                 $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories');
951         }
952
953         // Recalculate all counts
954         $terms = $wpdb->get_results("SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy");
955         foreach ( (array) $terms as $term ) {
956                 if ( ('post_tag' == $term->taxonomy) || ('category' == $term->taxonomy) )
957                         $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term->term_taxonomy_id) );
958                 else
959                         $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term->term_taxonomy_id) );
960                 $wpdb->update( $wpdb->term_taxonomy, array('count' => $count), array('term_taxonomy_id' => $term->term_taxonomy_id) );
961         }
962 }
963
964 /**
965  * Remove old options from the database.
966  *
967  * @since 2.3.0
968  */
969 function upgrade_230_options_table() {
970         global $wpdb;
971         $old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' );
972         $wpdb->hide_errors();
973         foreach ( $old_options_fields as $old )
974                 $wpdb->query("ALTER TABLE $wpdb->options DROP $old");
975         $wpdb->show_errors();
976 }
977
978 /**
979  * Remove old categories, link2cat, and post2cat database tables.
980  *
981  * @since 2.3.0
982  */
983 function upgrade_230_old_tables() {
984         global $wpdb;
985         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories');
986         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat');
987         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat');
988 }
989
990 /**
991  * Upgrade old slugs made in version 2.2.
992  *
993  * @since 2.2.0
994  */
995 function upgrade_old_slugs() {
996         // upgrade people who were using the Redirect Old Slugs plugin
997         global $wpdb;
998         $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
999 }
1000
1001 /**
1002  * Execute changes made in WordPress 2.5.0.
1003  *
1004  * @since 2.5.0
1005  */
1006 function upgrade_250() {
1007         global $wp_current_db_version;
1008
1009         if ( $wp_current_db_version < 6689 ) {
1010                 populate_roles_250();
1011         }
1012
1013 }
1014
1015 /**
1016  * Execute changes made in WordPress 2.5.2.
1017  *
1018  * @since 2.5.2
1019  */
1020 function upgrade_252() {
1021         global $wpdb;
1022
1023         $wpdb->query("UPDATE $wpdb->users SET user_activation_key = ''");
1024 }
1025
1026 /**
1027  * Execute changes made in WordPress 2.6.
1028  *
1029  * @since 2.6.0
1030  */
1031 function upgrade_260() {
1032         global $wp_current_db_version;
1033
1034         if ( $wp_current_db_version < 8000 )
1035                 populate_roles_260();
1036
1037         if ( $wp_current_db_version < 8201 ) {
1038                 update_option('enable_app', 1);
1039                 update_option('enable_xmlrpc', 1);
1040         }
1041 }
1042
1043 /**
1044  * Execute changes made in WordPress 2.7.
1045  *
1046  * @since 2.7.0
1047  */
1048 function upgrade_270() {
1049         global $wpdb, $wp_current_db_version;
1050
1051         if ( $wp_current_db_version < 8980 )
1052                 populate_roles_270();
1053
1054         // Update post_date for unpublished posts with empty timestamp
1055         if ( $wp_current_db_version < 8921 )
1056                 $wpdb->query( "UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'" );
1057 }
1058
1059 /**
1060  * Execute changes made in WordPress 2.8.
1061  *
1062  * @since 2.8.0
1063  */
1064 function upgrade_280() {
1065         global $wp_current_db_version, $wpdb;
1066
1067         if ( $wp_current_db_version < 10360 )
1068                 populate_roles_280();
1069         if ( is_multisite() ) {
1070                 $start = 0;
1071                 while( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) {
1072                         foreach( $rows as $row ) {
1073                                 $value = $row->option_value;
1074                                 if ( !@unserialize( $value ) )
1075                                         $value = stripslashes( $value );
1076                                 if ( $value !== $row->option_value ) {
1077                                         update_option( $row->option_name, $value );
1078                                 }
1079                         }
1080                         $start += 20;
1081                 }
1082                 refresh_blog_details( $wpdb->blogid );
1083         }
1084 }
1085
1086 /**
1087  * Execute changes made in WordPress 2.9.
1088  *
1089  * @since 2.9.0
1090  */
1091 function upgrade_290() {
1092         global $wp_current_db_version;
1093
1094         if ( $wp_current_db_version < 11958 ) {
1095                 // Previously, setting depth to 1 would redundantly disable threading, but now 2 is the minimum depth to avoid confusion
1096                 if ( get_option( 'thread_comments_depth' ) == '1' ) {
1097                         update_option( 'thread_comments_depth', 2 );
1098                         update_option( 'thread_comments', 0 );
1099                 }
1100         }
1101 }
1102
1103 /**
1104  * Execute changes made in WordPress 3.0.
1105  *
1106  * @since 3.0.0
1107  */
1108 function upgrade_300() {
1109         global $wp_current_db_version, $wpdb;
1110
1111         if ( $wp_current_db_version < 15093 )
1112                 populate_roles_300();
1113
1114         if ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false )
1115                 add_site_option( 'siteurl', '' );
1116
1117         // 3.0-alpha nav menu postmeta changes. can be removed before release. // r13802
1118         if ( $wp_current_db_version >= 13226 && $wp_current_db_version < 13974 )
1119                 $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key IN( 'menu_type', 'object_id', 'menu_new_window', 'menu_link', '_menu_item_append', 'menu_item_append', 'menu_item_type', 'menu_item_object_id', 'menu_item_target', 'menu_item_classes', 'menu_item_xfn', 'menu_item_url' )" );
1120
1121         // 3.0-beta1 remove_user primitive->meta cap. can be removed before release. r13956
1122         if ( $wp_current_db_version >= 12751 && $wp_current_db_version < 13974 ) {
1123                 $role =& get_role( 'administrator' );
1124                 if ( ! empty( $role ) )
1125                         $role->remove_cap( 'remove_user' );
1126         }
1127
1128         // 3.0-beta1 nav menu postmeta changes. can be removed before release. r13974
1129         if ( $wp_current_db_version >= 13802 && $wp_current_db_version < 13974 )
1130                 $wpdb->update( $wpdb->postmeta, array( 'meta_value' => '' ), array( 'meta_key' => '_menu_item_target', 'meta_value' => '_self' ) );
1131
1132         // 3.0 screen options key name changes.
1133         if ( !is_multisite() || is_main_site() ) {
1134                 $prefix = like_escape($wpdb->base_prefix);
1135                 $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key LIKE '{$prefix}%meta-box-hidden%' OR meta_key LIKE '{$prefix}%closedpostboxes%' OR meta_key LIKE '{$prefix}%manage-%-columns-hidden%' OR meta_key LIKE '{$prefix}%meta-box-order%' OR meta_key LIKE '{$prefix}%metaboxorder%' OR meta_key LIKE '{$prefix}%screen_layout%'
1136                                          OR meta_key = 'manageedittagscolumnshidden' OR meta_key='managecategoriescolumnshidden' OR meta_key = 'manageedit-tagscolumnshidden' OR meta_key = 'manageeditcolumnshidden' OR meta_key = 'categories_per_page' OR meta_key = 'edit_tags_per_page'" );
1137         }
1138
1139 }
1140
1141 /**
1142  * Execute network level changes
1143  *
1144  * @since 3.0.0
1145  */
1146 function upgrade_network() {
1147         global $wp_current_db_version, $wpdb;
1148         // 2.8
1149         if ( $wp_current_db_version < 11549 ) {
1150                 $wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' );
1151                 $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
1152                 if ( $wpmu_sitewide_plugins ) {
1153                         if ( !$active_sitewide_plugins )
1154                                 $sitewide_plugins = (array) $wpmu_sitewide_plugins;
1155                         else
1156                                 $sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins );
1157
1158                         update_site_option( 'active_sitewide_plugins', $sitewide_plugins );
1159                 }
1160                 delete_site_option( 'wpmu_sitewide_plugins' );
1161                 delete_site_option( 'deactivated_sitewide_plugins' );
1162
1163                 $start = 0;
1164                 while( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) {
1165                         foreach( $rows as $row ) {
1166                                 $value = $row->meta_value;
1167                                 if ( !@unserialize( $value ) )
1168                                         $value = stripslashes( $value );
1169                                 if ( $value !== $row->meta_value ) {
1170                                         update_site_option( $row->meta_key, $value );
1171                                 }
1172                         }
1173                         $start += 20;
1174                 }
1175         }
1176         // 3.0
1177         if ( $wp_current_db_version < 13576 )
1178                 update_site_option( 'global_terms_enabled', '1' );
1179 }
1180
1181 // The functions we use to actually do stuff
1182
1183 // General
1184
1185 /**
1186  * {@internal Missing Short Description}}
1187  *
1188  * {@internal Missing Long Description}}
1189  *
1190  * @since unknown
1191  *
1192  * @param string $table_name Database table name to create.
1193  * @param string $create_ddl SQL statement to create table.
1194  * @return bool If table already exists or was created by function.
1195  */
1196 function maybe_create_table($table_name, $create_ddl) {
1197         global $wpdb;
1198         if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name )
1199                 return true;
1200         //didn't find it try to create it.
1201         $q = $wpdb->query($create_ddl);
1202         // we cannot directly tell that whether this succeeded!
1203         if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name )
1204                 return true;
1205         return false;
1206 }
1207
1208 /**
1209  * {@internal Missing Short Description}}
1210  *
1211  * {@internal Missing Long Description}}
1212  *
1213  * @since unknown
1214  *
1215  * @param string $table Database table name.
1216  * @param string $index Index name to drop.
1217  * @return bool True, when finished.
1218  */
1219 function drop_index($table, $index) {
1220         global $wpdb;
1221         $wpdb->hide_errors();
1222         $wpdb->query("ALTER TABLE `$table` DROP INDEX `$index`");
1223         // Now we need to take out all the extra ones we may have created
1224         for ($i = 0; $i < 25; $i++) {
1225                 $wpdb->query("ALTER TABLE `$table` DROP INDEX `{$index}_$i`");
1226         }
1227         $wpdb->show_errors();
1228         return true;
1229 }
1230
1231 /**
1232  * {@internal Missing Short Description}}
1233  *
1234  * {@internal Missing Long Description}}
1235  *
1236  * @since unknown
1237  *
1238  * @param string $table Database table name.
1239  * @param string $index Database table index column.
1240  * @return bool True, when done with execution.
1241  */
1242 function add_clean_index($table, $index) {
1243         global $wpdb;
1244         drop_index($table, $index);
1245         $wpdb->query("ALTER TABLE `$table` ADD INDEX ( `$index` )");
1246         return true;
1247 }
1248
1249 /**
1250  ** maybe_add_column()
1251  ** Add column to db table if it doesn't exist.
1252  ** Returns:  true if already exists or on successful completion
1253  **           false on error
1254  */
1255 function maybe_add_column($table_name, $column_name, $create_ddl) {
1256         global $wpdb, $debug;
1257         foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
1258                 if ($debug) echo("checking $column == $column_name<br />");
1259                 if ($column == $column_name) {
1260                         return true;
1261                 }
1262         }
1263         //didn't find it try to create it.
1264         $q = $wpdb->query($create_ddl);
1265         // we cannot directly tell that whether this succeeded!
1266         foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
1267                 if ($column == $column_name) {
1268                         return true;
1269                 }
1270         }
1271         return false;
1272 }
1273
1274 /**
1275  * Retrieve all options as it was for 1.2.
1276  *
1277  * @since 1.2.0
1278  *
1279  * @return array List of options.
1280  */
1281 function get_alloptions_110() {
1282         global $wpdb;
1283         if ($options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options")) {
1284                 foreach ($options as $option) {
1285                         // "When trying to design a foolproof system,
1286                         //  never underestimate the ingenuity of the fools :)" -- Dougal
1287                         if ('siteurl' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
1288                         if ('home' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
1289                         if ('category_base' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
1290                         $all_options->{$option->option_name} = stripslashes($option->option_value);
1291                 }
1292         }
1293         return $all_options;
1294 }
1295
1296 /**
1297  * Version of get_option that is private to install/upgrade.
1298  *
1299  * @since unknown
1300  * @access private
1301  *
1302  * @param string $setting Option name.
1303  * @return mixed
1304  */
1305 function __get_option($setting) {
1306         global $wpdb;
1307
1308         if ( $setting == 'home' && defined( 'WP_HOME' ) ) {
1309                 return preg_replace( '|/+$|', '', WP_HOME );
1310         }
1311
1312         if ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) ) {
1313                 return preg_replace( '|/+$|', '', WP_SITEURL );
1314         }
1315
1316         $option = $wpdb->get_var( $wpdb->prepare("SELECT option_value FROM $wpdb->options WHERE option_name = %s", $setting) );
1317
1318         if ( 'home' == $setting && '' == $option )
1319                 return __get_option('siteurl');
1320
1321         if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
1322                 $option = preg_replace('|/+$|', '', $option);
1323
1324         @ $kellogs = unserialize($option);
1325         if ($kellogs !== FALSE)
1326                 return $kellogs;
1327         else
1328                 return $option;
1329 }
1330
1331 /**
1332  * {@internal Missing Short Description}}
1333  *
1334  * {@internal Missing Long Description}}
1335  *
1336  * @since unknown
1337  *
1338  * @param string $content
1339  * @return string
1340  */
1341 function deslash($content) {
1342         // Note: \\\ inside a regex denotes a single backslash.
1343
1344         // Replace one or more backslashes followed by a single quote with
1345         // a single quote.
1346         $content = preg_replace("/\\\+'/", "'", $content);
1347
1348         // Replace one or more backslashes followed by a double quote with
1349         // a double quote.
1350         $content = preg_replace('/\\\+"/', '"', $content);
1351
1352         // Replace one or more backslashes with one backslash.
1353         $content = preg_replace("/\\\+/", "\\", $content);
1354
1355         return $content;
1356 }
1357
1358 /**
1359  * {@internal Missing Short Description}}
1360  *
1361  * {@internal Missing Long Description}}
1362  *
1363  * @since unknown
1364  *
1365  * @param unknown_type $queries
1366  * @param unknown_type $execute
1367  * @return unknown
1368  */
1369 function dbDelta($queries, $execute = true) {
1370         global $wpdb;
1371
1372         // Separate individual queries into an array
1373         if ( !is_array($queries) ) {
1374                 $queries = explode( ';', $queries );
1375                 if ('' == $queries[count($queries) - 1]) array_pop($queries);
1376         }
1377
1378         $cqueries = array(); // Creation Queries
1379         $iqueries = array(); // Insertion Queries
1380         $for_update = array();
1381
1382         // Create a tablename index for an array ($cqueries) of queries
1383         foreach($queries as $qry) {
1384                 if (preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) {
1385                         $cqueries[trim( strtolower($matches[1]), '`' )] = $qry;
1386                         $for_update[$matches[1]] = 'Created table '.$matches[1];
1387                 } else if (preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) {
1388                         array_unshift($cqueries, $qry);
1389                 } else if (preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) {
1390                         $iqueries[] = $qry;
1391                 } else if (preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) {
1392                         $iqueries[] = $qry;
1393                 } else {
1394                         // Unrecognized query type
1395                 }
1396         }
1397
1398         // Check to see which tables and fields exist
1399         if ($tables = $wpdb->get_col('SHOW TABLES;')) {
1400                 // For every table in the database
1401                 foreach ($tables as $table) {
1402                         // If a table query exists for the database table...
1403                         if ( array_key_exists(strtolower($table), $cqueries) ) {
1404                                 // Clear the field and index arrays
1405                                 $cfields = $indices = array();
1406                                 // Get all of the field names in the query from between the parens
1407                                 preg_match("|\((.*)\)|ms", $cqueries[strtolower($table)], $match2);
1408                                 $qryline = trim($match2[1]);
1409
1410                                 // Separate field lines into an array
1411                                 $flds = explode("\n", $qryline);
1412
1413                                 //echo "<hr/><pre>\n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."</pre><hr/>";
1414
1415                                 // For every field line specified in the query
1416                                 foreach ($flds as $fld) {
1417                                         // Extract the field name
1418                                         preg_match("|^([^ ]*)|", trim($fld), $fvals);
1419                                         $fieldname = trim( $fvals[1], '`' );
1420
1421                                         // Verify the found field name
1422                                         $validfield = true;
1423                                         switch (strtolower($fieldname)) {
1424                                         case '':
1425                                         case 'primary':
1426                                         case 'index':
1427                                         case 'fulltext':
1428                                         case 'unique':
1429                                         case 'key':
1430                                                 $validfield = false;
1431                                                 $indices[] = trim(trim($fld), ", \n");
1432                                                 break;
1433                                         }
1434                                         $fld = trim($fld);
1435
1436                                         // If it's a valid field, add it to the field array
1437                                         if ($validfield) {
1438                                                 $cfields[strtolower($fieldname)] = trim($fld, ", \n");
1439                                         }
1440                                 }
1441
1442                                 // Fetch the table column structure from the database
1443                                 $tablefields = $wpdb->get_results("DESCRIBE {$table};");
1444
1445                                 // For every field in the table
1446                                 foreach ($tablefields as $tablefield) {
1447                                         // If the table field exists in the field array...
1448                                         if (array_key_exists(strtolower($tablefield->Field), $cfields)) {
1449                                                 // Get the field type from the query
1450                                                 preg_match("|".$tablefield->Field." ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches);
1451                                                 $fieldtype = $matches[1];
1452
1453                                                 // Is actual field type different from the field type in query?
1454                                                 if ($tablefield->Type != $fieldtype) {
1455                                                         // Add a query to change the column type
1456                                                         $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)];
1457                                                         $for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
1458                                                 }
1459
1460                                                 // Get the default value from the array
1461                                                         //echo "{$cfields[strtolower($tablefield->Field)]}<br>";
1462                                                 if (preg_match("| DEFAULT '(.*)'|i", $cfields[strtolower($tablefield->Field)], $matches)) {
1463                                                         $default_value = $matches[1];
1464                                                         if ($tablefield->Default != $default_value) {
1465                                                                 // Add a query to change the column's default value
1466                                                                 $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
1467                                                                 $for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
1468                                                         }
1469                                                 }
1470
1471                                                 // Remove the field from the array (so it's not added)
1472                                                 unset($cfields[strtolower($tablefield->Field)]);
1473                                         } else {
1474                                                 // This field exists in the table, but not in the creation queries?
1475                                         }
1476                                 }
1477
1478                                 // For every remaining field specified for the table
1479                                 foreach ($cfields as $fieldname => $fielddef) {
1480                                         // Push a query line into $cqueries that adds the field to that table
1481                                         $cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef";
1482                                         $for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname;
1483                                 }
1484
1485                                 // Index stuff goes here
1486                                 // Fetch the table index structure from the database
1487                                 $tableindices = $wpdb->get_results("SHOW INDEX FROM {$table};");
1488
1489                                 if ($tableindices) {
1490                                         // Clear the index array
1491                                         unset($index_ary);
1492
1493                                         // For every index in the table
1494                                         foreach ($tableindices as $tableindex) {
1495                                                 // Add the index to the index data array
1496                                                 $keyname = $tableindex->Key_name;
1497                                                 $index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);
1498                                                 $index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false;
1499                                         }
1500
1501                                         // For each actual index in the index array
1502                                         foreach ($index_ary as $index_name => $index_data) {
1503                                                 // Build a create string to compare to the query
1504                                                 $index_string = '';
1505                                                 if ($index_name == 'PRIMARY') {
1506                                                         $index_string .= 'PRIMARY ';
1507                                                 } else if($index_data['unique']) {
1508                                                         $index_string .= 'UNIQUE ';
1509                                                 }
1510                                                 $index_string .= 'KEY ';
1511                                                 if ($index_name != 'PRIMARY') {
1512                                                         $index_string .= $index_name;
1513                                                 }
1514                                                 $index_columns = '';
1515                                                 // For each column in the index
1516                                                 foreach ($index_data['columns'] as $column_data) {
1517                                                         if ($index_columns != '') $index_columns .= ',';
1518                                                         // Add the field to the column list string
1519                                                         $index_columns .= $column_data['fieldname'];
1520                                                         if ($column_data['subpart'] != '') {
1521                                                                 $index_columns .= '('.$column_data['subpart'].')';
1522                                                         }
1523                                                 }
1524                                                 // Add the column list to the index create string
1525                                                 $index_string .= ' ('.$index_columns.')';
1526                                                 if (!(($aindex = array_search($index_string, $indices)) === false)) {
1527                                                         unset($indices[$aindex]);
1528                                                         //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br />Found index:".$index_string."</pre>\n";
1529                                                 }
1530                                                 //else echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br /><b>Did not find index:</b>".$index_string."<br />".print_r($indices, true)."</pre>\n";
1531                                         }
1532                                 }
1533
1534                                 // For every remaining index specified for the table
1535                                 foreach ( (array) $indices as $index ) {
1536                                         // Push a query line into $cqueries that adds the index to that table
1537                                         $cqueries[] = "ALTER TABLE {$table} ADD $index";
1538                                         $for_update[$table.'.'.$fieldname] = 'Added index '.$table.' '.$index;
1539                                 }
1540
1541                                 // Remove the original table creation query from processing
1542                                 unset($cqueries[strtolower($table)]);
1543                                 unset($for_update[strtolower($table)]);
1544                         } else {
1545                                 // This table exists in the database, but not in the creation queries?
1546                         }
1547                 }
1548         }
1549
1550         $allqueries = array_merge($cqueries, $iqueries);
1551         if ($execute) {
1552                 foreach ($allqueries as $query) {
1553                         //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">".print_r($query, true)."</pre>\n";
1554                         $wpdb->query($query);
1555                 }
1556         }
1557
1558         return $for_update;
1559 }
1560
1561 /**
1562  * {@internal Missing Short Description}}
1563  *
1564  * {@internal Missing Long Description}}
1565  *
1566  * @since unknown
1567  */
1568 function make_db_current() {
1569         global $wp_queries;
1570
1571         $alterations = dbDelta($wp_queries);
1572         echo "<ol>\n";
1573         foreach($alterations as $alteration) echo "<li>$alteration</li>\n";
1574         echo "</ol>\n";
1575 }
1576
1577 /**
1578  * {@internal Missing Short Description}}
1579  *
1580  * {@internal Missing Long Description}}
1581  *
1582  * @since unknown
1583  */
1584 function make_db_current_silent() {
1585         global $wp_queries;
1586
1587         $alterations = dbDelta($wp_queries);
1588 }
1589
1590 /**
1591  * {@internal Missing Short Description}}
1592  *
1593  * {@internal Missing Long Description}}
1594  *
1595  * @since unknown
1596  *
1597  * @param unknown_type $theme_name
1598  * @param unknown_type $template
1599  * @return unknown
1600  */
1601 function make_site_theme_from_oldschool($theme_name, $template) {
1602         $home_path = get_home_path();
1603         $site_dir = WP_CONTENT_DIR . "/themes/$template";
1604
1605         if (! file_exists("$home_path/index.php"))
1606                 return false;
1607
1608         // Copy files from the old locations to the site theme.
1609         // TODO: This does not copy arbitarary include dependencies.  Only the
1610         // standard WP files are copied.
1611         $files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php');
1612
1613         foreach ($files as $oldfile => $newfile) {
1614                 if ($oldfile == 'index.php')
1615                         $oldpath = $home_path;
1616                 else
1617                         $oldpath = ABSPATH;
1618
1619                 if ($oldfile == 'index.php') { // Check to make sure it's not a new index
1620                         $index = implode('', file("$oldpath/$oldfile"));
1621                         if (strpos($index, 'WP_USE_THEMES') !== false) {
1622                                 if (! @copy(WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME . '/index.php', "$site_dir/$newfile"))
1623                                         return false;
1624                                 continue; // Don't copy anything
1625                                 }
1626                 }
1627
1628                 if (! @copy("$oldpath/$oldfile", "$site_dir/$newfile"))
1629                         return false;
1630
1631                 chmod("$site_dir/$newfile", 0777);
1632
1633                 // Update the blog header include in each file.
1634                 $lines = explode("\n", implode('', file("$site_dir/$newfile")));
1635                 if ($lines) {
1636                         $f = fopen("$site_dir/$newfile", 'w');
1637
1638                         foreach ($lines as $line) {
1639                                 if (preg_match('/require.*wp-blog-header/', $line))
1640                                         $line = '//' . $line;
1641
1642                                 // Update stylesheet references.
1643                                 $line = str_replace("<?php echo __get_option('siteurl'); ?>/wp-layout.css", "<?php bloginfo('stylesheet_url'); ?>", $line);
1644
1645                                 // Update comments template inclusion.
1646                                 $line = str_replace("<?php include(ABSPATH . 'wp-comments.php'); ?>", "<?php comments_template(); ?>", $line);
1647
1648                                 fwrite($f, "{$line}\n");
1649                         }
1650                         fclose($f);
1651                 }
1652         }
1653
1654         // Add a theme header.
1655         $header = "/*\nTheme Name: $theme_name\nTheme URI: " . __get_option('siteurl') . "\nDescription: A theme automatically created by the upgrade.\nVersion: 1.0\nAuthor: Moi\n*/\n";
1656
1657         $stylelines = file_get_contents("$site_dir/style.css");
1658         if ($stylelines) {
1659                 $f = fopen("$site_dir/style.css", 'w');
1660
1661                 fwrite($f, $header);
1662                 fwrite($f, $stylelines);
1663                 fclose($f);
1664         }
1665
1666         return true;
1667 }
1668
1669 /**
1670  * {@internal Missing Short Description}}
1671  *
1672  * {@internal Missing Long Description}}
1673  *
1674  * @since unknown
1675  *
1676  * @param unknown_type $theme_name
1677  * @param unknown_type $template
1678  * @return unknown
1679  */
1680 function make_site_theme_from_default($theme_name, $template) {
1681         $site_dir = WP_CONTENT_DIR . "/themes/$template";
1682         $default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME;
1683
1684         // Copy files from the default theme to the site theme.
1685         //$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css');
1686
1687         $theme_dir = @ opendir($default_dir);
1688         if ($theme_dir) {
1689                 while(($theme_file = readdir( $theme_dir )) !== false) {
1690                         if (is_dir("$default_dir/$theme_file"))
1691                                 continue;
1692                         if (! @copy("$default_dir/$theme_file", "$site_dir/$theme_file"))
1693                                 return;
1694                         chmod("$site_dir/$theme_file", 0777);
1695                 }
1696         }
1697         @closedir($theme_dir);
1698
1699         // Rewrite the theme header.
1700         $stylelines = explode("\n", implode('', file("$site_dir/style.css")));
1701         if ($stylelines) {
1702                 $f = fopen("$site_dir/style.css", 'w');
1703
1704                 foreach ($stylelines as $line) {
1705                         if (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name;
1706                         elseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url');
1707                         elseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.';
1708                         elseif (strpos($line, 'Version:') !== false) $line = 'Version: 1';
1709                         elseif (strpos($line, 'Author:') !== false) $line = 'Author: You';
1710                         fwrite($f, $line . "\n");
1711                 }
1712                 fclose($f);
1713         }
1714
1715         // Copy the images.
1716         umask(0);
1717         if (! mkdir("$site_dir/images", 0777)) {
1718                 return false;
1719         }
1720
1721         $images_dir = @ opendir("$default_dir/images");
1722         if ($images_dir) {
1723                 while(($image = readdir($images_dir)) !== false) {
1724                         if (is_dir("$default_dir/images/$image"))
1725                                 continue;
1726                         if (! @copy("$default_dir/images/$image", "$site_dir/images/$image"))
1727                                 return;
1728                         chmod("$site_dir/images/$image", 0777);
1729                 }
1730         }
1731         @closedir($images_dir);
1732 }
1733
1734 // Create a site theme from the default theme.
1735 /**
1736  * {@internal Missing Short Description}}
1737  *
1738  * {@internal Missing Long Description}}
1739  *
1740  * @since unknown
1741  *
1742  * @return unknown
1743  */
1744 function make_site_theme() {
1745         // Name the theme after the blog.
1746         $theme_name = __get_option('blogname');
1747         $template = sanitize_title($theme_name);
1748         $site_dir = WP_CONTENT_DIR . "/themes/$template";
1749
1750         // If the theme already exists, nothing to do.
1751         if ( is_dir($site_dir)) {
1752                 return false;
1753         }
1754
1755         // We must be able to write to the themes dir.
1756         if (! is_writable(WP_CONTENT_DIR . "/themes")) {
1757                 return false;
1758         }
1759
1760         umask(0);
1761         if (! mkdir($site_dir, 0777)) {
1762                 return false;
1763         }
1764
1765         if (file_exists(ABSPATH . 'wp-layout.css')) {
1766                 if (! make_site_theme_from_oldschool($theme_name, $template)) {
1767                         // TODO:  rm -rf the site theme directory.
1768                         return false;
1769                 }
1770         } else {
1771                 if (! make_site_theme_from_default($theme_name, $template))
1772                         // TODO:  rm -rf the site theme directory.
1773                         return false;
1774         }
1775
1776         // Make the new site theme active.
1777         $current_template = __get_option('template');
1778         if ($current_template == WP_DEFAULT_THEME) {
1779                 update_option('template', $template);
1780                 update_option('stylesheet', $template);
1781         }
1782         return $template;
1783 }
1784
1785 /**
1786  * Translate user level to user role name.
1787  *
1788  * @since unknown
1789  *
1790  * @param int $level User level.
1791  * @return string User role name.
1792  */
1793 function translate_level_to_role($level) {
1794         switch ($level) {
1795         case 10:
1796         case 9:
1797         case 8:
1798                 return 'administrator';
1799         case 7:
1800         case 6:
1801         case 5:
1802                 return 'editor';
1803         case 4:
1804         case 3:
1805         case 2:
1806                 return 'author';
1807         case 1:
1808                 return 'contributor';
1809         case 0:
1810                 return 'subscriber';
1811         }
1812 }
1813
1814 /**
1815  * {@internal Missing Short Description}}
1816  *
1817  * {@internal Missing Long Description}}
1818  *
1819  * @since unknown
1820  */
1821 function wp_check_mysql_version() {
1822         global $wpdb;
1823         $result = $wpdb->check_database_version();
1824         if ( is_wp_error( $result ) )
1825                 die( $result->get_error_message() );
1826 }
1827
1828 /**
1829  * {@internal Missing Short Description}}
1830  *
1831  * {@internal Missing Long Description}}
1832  *
1833  * @since unknown
1834  */
1835 function maybe_disable_automattic_widgets() {
1836         $plugins = __get_option( 'active_plugins' );
1837
1838         foreach ( (array) $plugins as $plugin ) {
1839                 if ( basename( $plugin ) == 'widgets.php' ) {
1840                         array_splice( $plugins, array_search( $plugin, $plugins ), 1 );
1841                         update_option( 'active_plugins', $plugins );
1842                         break;
1843                 }
1844         }
1845 }
1846
1847 /**
1848  * Runs before the schema is upgraded.
1849  */
1850 function pre_schema_upgrade() {
1851         global $wp_current_db_version, $wp_db_version, $wpdb;
1852
1853         // Upgrade versions prior to 2.9
1854         if ( $wp_current_db_version < 11557 ) {
1855                 // Delete duplicate options.  Keep the option with the highest option_id.
1856                 $wpdb->query("DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id");
1857
1858                 // Drop the old primary key and add the new.
1859                 $wpdb->query("ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)");
1860
1861                 // Drop the old option_name index. dbDelta() doesn't do the drop.
1862                 $wpdb->query("ALTER TABLE $wpdb->options DROP INDEX option_name");
1863         }
1864
1865 }
1866
1867 /**
1868  * Install Network.
1869  *
1870  * @since 3.0.0
1871  *
1872  */
1873 if ( !function_exists( 'install_network' ) ) :
1874 function install_network() {
1875         global $wpdb, $charset_collate;
1876         $ms_queries = "
1877 CREATE TABLE $wpdb->users (
1878   ID bigint(20) unsigned NOT NULL auto_increment,
1879   user_login varchar(60) NOT NULL default '',
1880   user_pass varchar(64) NOT NULL default '',
1881   user_nicename varchar(50) NOT NULL default '',
1882   user_email varchar(100) NOT NULL default '',
1883   user_url varchar(100) NOT NULL default '',
1884   user_registered datetime NOT NULL default '0000-00-00 00:00:00',
1885   user_activation_key varchar(60) NOT NULL default '',
1886   user_status int(11) NOT NULL default '0',
1887   display_name varchar(250) NOT NULL default '',
1888   spam tinyint(2) NOT NULL default '0',
1889   deleted tinyint(2) NOT NULL default '0',
1890   PRIMARY KEY  (ID),
1891   KEY user_login_key (user_login),
1892   KEY user_nicename (user_nicename)
1893 ) $charset_collate;
1894 CREATE TABLE $wpdb->blogs (
1895   blog_id bigint(20) NOT NULL auto_increment,
1896   site_id bigint(20) NOT NULL default '0',
1897   domain varchar(200) NOT NULL default '',
1898   path varchar(100) NOT NULL default '',
1899   registered datetime NOT NULL default '0000-00-00 00:00:00',
1900   last_updated datetime NOT NULL default '0000-00-00 00:00:00',
1901   public tinyint(2) NOT NULL default '1',
1902   archived enum('0','1') NOT NULL default '0',
1903   mature tinyint(2) NOT NULL default '0',
1904   spam tinyint(2) NOT NULL default '0',
1905   deleted tinyint(2) NOT NULL default '0',
1906   lang_id int(11) NOT NULL default '0',
1907   PRIMARY KEY  (blog_id),
1908   KEY domain (domain(50),path(5)),
1909   KEY lang_id (lang_id)
1910 ) $charset_collate;
1911 CREATE TABLE $wpdb->blog_versions (
1912   blog_id bigint(20) NOT NULL default '0',
1913   db_version varchar(20) NOT NULL default '',
1914   last_updated datetime NOT NULL default '0000-00-00 00:00:00',
1915   PRIMARY KEY  (blog_id),
1916   KEY db_version (db_version)
1917 ) $charset_collate;
1918 CREATE TABLE $wpdb->registration_log (
1919   ID bigint(20) NOT NULL auto_increment,
1920   email varchar(255) NOT NULL default '',
1921   IP varchar(30) NOT NULL default '',
1922   blog_id bigint(20) NOT NULL default '0',
1923   date_registered datetime NOT NULL default '0000-00-00 00:00:00',
1924   PRIMARY KEY  (ID),
1925   KEY IP (IP)
1926 ) $charset_collate;
1927 CREATE TABLE $wpdb->site (
1928   id bigint(20) NOT NULL auto_increment,
1929   domain varchar(200) NOT NULL default '',
1930   path varchar(100) NOT NULL default '',
1931   PRIMARY KEY  (id),
1932   KEY domain (domain,path)
1933 ) $charset_collate;
1934 CREATE TABLE $wpdb->sitemeta (
1935   meta_id bigint(20) NOT NULL auto_increment,
1936   site_id bigint(20) NOT NULL default '0',
1937   meta_key varchar(255) default NULL,
1938   meta_value longtext,
1939   PRIMARY KEY  (meta_id),
1940   KEY meta_key (meta_key),
1941   KEY site_id (site_id)
1942 ) $charset_collate;
1943 CREATE TABLE $wpdb->signups (
1944   domain varchar(200) NOT NULL default '',
1945   path varchar(100) NOT NULL default '',
1946   title longtext NOT NULL,
1947   user_login varchar(60) NOT NULL default '',
1948   user_email varchar(100) NOT NULL default '',
1949   registered datetime NOT NULL default '0000-00-00 00:00:00',
1950   activated datetime NOT NULL default '0000-00-00 00:00:00',
1951   active tinyint(1) NOT NULL default '0',
1952   activation_key varchar(50) NOT NULL default '',
1953   meta longtext,
1954   KEY activation_key (activation_key),
1955   KEY domain (domain)
1956 ) $charset_collate;
1957 ";
1958 // now create tables
1959         dbDelta( $ms_queries );
1960 }
1961 endif;
1962
1963 /**
1964  * Install global terms.
1965  *
1966  * @since 3.0.0
1967  *
1968  */
1969 if ( !function_exists( 'install_global_terms' ) ) :
1970 function install_global_terms() {
1971         global $wpdb, $charset_collate;
1972         $ms_queries = "
1973 CREATE TABLE $wpdb->sitecategories (
1974   cat_ID bigint(20) NOT NULL auto_increment,
1975   cat_name varchar(55) NOT NULL default '',
1976   category_nicename varchar(200) NOT NULL default '',
1977   last_updated timestamp NOT NULL,
1978   PRIMARY KEY  (cat_ID),
1979   KEY category_nicename (category_nicename),
1980   KEY last_updated (last_updated)
1981 ) $charset_collate;
1982 ";
1983 // now create tables
1984         dbDelta( $ms_queries );
1985 }
1986 endif;
1987 ?>