[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-admin/includes/ -> upgrade.php (source)

   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      maybe_disable_link_manager();
 406  
 407      maybe_disable_automattic_widgets();
 408  
 409      update_option( 'db_version', $wp_db_version );
 410      update_option( 'db_upgraded', true );
 411  }
 412  
 413  /**
 414   * Execute changes made in WordPress 1.0.
 415   *
 416   * @since 1.0.0
 417   */
 418  function upgrade_100() {
 419      global $wpdb;
 420  
 421      // Get the title and ID of every post, post_name to check if it already has a value
 422      $posts = $wpdb->get_results("SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''");
 423      if ($posts) {
 424          foreach($posts as $post) {
 425              if ('' == $post->post_name) {
 426                  $newtitle = sanitize_title($post->post_title);
 427                  $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d", $newtitle, $post->ID) );
 428              }
 429          }
 430      }
 431  
 432      $categories = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories");
 433      foreach ($categories as $category) {
 434          if ('' == $category->category_nicename) {
 435              $newtitle = sanitize_title($category->cat_name);
 436              $wpdb->update( $wpdb->categories, array('category_nicename' => $newtitle), array('cat_ID' => $category->cat_ID) );
 437          }
 438      }
 439  
 440      $wpdb->query("UPDATE $wpdb->options SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')
 441      WHERE option_name LIKE 'links_rating_image%'
 442      AND option_value LIKE 'wp-links/links-images/%'");
 443  
 444      $done_ids = $wpdb->get_results("SELECT DISTINCT post_id FROM $wpdb->post2cat");
 445      if ($done_ids) :
 446          foreach ($done_ids as $done_id) :
 447              $done_posts[] = $done_id->post_id;
 448          endforeach;
 449          $catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')';
 450      else:
 451          $catwhere = '';
 452      endif;
 453  
 454      $allposts = $wpdb->get_results("SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere");
 455      if ($allposts) :
 456          foreach ($allposts as $post) {
 457              // Check to see if it's already been imported
 458              $cat = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d", $post->ID, $post->post_category) );
 459              if (!$cat && 0 != $post->post_category) { // If there's no result
 460                  $wpdb->insert( $wpdb->post2cat, array('post_id' => $post->ID, 'category_id' => $post->post_category) );
 461              }
 462          }
 463      endif;
 464  }
 465  
 466  /**
 467   * Execute changes made in WordPress 1.0.1.
 468   *
 469   * @since 1.0.1
 470   */
 471  function upgrade_101() {
 472      global $wpdb;
 473  
 474      // Clean up indices, add a few
 475      add_clean_index($wpdb->posts, 'post_name');
 476      add_clean_index($wpdb->posts, 'post_status');
 477      add_clean_index($wpdb->categories, 'category_nicename');
 478      add_clean_index($wpdb->comments, 'comment_approved');
 479      add_clean_index($wpdb->comments, 'comment_post_ID');
 480      add_clean_index($wpdb->links , 'link_category');
 481      add_clean_index($wpdb->links , 'link_visible');
 482  }
 483  
 484  /**
 485   * Execute changes made in WordPress 1.2.
 486   *
 487   * @since 1.2.0
 488   */
 489  function upgrade_110() {
 490      global $wpdb;
 491  
 492      // Set user_nicename.
 493      $users = $wpdb->get_results("SELECT ID, user_nickname, user_nicename FROM $wpdb->users");
 494      foreach ($users as $user) {
 495          if ('' == $user->user_nicename) {
 496              $newname = sanitize_title($user->user_nickname);
 497              $wpdb->update( $wpdb->users, array('user_nicename' => $newname), array('ID' => $user->ID) );
 498          }
 499      }
 500  
 501      $users = $wpdb->get_results("SELECT ID, user_pass from $wpdb->users");
 502      foreach ($users as $row) {
 503          if (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) {
 504              $wpdb->update( $wpdb->users, array('user_pass' => md5($row->user_pass)), array('ID' => $row->ID) );
 505          }
 506      }
 507  
 508      // Get the GMT offset, we'll use that later on
 509      $all_options = get_alloptions_110();
 510  
 511      $time_difference = $all_options->time_difference;
 512  
 513          $server_time = time()+date('Z');
 514      $weblogger_time = $server_time + $time_difference * HOUR_IN_SECONDS;
 515      $gmt_time = time();
 516  
 517      $diff_gmt_server = ($gmt_time - $server_time) / HOUR_IN_SECONDS;
 518      $diff_weblogger_server = ($weblogger_time - $server_time) / HOUR_IN_SECONDS;
 519      $diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server;
 520      $gmt_offset = -$diff_gmt_weblogger;
 521  
 522      // Add a gmt_offset option, with value $gmt_offset
 523      add_option('gmt_offset', $gmt_offset);
 524  
 525      // Check if we already set the GMT fields (if we did, then
 526      // MAX(post_date_gmt) can't be '0000-00-00 00:00:00'
 527      // <michel_v> I just slapped myself silly for not thinking about it earlier
 528      $got_gmt_fields = ! ($wpdb->get_var("SELECT MAX(post_date_gmt) FROM $wpdb->posts") == '0000-00-00 00:00:00');
 529  
 530      if (!$got_gmt_fields) {
 531  
 532          // Add or subtract time to all dates, to get GMT dates
 533          $add_hours = intval($diff_gmt_weblogger);
 534          $add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours));
 535          $wpdb->query("UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
 536          $wpdb->query("UPDATE $wpdb->posts SET post_modified = post_date");
 537          $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'");
 538          $wpdb->query("UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
 539          $wpdb->query("UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
 540      }
 541  
 542  }
 543  
 544  /**
 545   * Execute changes made in WordPress 1.5.
 546   *
 547   * @since 1.5.0
 548   */
 549  function upgrade_130() {
 550      global $wpdb;
 551  
 552      // Remove extraneous backslashes.
 553      $posts = $wpdb->get_results("SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts");
 554      if ($posts) {
 555          foreach($posts as $post) {
 556              $post_content = addslashes(deslash($post->post_content));
 557              $post_title = addslashes(deslash($post->post_title));
 558              $post_excerpt = addslashes(deslash($post->post_excerpt));
 559              if ( empty($post->guid) )
 560                  $guid = get_permalink($post->ID);
 561              else
 562                  $guid = $post->guid;
 563  
 564              $wpdb->update( $wpdb->posts, compact('post_title', 'post_content', 'post_excerpt', 'guid'), array('ID' => $post->ID) );
 565  
 566          }
 567      }
 568  
 569      // Remove extraneous backslashes.
 570      $comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments");
 571      if ($comments) {
 572          foreach($comments as $comment) {
 573              $comment_content = deslash($comment->comment_content);
 574              $comment_author = deslash($comment->comment_author);
 575  
 576              $wpdb->update($wpdb->comments, compact('comment_content', 'comment_author'), array('comment_ID' => $comment->comment_ID) );
 577          }
 578      }
 579  
 580      // Remove extraneous backslashes.
 581      $links = $wpdb->get_results("SELECT link_id, link_name, link_description FROM $wpdb->links");
 582      if ($links) {
 583          foreach($links as $link) {
 584              $link_name = deslash($link->link_name);
 585              $link_description = deslash($link->link_description);
 586  
 587              $wpdb->update( $wpdb->links, compact('link_name', 'link_description'), array('link_id' => $link->link_id) );
 588          }
 589      }
 590  
 591      $active_plugins = __get_option('active_plugins');
 592  
 593      // If plugins are not stored in an array, they're stored in the old
 594      // newline separated format. Convert to new format.
 595      if ( !is_array( $active_plugins ) ) {
 596          $active_plugins = explode("\n", trim($active_plugins));
 597          update_option('active_plugins', $active_plugins);
 598      }
 599  
 600      // Obsolete tables
 601      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues');
 602      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes');
 603      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups');
 604      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options');
 605  
 606      // Update comments table to use comment_type
 607      $wpdb->query("UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'");
 608      $wpdb->query("UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'");
 609  
 610      // Some versions have multiple duplicate option_name rows with the same values
 611      $options = $wpdb->get_results("SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name");
 612      foreach ( $options as $option ) {
 613          if ( 1 != $option->dupes ) { // Could this be done in the query?
 614              $limit = $option->dupes - 1;
 615              $dupe_ids = $wpdb->get_col( $wpdb->prepare("SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit) );
 616              if ( $dupe_ids ) {
 617                  $dupe_ids = join($dupe_ids, ',');
 618                  $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
 619              }
 620          }
 621      }
 622  
 623      make_site_theme();
 624  }
 625  
 626  /**
 627   * Execute changes made in WordPress 2.0.
 628   *
 629   * @since 2.0.0
 630   */
 631  function upgrade_160() {
 632      global $wpdb, $wp_current_db_version;
 633  
 634      populate_roles_160();
 635  
 636      $users = $wpdb->get_results("SELECT * FROM $wpdb->users");
 637      foreach ( $users as $user ) :
 638          if ( !empty( $user->user_firstname ) )
 639              update_user_meta( $user->ID, 'first_name', wp_slash($user->user_firstname) );
 640          if ( !empty( $user->user_lastname ) )
 641              update_user_meta( $user->ID, 'last_name', wp_slash($user->user_lastname) );
 642          if ( !empty( $user->user_nickname ) )
 643              update_user_meta( $user->ID, 'nickname', wp_slash($user->user_nickname) );
 644          if ( !empty( $user->user_level ) )
 645              update_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );
 646          if ( !empty( $user->user_icq ) )
 647              update_user_meta( $user->ID, 'icq', wp_slash($user->user_icq) );
 648          if ( !empty( $user->user_aim ) )
 649              update_user_meta( $user->ID, 'aim', wp_slash($user->user_aim) );
 650          if ( !empty( $user->user_msn ) )
 651              update_user_meta( $user->ID, 'msn', wp_slash($user->user_msn) );
 652          if ( !empty( $user->user_yim ) )
 653              update_user_meta( $user->ID, 'yim', wp_slash($user->user_icq) );
 654          if ( !empty( $user->user_description ) )
 655              update_user_meta( $user->ID, 'description', wp_slash($user->user_description) );
 656  
 657          if ( isset( $user->user_idmode ) ):
 658              $idmode = $user->user_idmode;
 659              if ($idmode == 'nickname') $id = $user->user_nickname;
 660              if ($idmode == 'login') $id = $user->user_login;
 661              if ($idmode == 'firstname') $id = $user->user_firstname;
 662              if ($idmode == 'lastname') $id = $user->user_lastname;
 663              if ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname;
 664              if ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname;
 665              if (!$idmode) $id = $user->user_nickname;
 666              $wpdb->update( $wpdb->users, array('display_name' => $id), array('ID' => $user->ID) );
 667          endif;
 668  
 669          // FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.
 670          $caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities');
 671          if ( empty($caps) || defined('RESET_CAPS') ) {
 672              $level = get_user_meta($user->ID, $wpdb->prefix . 'user_level', true);
 673              $role = translate_level_to_role($level);
 674              update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) );
 675          }
 676  
 677      endforeach;
 678      $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' );
 679      $wpdb->hide_errors();
 680      foreach ( $old_user_fields as $old )
 681          $wpdb->query("ALTER TABLE $wpdb->users DROP $old");
 682      $wpdb->show_errors();
 683  
 684      // populate comment_count field of posts table
 685      $comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" );
 686      if ( is_array( $comments ) )
 687          foreach ($comments as $comment)
 688              $wpdb->update( $wpdb->posts, array('comment_count' => $comment->c), array('ID' => $comment->comment_post_ID) );
 689  
 690      // Some alpha versions used a post status of object instead of attachment and put
 691      // the mime type in post_type instead of post_mime_type.
 692      if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {
 693          $objects = $wpdb->get_results("SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'");
 694          foreach ($objects as $object) {
 695              $wpdb->update( $wpdb->posts, array(    'post_status' => 'attachment',
 696                                                  'post_mime_type' => $object->post_type,
 697                                                  'post_type' => ''),
 698                                           array( 'ID' => $object->ID ) );
 699  
 700              $meta = get_post_meta($object->ID, 'imagedata', true);
 701              if ( ! empty($meta['file']) )
 702                  update_attached_file( $object->ID, $meta['file'] );
 703          }
 704      }
 705  }
 706  
 707  /**
 708   * Execute changes made in WordPress 2.1.
 709   *
 710   * @since 2.1.0
 711   */
 712  function upgrade_210() {
 713      global $wpdb, $wp_current_db_version;
 714  
 715      if ( $wp_current_db_version < 3506 ) {
 716          // Update status and type.
 717          $posts = $wpdb->get_results("SELECT ID, post_status FROM $wpdb->posts");
 718  
 719          if ( ! empty($posts) ) foreach ($posts as $post) {
 720              $status = $post->post_status;
 721              $type = 'post';
 722  
 723              if ( 'static' == $status ) {
 724                  $status = 'publish';
 725                  $type = 'page';
 726              } else if ( 'attachment' == $status ) {
 727                  $status = 'inherit';
 728                  $type = 'attachment';
 729              }
 730  
 731              $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d", $status, $type, $post->ID) );
 732          }
 733      }
 734  
 735      if ( $wp_current_db_version < 3845 ) {
 736          populate_roles_210();
 737      }
 738  
 739      if ( $wp_current_db_version < 3531 ) {
 740          // Give future posts a post_status of future.
 741          $now = gmdate('Y-m-d H:i:59');
 742          $wpdb->query ("UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'");
 743  
 744          $posts = $wpdb->get_results("SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'");
 745          if ( !empty($posts) )
 746              foreach ( $posts as $post )
 747                  wp_schedule_single_event(mysql2date('U', $post->post_date, false), 'publish_future_post', array($post->ID));
 748      }
 749  }
 750  
 751  /**
 752   * Execute changes made in WordPress 2.3.
 753   *
 754   * @since 2.3.0
 755   */
 756  function upgrade_230() {
 757      global $wp_current_db_version, $wpdb;
 758  
 759      if ( $wp_current_db_version < 5200 ) {
 760          populate_roles_230();
 761      }
 762  
 763      // Convert categories to terms.
 764      $tt_ids = array();
 765      $have_tags = false;
 766      $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_ID");
 767      foreach ($categories as $category) {
 768          $term_id = (int) $category->cat_ID;
 769          $name = $category->cat_name;
 770          $description = $category->category_description;
 771          $slug = $category->category_nicename;
 772          $parent = $category->category_parent;
 773          $term_group = 0;
 774  
 775          // Associate terms with the same slug in a term group and make slugs unique.
 776          if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) {
 777              $term_group = $exists[0]->term_group;
 778              $id = $exists[0]->term_id;
 779              $num = 2;
 780              do {
 781                  $alt_slug = $slug . "-$num";
 782                  $num++;
 783                  $slug_check = $wpdb->get_var( $wpdb->prepare("SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug) );
 784              } while ( $slug_check );
 785  
 786              $slug = $alt_slug;
 787  
 788              if ( empty( $term_group ) ) {
 789                  $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group") + 1;
 790                  $wpdb->query( $wpdb->prepare("UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $id) );
 791              }
 792          }
 793  
 794          $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES
 795          (%d, %s, %s, %d)", $term_id, $name, $slug, $term_group) );
 796  
 797          $count = 0;
 798          if ( !empty($category->category_count) ) {
 799              $count = (int) $category->category_count;
 800              $taxonomy = 'category';
 801              $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) );
 802              $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
 803          }
 804  
 805          if ( !empty($category->link_count) ) {
 806              $count = (int) $category->link_count;
 807              $taxonomy = 'link_category';
 808              $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) );
 809              $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
 810          }
 811  
 812          if ( !empty($category->tag_count) ) {
 813              $have_tags = true;
 814              $count = (int) $category->tag_count;
 815              $taxonomy = 'post_tag';
 816              $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );
 817              $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
 818          }
 819  
 820          if ( empty($count) ) {
 821              $count = 0;
 822              $taxonomy = 'category';
 823              $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );
 824              $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
 825          }
 826      }
 827  
 828      $select = 'post_id, category_id';
 829      if ( $have_tags )
 830          $select .= ', rel_type';
 831  
 832      $posts = $wpdb->get_results("SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id");
 833      foreach ( $posts as $post ) {
 834          $post_id = (int) $post->post_id;
 835          $term_id = (int) $post->category_id;
 836          $taxonomy = 'category';
 837          if ( !empty($post->rel_type) && 'tag' == $post->rel_type)
 838              $taxonomy = 'tag';
 839          $tt_id = $tt_ids[$term_id][$taxonomy];
 840          if ( empty($tt_id) )
 841              continue;
 842  
 843          $wpdb->insert( $wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $tt_id) );
 844      }
 845  
 846      // < 3570 we used linkcategories. >= 3570 we used categories and link2cat.
 847      if ( $wp_current_db_version < 3570 ) {
 848          // Create link_category terms for link categories. Create a map of link cat IDs
 849          // to link_category terms.
 850          $link_cat_id_map = array();
 851          $default_link_cat = 0;
 852          $tt_ids = array();
 853          $link_cats = $wpdb->get_results("SELECT cat_id, cat_name FROM " . $wpdb->prefix . 'linkcategories');
 854          foreach ( $link_cats as $category) {
 855              $cat_id = (int) $category->cat_id;
 856              $term_id = 0;
 857              $name = wp_slash($category->cat_name);
 858              $slug = sanitize_title($name);
 859              $term_group = 0;
 860  
 861              // Associate terms with the same slug in a term group and make slugs unique.
 862              if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) {
 863                  $term_group = $exists[0]->term_group;
 864                  $term_id = $exists[0]->term_id;
 865              }
 866  
 867              if ( empty($term_id) ) {
 868                  $wpdb->insert( $wpdb->terms, compact('name', 'slug', 'term_group') );
 869                  $term_id = (int) $wpdb->insert_id;
 870              }
 871  
 872              $link_cat_id_map[$cat_id] = $term_id;
 873              $default_link_cat = $term_id;
 874  
 875              $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $term_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 0) );
 876              $tt_ids[$term_id] = (int) $wpdb->insert_id;
 877          }
 878  
 879          // Associate links to cats.
 880          $links = $wpdb->get_results("SELECT link_id, link_category FROM $wpdb->links");
 881          if ( !empty($links) ) foreach ( $links as $link ) {
 882              if ( 0 == $link->link_category )
 883                  continue;
 884              if ( ! isset($link_cat_id_map[$link->link_category]) )
 885                  continue;
 886              $term_id = $link_cat_id_map[$link->link_category];
 887              $tt_id = $tt_ids[$term_id];
 888              if ( empty($tt_id) )
 889                  continue;
 890  
 891              $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link->link_id, 'term_taxonomy_id' => $tt_id) );
 892          }
 893  
 894          // Set default to the last category we grabbed during the upgrade loop.
 895          update_option('default_link_category', $default_link_cat);
 896      } else {
 897          $links = $wpdb->get_results("SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id");
 898          foreach ( $links as $link ) {
 899              $link_id = (int) $link->link_id;
 900              $term_id = (int) $link->category_id;
 901              $taxonomy = 'link_category';
 902              $tt_id = $tt_ids[$term_id][$taxonomy];
 903              if ( empty($tt_id) )
 904                  continue;
 905              $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link_id, 'term_taxonomy_id' => $tt_id) );
 906          }
 907      }
 908  
 909      if ( $wp_current_db_version < 4772 ) {
 910          // Obsolete linkcategories table
 911          $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories');
 912      }
 913  
 914      // Recalculate all counts
 915      $terms = $wpdb->get_results("SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy");
 916      foreach ( (array) $terms as $term ) {
 917          if ( ('post_tag' == $term->taxonomy) || ('category' == $term->taxonomy) )
 918              $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) );
 919          else
 920              $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term->term_taxonomy_id) );
 921          $wpdb->update( $wpdb->term_taxonomy, array('count' => $count), array('term_taxonomy_id' => $term->term_taxonomy_id) );
 922      }
 923  }
 924  
 925  /**
 926   * Remove old options from the database.
 927   *
 928   * @since 2.3.0
 929   */
 930  function upgrade_230_options_table() {
 931      global $wpdb;
 932      $old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' );
 933      $wpdb->hide_errors();
 934      foreach ( $old_options_fields as $old )
 935          $wpdb->query("ALTER TABLE $wpdb->options DROP $old");
 936      $wpdb->show_errors();
 937  }
 938  
 939  /**
 940   * Remove old categories, link2cat, and post2cat database tables.
 941   *
 942   * @since 2.3.0
 943   */
 944  function upgrade_230_old_tables() {
 945      global $wpdb;
 946      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories');
 947      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat');
 948      $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat');
 949  }
 950  
 951  /**
 952   * Upgrade old slugs made in version 2.2.
 953   *
 954   * @since 2.2.0
 955   */
 956  function upgrade_old_slugs() {
 957      // upgrade people who were using the Redirect Old Slugs plugin
 958      global $wpdb;
 959      $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
 960  }
 961  
 962  /**
 963   * Execute changes made in WordPress 2.5.0.
 964   *
 965   * @since 2.5.0
 966   */
 967  function upgrade_250() {
 968      global $wp_current_db_version;
 969  
 970      if ( $wp_current_db_version < 6689 ) {
 971          populate_roles_250();
 972      }
 973  
 974  }
 975  
 976  /**
 977   * Execute changes made in WordPress 2.5.2.
 978   *
 979   * @since 2.5.2
 980   */
 981  function upgrade_252() {
 982      global $wpdb;
 983  
 984      $wpdb->query("UPDATE $wpdb->users SET user_activation_key = ''");
 985  }
 986  
 987  /**
 988   * Execute changes made in WordPress 2.6.
 989   *
 990   * @since 2.6.0
 991   */
 992  function upgrade_260() {
 993      global $wp_current_db_version;
 994  
 995      if ( $wp_current_db_version < 8000 )
 996          populate_roles_260();
 997  }
 998  
 999  /**
1000   * Execute changes made in WordPress 2.7.
1001   *
1002   * @since 2.7.0
1003   */
1004  function upgrade_270() {
1005      global $wpdb, $wp_current_db_version;
1006  
1007      if ( $wp_current_db_version < 8980 )
1008          populate_roles_270();
1009  
1010      // Update post_date for unpublished posts with empty timestamp
1011      if ( $wp_current_db_version < 8921 )
1012          $wpdb->query( "UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'" );
1013  }
1014  
1015  /**
1016   * Execute changes made in WordPress 2.8.
1017   *
1018   * @since 2.8.0
1019   */
1020  function upgrade_280() {
1021      global $wp_current_db_version, $wpdb;
1022  
1023      if ( $wp_current_db_version < 10360 )
1024          populate_roles_280();
1025      if ( is_multisite() ) {
1026          $start = 0;
1027          while( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) {
1028              foreach( $rows as $row ) {
1029                  $value = $row->option_value;
1030                  if ( !@unserialize( $value ) )
1031                      $value = stripslashes( $value );
1032                  if ( $value !== $row->option_value ) {
1033                      update_option( $row->option_name, $value );
1034                  }
1035              }
1036              $start += 20;
1037          }
1038          refresh_blog_details( $wpdb->blogid );
1039      }
1040  }
1041  
1042  /**
1043   * Execute changes made in WordPress 2.9.
1044   *
1045   * @since 2.9.0
1046   */
1047  function upgrade_290() {
1048      global $wp_current_db_version;
1049  
1050      if ( $wp_current_db_version < 11958 ) {
1051          // Previously, setting depth to 1 would redundantly disable threading, but now 2 is the minimum depth to avoid confusion
1052          if ( get_option( 'thread_comments_depth' ) == '1' ) {
1053              update_option( 'thread_comments_depth', 2 );
1054              update_option( 'thread_comments', 0 );
1055          }
1056      }
1057  }
1058  
1059  /**
1060   * Execute changes made in WordPress 3.0.
1061   *
1062   * @since 3.0.0
1063   */
1064  function upgrade_300() {
1065      global $wp_current_db_version, $wpdb;
1066  
1067      if ( $wp_current_db_version < 15093 )
1068          populate_roles_300();
1069  
1070      if ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false )
1071          add_site_option( 'siteurl', '' );
1072  
1073      // 3.0 screen options key name changes.
1074      if ( is_main_site() && !defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) {
1075          $prefix = like_escape($wpdb->base_prefix);
1076          $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%'
1077                       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'" );
1078      }
1079  
1080  }
1081  
1082  /**
1083   * Execute changes made in WordPress 3.3.
1084   *
1085   * @since 3.3.0
1086   */
1087  function upgrade_330() {
1088      global $wp_current_db_version, $wpdb, $wp_registered_widgets, $sidebars_widgets;
1089  
1090      if ( $wp_current_db_version < 19061 && is_main_site() && ! defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
1091          $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key IN ('show_admin_bar_admin', 'plugins_last_view')" );
1092      }
1093  
1094      if ( $wp_current_db_version >= 11548 )
1095          return;
1096  
1097      $sidebars_widgets = get_option( 'sidebars_widgets', array() );
1098      $_sidebars_widgets = array();
1099  
1100      if ( isset($sidebars_widgets['wp_inactive_widgets']) || empty($sidebars_widgets) )
1101          $sidebars_widgets['array_version'] = 3;
1102      elseif ( !isset($sidebars_widgets['array_version']) )
1103          $sidebars_widgets['array_version'] = 1;
1104  
1105      switch ( $sidebars_widgets['array_version'] ) {
1106          case 1 :
1107              foreach ( (array) $sidebars_widgets as $index => $sidebar )
1108              if ( is_array($sidebar) )
1109              foreach ( (array) $sidebar as $i => $name ) {
1110                  $id = strtolower($name);
1111                  if ( isset($wp_registered_widgets[$id]) ) {
1112                      $_sidebars_widgets[$index][$i] = $id;
1113                      continue;
1114                  }
1115                  $id = sanitize_title($name);
1116                  if ( isset($wp_registered_widgets[$id]) ) {
1117                      $_sidebars_widgets[$index][$i] = $id;
1118                      continue;
1119                  }
1120  
1121                  $found = false;
1122  
1123                  foreach ( $wp_registered_widgets as $widget_id => $widget ) {
1124                      if ( strtolower($widget['name']) == strtolower($name) ) {
1125                          $_sidebars_widgets[$index][$i] = $widget['id'];
1126                          $found = true;
1127                          break;
1128                      } elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) {
1129                          $_sidebars_widgets[$index][$i] = $widget['id'];
1130                          $found = true;
1131                          break;
1132                      }
1133                  }
1134  
1135                  if ( $found )
1136                      continue;
1137  
1138                  unset($_sidebars_widgets[$index][$i]);
1139              }
1140              $_sidebars_widgets['array_version'] = 2;
1141              $sidebars_widgets = $_sidebars_widgets;
1142              unset($_sidebars_widgets);
1143  
1144          case 2 :
1145              $sidebars_widgets = retrieve_widgets();
1146              $sidebars_widgets['array_version'] = 3;
1147              update_option( 'sidebars_widgets', $sidebars_widgets );
1148      }
1149  }
1150  
1151  /**
1152   * Execute changes made in WordPress 3.4.
1153   *
1154   * @since 3.4.0
1155   */
1156  function upgrade_340() {
1157      global $wp_current_db_version, $wpdb;
1158  
1159      if ( $wp_current_db_version < 19798 ) {
1160          $wpdb->hide_errors();
1161          $wpdb->query( "ALTER TABLE $wpdb->options DROP COLUMN blog_id" );
1162          $wpdb->show_errors();
1163      }
1164  
1165      if ( $wp_current_db_version < 19799 ) {
1166          $wpdb->hide_errors();
1167          $wpdb->query("ALTER TABLE $wpdb->comments DROP INDEX comment_approved");
1168          $wpdb->show_errors();
1169      }
1170  
1171      if ( $wp_current_db_version < 20022 && is_main_site() && ! defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
1172          $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key = 'themes_last_view'" );
1173      }
1174  
1175      if ( $wp_current_db_version < 20080 ) {
1176          if ( 'yes' == $wpdb->get_var( "SELECT autoload FROM $wpdb->options WHERE option_name = 'uninstall_plugins'" ) ) {
1177              $uninstall_plugins = get_option( 'uninstall_plugins' );
1178              delete_option( 'uninstall_plugins' );
1179              add_option( 'uninstall_plugins', $uninstall_plugins, null, 'no' );
1180          }
1181      }
1182  }
1183  
1184  /**
1185   * Execute changes made in WordPress 3.5.
1186   *
1187   * @since 3.5.0
1188   */
1189  function upgrade_350() {
1190      global $wp_current_db_version, $wpdb;
1191  
1192      if ( $wp_current_db_version < 22006 && $wpdb->get_var( "SELECT link_id FROM $wpdb->links LIMIT 1" ) )
1193          update_option( 'link_manager_enabled', 1 ); // Previously set to 0 by populate_options()
1194  
1195      if ( $wp_current_db_version < 21811 && is_main_site() && ! defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
1196          $meta_keys = array();
1197          foreach ( array_merge( get_post_types(), get_taxonomies() ) as $name ) {
1198              if ( false !== strpos( $name, '-' ) )
1199              $meta_keys[] = 'edit_' . str_replace( '-', '_', $name ) . '_per_page';
1200          }
1201          if ( $meta_keys ) {
1202              $meta_keys = implode( "', '", $meta_keys );
1203              $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key IN ('$meta_keys')" );
1204          }
1205      }
1206  
1207      if ( $wp_current_db_version < 22422 && $term = get_term_by( 'slug', 'post-format-standard', 'post_format' ) )
1208          wp_delete_term( $term->term_id, 'post_format' );
1209  }
1210  
1211  /**
1212   * Execute network level changes
1213   *
1214   * @since 3.0.0
1215   */
1216  function upgrade_network() {
1217      global $wp_current_db_version, $wpdb;
1218      // 2.8
1219      if ( $wp_current_db_version < 11549 ) {
1220          $wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' );
1221          $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
1222          if ( $wpmu_sitewide_plugins ) {
1223              if ( !$active_sitewide_plugins )
1224                  $sitewide_plugins = (array) $wpmu_sitewide_plugins;
1225              else
1226                  $sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins );
1227  
1228              update_site_option( 'active_sitewide_plugins', $sitewide_plugins );
1229          }
1230          delete_site_option( 'wpmu_sitewide_plugins' );
1231          delete_site_option( 'deactivated_sitewide_plugins' );
1232  
1233          $start = 0;
1234          while( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) {
1235              foreach( $rows as $row ) {
1236                  $value = $row->meta_value;
1237                  if ( !@unserialize( $value ) )
1238                      $value = stripslashes( $value );
1239                  if ( $value !== $row->meta_value ) {
1240                      update_site_option( $row->meta_key, $value );
1241                  }
1242              }
1243              $start += 20;
1244          }
1245      }
1246  
1247      // 3.0
1248      if ( $wp_current_db_version < 13576 )
1249          update_site_option( 'global_terms_enabled', '1' );
1250  
1251      // 3.3
1252      if ( $wp_current_db_version < 19390 )
1253          update_site_option( 'initial_db_version', $wp_current_db_version );
1254  
1255      if ( $wp_current_db_version < 19470 ) {
1256          if ( false === get_site_option( 'active_sitewide_plugins' ) )
1257              update_site_option( 'active_sitewide_plugins', array() );
1258      }
1259  
1260      // 3.4
1261      if ( $wp_current_db_version < 20148 ) {
1262          // 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name.
1263          $allowedthemes  = get_site_option( 'allowedthemes'  );
1264          $allowed_themes = get_site_option( 'allowed_themes' );
1265          if ( false === $allowedthemes && is_array( $allowed_themes ) && $allowed_themes ) {
1266              $converted = array();
1267              $themes = wp_get_themes();
1268              foreach ( $themes as $stylesheet => $theme_data ) {
1269                  if ( isset( $allowed_themes[ $theme_data->get('Name') ] ) )
1270                      $converted[ $stylesheet ] = true;
1271              }
1272              update_site_option( 'allowedthemes', $converted );
1273              delete_site_option( 'allowed_themes' );
1274          }
1275      }
1276  
1277      // 3.5
1278      if ( $wp_current_db_version < 21823 )
1279          update_site_option( 'ms_files_rewriting', '1' );
1280  }
1281  
1282  // The functions we use to actually do stuff
1283  
1284  // General
1285  
1286  /**
1287   * {@internal Missing Short Description}}
1288   *
1289   * {@internal Missing Long Description}}
1290   *
1291   * @since 1.0.0
1292   *
1293   * @param string $table_name Database table name to create.
1294   * @param string $create_ddl SQL statement to create table.
1295   * @return bool If table already exists or was created by function.
1296   */
1297  function maybe_create_table($table_name, $create_ddl) {
1298      global $wpdb;
1299      if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name )
1300          return true;
1301      //didn't find it try to create it.
1302      $q = $wpdb->query($create_ddl);
1303      // we cannot directly tell that whether this succeeded!
1304      if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name )
1305          return true;
1306      return false;
1307  }
1308  
1309  /**
1310   * {@internal Missing Short Description}}
1311   *
1312   * {@internal Missing Long Description}}
1313   *
1314   * @since 1.0.1
1315   *
1316   * @param string $table Database table name.
1317   * @param string $index Index name to drop.
1318   * @return bool True, when finished.
1319   */
1320  function drop_index($table, $index) {
1321      global $wpdb;
1322      $wpdb->hide_errors();
1323      $wpdb->query("ALTER TABLE `$table` DROP INDEX `$index`");
1324      // Now we need to take out all the extra ones we may have created
1325      for ($i = 0; $i < 25; $i++) {
1326          $wpdb->query("ALTER TABLE `$table` DROP INDEX `{$index}_$i`");
1327      }
1328      $wpdb->show_errors();
1329      return true;
1330  }
1331  
1332  /**
1333   * {@internal Missing Short Description}}
1334   *
1335   * {@internal Missing Long Description}}
1336   *
1337   * @since 1.0.1
1338   *
1339   * @param string $table Database table name.
1340   * @param string $index Database table index column.
1341   * @return bool True, when done with execution.
1342   */
1343  function add_clean_index($table, $index) {
1344      global $wpdb;
1345      drop_index($table, $index);
1346      $wpdb->query("ALTER TABLE `$table` ADD INDEX ( `$index` )");
1347      return true;
1348  }
1349  
1350  /**
1351   ** maybe_add_column()
1352   ** Add column to db table if it doesn't exist.
1353   ** Returns:  true if already exists or on successful completion
1354   **           false on error
1355   */
1356  function maybe_add_column($table_name, $column_name, $create_ddl) {
1357      global $wpdb;
1358      foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
1359          if ($column == $column_name) {
1360              return true;
1361          }
1362      }
1363      //didn't find it try to create it.
1364      $q = $wpdb->query($create_ddl);
1365      // we cannot directly tell that whether this succeeded!
1366      foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
1367          if ($column == $column_name) {
1368              return true;
1369          }
1370      }
1371      return false;
1372  }
1373  
1374  /**
1375   * Retrieve all options as it was for 1.2.
1376   *
1377   * @since 1.2.0
1378   *
1379   * @return array List of options.
1380   */
1381  function get_alloptions_110() {
1382      global $wpdb;
1383      $all_options = new stdClass;
1384      if ( $options = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" ) ) {
1385          foreach ( $options as $option ) {
1386              if ( 'siteurl' == $option->option_name || 'home' == $option->option_name || 'category_base' == $option->option_name )
1387                  $option->option_value = untrailingslashit( $option->option_value );
1388              $all_options->{$option->option_name} = stripslashes( $option->option_value );
1389          }
1390      }
1391      return $all_options;
1392  }
1393  
1394  /**
1395   * Version of get_option that is private to install/upgrade.
1396   *
1397   * @since 1.5.1
1398   * @access private
1399   *
1400   * @param string $setting Option name.
1401   * @return mixed
1402   */
1403  function __get_option($setting) {
1404      global $wpdb;
1405  
1406      if ( $setting == 'home' && defined( 'WP_HOME' ) )
1407          return untrailingslashit( WP_HOME );
1408  
1409      if ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) )
1410          return untrailingslashit( WP_SITEURL );
1411  
1412      $option = $wpdb->get_var( $wpdb->prepare("SELECT option_value FROM $wpdb->options WHERE option_name = %s", $setting ) );
1413  
1414      if ( 'home' == $setting && '' == $option )
1415          return __get_option( 'siteurl' );
1416  
1417      if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting || 'tag_base' == $setting )
1418          $option = untrailingslashit( $option );
1419  
1420      @ $kellogs = unserialize( $option );
1421      if ( $kellogs !== false )
1422          return $kellogs;
1423      else
1424          return $option;
1425  }
1426  
1427  /**
1428   * {@internal Missing Short Description}}
1429   *
1430   * {@internal Missing Long Description}}
1431   *
1432   * @since 1.5.0
1433   *
1434   * @param string $content
1435   * @return string
1436   */
1437  function deslash($content) {
1438      // Note: \\\ inside a regex denotes a single backslash.
1439  
1440      // Replace one or more backslashes followed by a single quote with
1441      // a single quote.
1442      $content = preg_replace("/\\\+'/", "'", $content);
1443  
1444      // Replace one or more backslashes followed by a double quote with
1445      // a double quote.
1446      $content = preg_replace('/\\\+"/', '"', $content);
1447  
1448      // Replace one or more backslashes with one backslash.
1449      $content = preg_replace("/\\\+/", "\\", $content);
1450  
1451      return $content;
1452  }
1453  
1454  /**
1455   * {@internal Missing Short Description}}
1456   *
1457   * {@internal Missing Long Description}}
1458   *
1459   * @since 1.5.0
1460   *
1461   * @param unknown_type $queries
1462   * @param unknown_type $execute
1463   * @return unknown
1464   */
1465  function dbDelta( $queries = '', $execute = true ) {
1466      global $wpdb;
1467  
1468      if ( in_array( $queries, array( '', 'all', 'blog', 'global', 'ms_global' ), true ) )
1469          $queries = wp_get_db_schema( $queries );
1470  
1471      // Separate individual queries into an array
1472      if ( !is_array($queries) ) {
1473          $queries = explode( ';', $queries );
1474          $queries = array_filter( $queries );
1475      }
1476      $queries = apply_filters( 'dbdelta_queries', $queries );
1477  
1478      $cqueries = array(); // Creation Queries
1479      $iqueries = array(); // Insertion Queries
1480      $for_update = array();
1481  
1482      // Create a tablename index for an array ($cqueries) of queries
1483      foreach($queries as $qry) {
1484          if (preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) {
1485              $cqueries[ trim( $matches[1], '`' ) ] = $qry;
1486              $for_update[$matches[1]] = 'Created table '.$matches[1];
1487          } else if (preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) {
1488              array_unshift($cqueries, $qry);
1489          } else if (preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) {
1490              $iqueries[] = $qry;
1491          } else if (preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) {
1492              $iqueries[] = $qry;
1493          } else {
1494              // Unrecognized query type
1495          }
1496      }
1497      $cqueries = apply_filters( 'dbdelta_create_queries', $cqueries );
1498      $iqueries = apply_filters( 'dbdelta_insert_queries', $iqueries );
1499  
1500      $global_tables = $wpdb->tables( 'global' );
1501      foreach ( $cqueries as $table => $qry ) {
1502          // Upgrade global tables only for the main site. Don't upgrade at all if DO_NOT_UPGRADE_GLOBAL_TABLES is defined.
1503          if ( in_array( $table, $global_tables ) && ( !is_main_site() || defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) )
1504              continue;
1505  
1506          // Fetch the table column structure from the database
1507          $wpdb->suppress_errors();
1508          $tablefields = $wpdb->get_results("DESCRIBE {$table};");
1509          $wpdb->suppress_errors( false );
1510  
1511          if ( ! $tablefields )
1512              continue;
1513  
1514          // Clear the field and index arrays
1515          $cfields = $indices = array();
1516          // Get all of the field names in the query from between the parens
1517          preg_match("|\((.*)\)|ms", $qry, $match2);
1518          $qryline = trim($match2[1]);
1519  
1520          // Separate field lines into an array
1521          $flds = explode("\n", $qryline);
1522  
1523          //echo "<hr/><pre>\n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."</pre><hr/>";
1524  
1525          // For every field line specified in the query
1526          foreach ($flds as $fld) {
1527              // Extract the field name
1528              preg_match("|^([^ ]*)|", trim($fld), $fvals);
1529              $fieldname = trim( $fvals[1], '`' );
1530  
1531              // Verify the found field name
1532              $validfield = true;
1533              switch (strtolower($fieldname)) {
1534              case '':
1535              case 'primary':
1536              case 'index':
1537              case 'fulltext':
1538              case 'unique':
1539              case 'key':
1540                  $validfield = false;
1541                  $indices[] = trim(trim($fld), ", \n");
1542                  break;
1543              }
1544              $fld = trim($fld);
1545  
1546              // If it's a valid field, add it to the field array
1547              if ($validfield) {
1548                  $cfields[strtolower($fieldname)] = trim($fld, ", \n");
1549              }
1550          }
1551  
1552          // For every field in the table
1553          foreach ($tablefields as $tablefield) {
1554              // If the table field exists in the field array...
1555              if (array_key_exists(strtolower($tablefield->Field), $cfields)) {
1556                  // Get the field type from the query
1557                  preg_match("|".$tablefield->Field." ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches);
1558                  $fieldtype = $matches[1];
1559  
1560                  // Is actual field type different from the field type in query?
1561                  if ($tablefield->Type != $fieldtype) {
1562                      // Add a query to change the column type
1563                      $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)];
1564                      $for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
1565                  }
1566  
1567                  // Get the default value from the array
1568                      //echo "{$cfields[strtolower($tablefield->Field)]}<br>";
1569                  if (preg_match("| DEFAULT '(.*?)'|i", $cfields[strtolower($tablefield->Field)], $matches)) {
1570                      $default_value = $matches[1];
1571                      if ($tablefield->Default != $default_value) {
1572                          // Add a query to change the column's default value
1573                          $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
1574                          $for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
1575                      }
1576                  }
1577  
1578                  // Remove the field from the array (so it's not added)
1579                  unset($cfields[strtolower($tablefield->Field)]);
1580              } else {
1581                  // This field exists in the table, but not in the creation queries?
1582              }
1583          }
1584  
1585          // For every remaining field specified for the table
1586          foreach ($cfields as $fieldname => $fielddef) {
1587              // Push a query line into $cqueries that adds the field to that table
1588              $cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef";
1589              $for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname;
1590          }
1591  
1592          // Index stuff goes here
1593          // Fetch the table index structure from the database
1594          $tableindices = $wpdb->get_results("SHOW INDEX FROM {$table};");
1595  
1596          if ($tableindices) {
1597              // Clear the index array
1598              unset($index_ary);
1599  
1600              // For every index in the table
1601              foreach ($tableindices as $tableindex) {
1602                  // Add the index to the index data array
1603                  $keyname = $tableindex->Key_name;
1604                  $index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);
1605                  $index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false;
1606              }
1607  
1608              // For each actual index in the index array
1609              foreach ($index_ary as $index_name => $index_data) {
1610                  // Build a create string to compare to the query
1611                  $index_string = '';
1612                  if ($index_name == 'PRIMARY') {
1613                      $index_string .= 'PRIMARY ';
1614                  } else if($index_data['unique']) {
1615                      $index_string .= 'UNIQUE ';
1616                  }
1617                  $index_string .= 'KEY ';
1618                  if ($index_name != 'PRIMARY') {
1619                      $index_string .= $index_name;
1620                  }
1621                  $index_columns = '';
1622                  // For each column in the index
1623                  foreach ($index_data['columns'] as $column_data) {
1624                      if ($index_columns != '') $index_columns .= ',';
1625                      // Add the field to the column list string
1626                      $index_columns .= $column_data['fieldname'];
1627                      if ($column_data['subpart'] != '') {
1628                          $index_columns .= '('.$column_data['subpart'].')';
1629                      }
1630                  }
1631                  // Add the column list to the index create string
1632                  $index_string .= ' ('.$index_columns.')';
1633                  if (!(($aindex = array_search($index_string, $indices)) === false)) {
1634                      unset($indices[$aindex]);
1635                      //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br />Found index:".$index_string."</pre>\n";
1636                  }
1637                  //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";
1638              }
1639          }
1640  
1641          // For every remaining index specified for the table
1642          foreach ( (array) $indices as $index ) {
1643              // Push a query line into $cqueries that adds the index to that table
1644              $cqueries[] = "ALTER TABLE {$table} ADD $index";
1645              $for_update[$table.'.'.$fieldname] = 'Added index '.$table.' '.$index;
1646          }
1647  
1648          // Remove the original table creation query from processing
1649          unset( $cqueries[ $table ], $for_update[ $table ] );
1650      }
1651  
1652      $allqueries = array_merge($cqueries, $iqueries);
1653      if ($execute) {
1654          foreach ($allqueries as $query) {
1655              //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">".print_r($query, true)."</pre>\n";
1656              $wpdb->query($query);
1657          }
1658      }
1659  
1660      return $for_update;
1661  }
1662  
1663  /**
1664   * {@internal Missing Short Description}}
1665   *
1666   * {@internal Missing Long Description}}
1667   *
1668   * @since 1.5.0
1669   */
1670  function make_db_current( $tables = 'all' ) {
1671      $alterations = dbDelta( $tables );
1672      echo "<ol>\n";
1673      foreach($alterations as $alteration) echo "<li>$alteration</li>\n";
1674      echo "</ol>\n";
1675  }
1676  
1677  /**
1678   * {@internal Missing Short Description}}
1679   *
1680   * {@internal Missing Long Description}}
1681   *
1682   * @since 1.5.0
1683   */
1684  function make_db_current_silent( $tables = 'all' ) {
1685      $alterations = dbDelta( $tables );
1686  }
1687  
1688  /**
1689   * {@internal Missing Short Description}}
1690   *
1691   * {@internal Missing Long Description}}
1692   *
1693   * @since 1.5.0
1694   *
1695   * @param unknown_type $theme_name
1696   * @param unknown_type $template
1697   * @return unknown
1698   */
1699  function make_site_theme_from_oldschool($theme_name, $template) {
1700      $home_path = get_home_path();
1701      $site_dir = WP_CONTENT_DIR . "/themes/$template";
1702  
1703      if (! file_exists("$home_path/index.php"))
1704          return false;
1705  
1706      // Copy files from the old locations to the site theme.
1707      // TODO: This does not copy arbitrary include dependencies. Only the
1708      // standard WP files are copied.
1709      $files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php');
1710  
1711      foreach ($files as $oldfile => $newfile) {
1712          if ($oldfile == 'index.php')
1713              $oldpath = $home_path;
1714          else
1715              $oldpath = ABSPATH;
1716  
1717          if ($oldfile == 'index.php') { // Check to make sure it's not a new index
1718              $index = implode('', file("$oldpath/$oldfile"));
1719              if (strpos($index, 'WP_USE_THEMES') !== false) {
1720                  if (! @copy(WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME . '/index.php', "$site_dir/$newfile"))
1721                      return false;
1722                  continue; // Don't copy anything
1723                  }
1724          }
1725  
1726          if (! @copy("$oldpath/$oldfile", "$site_dir/$newfile"))
1727              return false;
1728  
1729          chmod("$site_dir/$newfile", 0777);
1730  
1731          // Update the blog header include in each file.
1732          $lines = explode("\n", implode('', file("$site_dir/$newfile")));
1733          if ($lines) {
1734              $f = fopen("$site_dir/$newfile", 'w');
1735  
1736              foreach ($lines as $line) {
1737                  if (preg_match('/require.*wp-blog-header/', $line))
1738                      $line = '//' . $line;
1739  
1740                  // Update stylesheet references.
1741                  $line = str_replace("<?php echo __get_option('siteurl'); ?>/wp-layout.css", "<?php bloginfo('stylesheet_url'); ?>", $line);
1742  
1743                  // Update comments template inclusion.
1744                  $line = str_replace("<?php include(ABSPATH . 'wp-comments.php'); ?>", "<?php comments_template(); ?>", $line);
1745  
1746                  fwrite($f, "{$line}\n");
1747              }
1748              fclose($f);
1749          }
1750      }
1751  
1752      // Add a theme header.
1753      $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";
1754  
1755      $stylelines = file_get_contents("$site_dir/style.css");
1756      if ($stylelines) {
1757          $f = fopen("$site_dir/style.css", 'w');
1758  
1759          fwrite($f, $header);
1760          fwrite($f, $stylelines);
1761          fclose($f);
1762      }
1763  
1764      return true;
1765  }
1766  
1767  /**
1768   * {@internal Missing Short Description}}
1769   *
1770   * {@internal Missing Long Description}}
1771   *
1772   * @since 1.5.0
1773   *
1774   * @param unknown_type $theme_name
1775   * @param unknown_type $template
1776   * @return unknown
1777   */
1778  function make_site_theme_from_default($theme_name, $template) {
1779      $site_dir = WP_CONTENT_DIR . "/themes/$template";
1780      $default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME;
1781  
1782      // Copy files from the default theme to the site theme.
1783      //$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css');
1784  
1785      $theme_dir = @ opendir($default_dir);
1786      if ($theme_dir) {
1787          while(($theme_file = readdir( $theme_dir )) !== false) {
1788              if (is_dir("$default_dir/$theme_file"))
1789                  continue;
1790              if (! @copy("$default_dir/$theme_file", "$site_dir/$theme_file"))
1791                  return;
1792              chmod("$site_dir/$theme_file", 0777);
1793          }
1794      }
1795      @closedir($theme_dir);
1796  
1797      // Rewrite the theme header.
1798      $stylelines = explode("\n", implode('', file("$site_dir/style.css")));
1799      if ($stylelines) {
1800          $f = fopen("$site_dir/style.css", 'w');
1801  
1802          foreach ($stylelines as $line) {
1803              if (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name;
1804              elseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url');
1805              elseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.';
1806              elseif (strpos($line, 'Version:') !== false) $line = 'Version: 1';
1807              elseif (strpos($line, 'Author:') !== false) $line = 'Author: You';
1808              fwrite($f, $line . "\n");
1809          }
1810          fclose($f);
1811      }
1812  
1813      // Copy the images.
1814      umask(0);
1815      if (! mkdir("$site_dir/images", 0777)) {
1816          return false;
1817      }
1818  
1819      $images_dir = @ opendir("$default_dir/images");
1820      if ($images_dir) {
1821          while(($image = readdir($images_dir)) !== false) {
1822              if (is_dir("$default_dir/images/$image"))
1823                  continue;
1824              if (! @copy("$default_dir/images/$image", "$site_dir/images/$image"))
1825                  return;
1826              chmod("$site_dir/images/$image", 0777);
1827          }
1828      }
1829      @closedir($images_dir);
1830  }
1831  
1832  // Create a site theme from the default theme.
1833  /**
1834   * {@internal Missing Short Description}}
1835   *
1836   * {@internal Missing Long Description}}
1837   *
1838   * @since 1.5.0
1839   *
1840   * @return unknown
1841   */
1842  function make_site_theme() {
1843      // Name the theme after the blog.
1844      $theme_name = __get_option('blogname');
1845      $template = sanitize_title($theme_name);
1846      $site_dir = WP_CONTENT_DIR . "/themes/$template";
1847  
1848      // If the theme already exists, nothing to do.
1849      if ( is_dir($site_dir)) {
1850          return false;
1851      }
1852  
1853      // We must be able to write to the themes dir.
1854      if (! is_writable(WP_CONTENT_DIR . "/themes")) {
1855          return false;
1856      }
1857  
1858      umask(0);
1859      if (! mkdir($site_dir, 0777)) {
1860          return false;
1861      }
1862  
1863      if (file_exists(ABSPATH . 'wp-layout.css')) {
1864          if (! make_site_theme_from_oldschool($theme_name, $template)) {
1865              // TODO: rm -rf the site theme directory.
1866              return false;
1867          }
1868      } else {
1869          if (! make_site_theme_from_default($theme_name, $template))
1870              // TODO: rm -rf the site theme directory.
1871              return false;
1872      }
1873  
1874      // Make the new site theme active.
1875      $current_template = __get_option('template');
1876      if ($current_template == WP_DEFAULT_THEME) {
1877          update_option('template', $template);
1878          update_option('stylesheet', $template);
1879      }
1880      return $template;
1881  }
1882  
1883  /**
1884   * Translate user level to user role name.
1885   *
1886   * @since 2.0.0
1887   *
1888   * @param int $level User level.
1889   * @return string User role name.
1890   */
1891  function translate_level_to_role($level) {
1892      switch ($level) {
1893      case 10:
1894      case 9:
1895      case 8:
1896          return 'administrator';
1897      case 7:
1898      case 6:
1899      case 5:
1900          return 'editor';
1901      case 4:
1902      case 3:
1903      case 2:
1904          return 'author';
1905      case 1:
1906          return 'contributor';
1907      case 0:
1908          return 'subscriber';
1909      }
1910  }
1911  
1912  /**
1913   * {@internal Missing Short Description}}
1914   *
1915   * {@internal Missing Long Description}}
1916   *
1917   * @since 2.1.0
1918   */
1919  function wp_check_mysql_version() {
1920      global $wpdb;
1921      $result = $wpdb->check_database_version();
1922      if ( is_wp_error( $result ) )
1923          die( $result->get_error_message() );
1924  }
1925  
1926  /**
1927   * Disables the Automattic widgets plugin, which was merged into core.
1928   *
1929   * @since 2.2.0
1930   */
1931  function maybe_disable_automattic_widgets() {
1932      $plugins = __get_option( 'active_plugins' );
1933  
1934      foreach ( (array) $plugins as $plugin ) {
1935          if ( basename( $plugin ) == 'widgets.php' ) {
1936              array_splice( $plugins, array_search( $plugin, $plugins ), 1 );
1937              update_option( 'active_plugins', $plugins );
1938              break;
1939          }
1940      }
1941  }
1942  
1943  /**
1944   * Disables the Link Manager on upgrade, if at the time of upgrade, no links exist in the DB.
1945   *
1946   * @since 3.5.0
1947   */
1948  function maybe_disable_link_manager() {
1949      global $wp_current_db_version, $wpdb;
1950  
1951      if ( $wp_current_db_version >= 22006 && get_option( 'link_manager_enabled' ) && ! $wpdb->get_var( "SELECT link_id FROM $wpdb->links LIMIT 1" ) )
1952          update_option( 'link_manager_enabled', 0 );
1953  }
1954  
1955  /**
1956   * Runs before the schema is upgraded.
1957   *
1958   * @since 2.9.0
1959   */
1960  function pre_schema_upgrade() {
1961      global $wp_current_db_version, $wp_db_version, $wpdb;
1962  
1963      // Upgrade versions prior to 2.9
1964      if ( $wp_current_db_version < 11557 ) {
1965          // Delete duplicate options. Keep the option with the highest option_id.
1966          $wpdb->query("DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id");
1967  
1968          // Drop the old primary key and add the new.
1969          $wpdb->query("ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)");
1970  
1971          // Drop the old option_name index. dbDelta() doesn't do the drop.
1972          $wpdb->query("ALTER TABLE $wpdb->options DROP INDEX option_name");
1973      }
1974  
1975  }
1976  
1977  /**
1978   * Install global terms.
1979   *
1980   * @since 3.0.0
1981   *
1982   */
1983  if ( !function_exists( 'install_global_terms' ) ) :
1984  function install_global_terms() {
1985      global $wpdb, $charset_collate;
1986      $ms_queries = "
1987  CREATE TABLE $wpdb->sitecategories (
1988    cat_ID bigint(20) NOT NULL auto_increment,
1989    cat_name varchar(55) NOT NULL default '',
1990    category_nicename varchar(200) NOT NULL default '',
1991    last_updated timestamp NOT NULL,
1992    PRIMARY KEY  (cat_ID),
1993    KEY category_nicename (category_nicename),
1994    KEY last_updated (last_updated)
1995  ) $charset_collate;
1996  ";
1997  // now create tables
1998      dbDelta( $ms_queries );
1999  }
2000  endif;


Generated: Fri May 24 03:56:23 2013 Hosted by follow the white rabbit.