[ Index ]

WordPress Cross Reference

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


Generated: Tue Mar 25 01:41:18 2014 WordPress honlapkészítés: online1.hu