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