[ Root ] [ Search ] [ Index ]

PHP Cross Reference of WordPress 3.0.1

Provided by Yoast

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


Generated: Thu Oct 14 05:12:05 2010 Cross-referenced by PHPXref 0.7