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