Make WordPress Core

Changeset 29630


Ignore:
Timestamp:
08/26/2014 07:58:33 PM (12 years ago)
Author:
ocean90
Message:

Language packs: No WPLANG anymore.

  • The WPLANG constant is no longer needed. Remove define('WPLANG', ); from wp-config-sample.php. Populate WPLANG option based on the WPLANG constant. When get_option('WPLANG') is an empty string it will override WPLANG.
  • Introduce translations_api() which is available to communicate with the translation API. Move translation install related functions to a new file.
  • Replace mu_dropdown_languages() with wp_dropdown_languages(). wp_dropdown_languages() is now populated by the translation API.
  • Remove wp_install_load_language() and allow load_default_textdomain() to switch a core translation.

fixes #13069, #15677, #19760, #28730, #29281.

Location:
trunk
Files:
9 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/translation-install.php

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

    r29372 r29630  
    437437        if ( $wp_current_db_version < 26691 )
    438438                upgrade_380();
     439
     440        if ( $wp_current_db_version < 29630 )
     441                upgrade_400();
    439442
    440443        maybe_disable_link_manager();
    … …  
    13051308        }
    13061309}
     1310
     1311/**
     1312 * Execute changes made in WordPress 4.0.0.
     1313 *
     1314 * @since 4.0.0
     1315 */
     1316function upgrade_400() {
     1317        global $wp_current_db_version;
     1318        if ( $wp_current_db_version < 29630 ) {
     1319                if ( ! is_multisite() && false === get_option( 'WPLANG' ) ) {
     1320                        if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && in_array( WPLANG, get_available_languages() ) ) {
     1321                                update_option( 'WPLANG', WPLANG );
     1322                        } else {
     1323                                update_option( 'WPLANG', '' );
     1324                        }
     1325                }
     1326        }
     1327}
     1328
    13071329/**
    13081330 * Execute network level changes
    … …  
    14201442function maybe_create_table($table_name, $create_ddl) {
    14211443        global $wpdb;
    1422        
     1444
    14231445        $query = $wpdb->prepare( "SHOW TABLES LIKE %s", $wpdb->esc_like( $table_name ) );
    14241446
    … …  
    21932215}
    21942216endif;
    2195 
    2196 /**
    2197  * Output the input fields for the language selection form on the installation screen.
    2198  *
    2199  * @since 4.0.0
    2200  *
    2201  * @see wp_get_available_translations_from_api()
    2202  *
    2203  * @param array $languages Array of available languages (populated via the Translations API).
    2204  */
    2205 function wp_install_language_form( $languages ) {
    2206         $installed_languages = get_available_languages();
    2207 
    2208         echo "<label class='screen-reader-text' for='language'>Select a default language</label>\n";
    2209         echo "<select size='14' name='language' id='language'>\n";
    2210         echo '<option value="" lang="en" selected="selected" data-continue="Continue" data-installed="1">English (United States)</option>';
    2211         echo "\n";
    2212 
    2213         if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && ( 'en_US' !== WPLANG ) ) {
    2214                 if ( isset( $languages[ WPLANG ] ) ) {
    2215                         $language = $languages[ WPLANG ];
    2216                         echo '<option value="' . esc_attr( $language['language'] ) . '" lang="' . esc_attr( $language['iso'][1] ) . '">' . esc_html( $language['native_name'] ) . "</option>\n";
    2217                 }
    2218         }
    2219 
    2220         foreach ( $languages as $language ) {
    2221                 printf( '<option value="%s" lang="%s" data-continue="%s"%s>%s</option>' . "\n",
    2222                         esc_attr( $language['language'] ),
    2223                         esc_attr( $language['iso'][1] ),
    2224                         esc_attr( $language['strings']['continue'] ),
    2225                         in_array( $language['language'], $installed_languages ) ? ' data-installed="1"' : '',
    2226                         esc_html( $language['native_name'] ) );
    2227         }
    2228         echo "</select>\n";
    2229         echo '<p class="step"><span class="spinner"></span><input id="language-continue" type="submit" class="button button-primary button-large" value="Continue" /></p>';
    2230 }
    2231 
    2232 /**
    2233  * Get available translations from the WordPress.org API.
    2234  *
    2235  * @since 4.0.0
    2236  *
    2237  * @see wp_remote_post()
    2238  *
    2239  * @return array Array of translations, each an array of data.
    2240  */
    2241 function wp_get_available_translations_from_api() {
    2242         $url = 'http://api.wordpress.org/translations/core/1.0/';
    2243         if ( wp_http_supports( array( 'ssl' ) ) ) {
    2244                 $url = set_url_scheme( $url, 'https' );
    2245         }
    2246 
    2247         $options = array(
    2248                 'timeout' => 3,
    2249                 'body' => array( 'version' => $GLOBALS['wp_version'] ),
    2250         );
    2251 
    2252         $response = wp_remote_post( $url, $options );
    2253         $body = wp_remote_retrieve_body( $response );
    2254         if ( $body && $body = json_decode( $body, true ) ) {
    2255                 $translations = array();
    2256                 // Key the array with the language code for now
    2257                 foreach ( $body['translations'] as $translation ) {
    2258                         $translations[ $translation['language'] ] = $translation;
    2259                 }
    2260                 return $translations;
    2261         }
    2262         return false;
    2263 }
    2264 
    2265 /**
    2266  * Download a language pack.
    2267  *
    2268  * @since 4.0.0
    2269  *
    2270  * @see wp_get_available_translations_from_api()
    2271  *
    2272  * @param string $download Language code to download.
    2273  * @return string|bool Returns the language code if successfully downloaded
    2274  *                     (or already installed), or false on failure.
    2275  */
    2276 function wp_install_download_language_pack( $download ) {
    2277         // Check if the translation is already installed.
    2278         if ( in_array( $download, get_available_languages() ) ) {
    2279                 return $download;
    2280         }
    2281 
    2282         // Confirm the translation is one we can download.
    2283         $translations = wp_get_available_translations_from_api();
    2284         if ( ! $translations ) {
    2285                 return false;
    2286         }
    2287         foreach ( $translations as $translation ) {
    2288                 if ( $translation['language'] === $download ) {
    2289                         $translation_to_load = true;
    2290                         break;
    2291                 }
    2292         }
    2293 
    2294         if ( empty( $translation_to_load ) ) {
    2295                 return false;
    2296         }
    2297         $translation = (object) $translation;
    2298 
    2299         require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
    2300         $skin = new Automatic_Upgrader_Skin;
    2301         $upgrader = new Language_Pack_Upgrader( $skin );
    2302         $translation->type = 'core';
    2303         /**
    2304          * @todo failures (such as non-direct FS)
    2305          */
    2306         $upgrader->upgrade( $translation, array( 'clear_update_cache' => false ) );
    2307         return $translation->language;
    2308 }
    2309 
    2310 /**
    2311  * Load a translation during the install process.
    2312  *
    2313  * @since 4.0.0
    2314  *
    2315  * @see load_textdomain()
    2316  *
    2317  * @param string $translation Translation to load.
    2318  * @return string|bool Returns the language code if successfully loaded,
    2319  *                     or false on failure.
    2320  */
    2321 function wp_install_load_language( $translation ) {
    2322         if ( ! empty( $translation ) ) {
    2323                 if ( in_array( $translation, get_available_languages() ) ) {
    2324                         $translation_to_load = $translation;
    2325                 }
    2326         }
    2327 
    2328         if ( empty( $translation_to_load ) ) {
    2329                 return false;
    2330         }
    2331 
    2332         unload_textdomain( 'default' ); // Start over.
    2333         load_textdomain( 'default', WP_LANG_DIR . "/{$translation_to_load}.mo" );
    2334         load_textdomain( 'default', WP_LANG_DIR . "/admin-{$translation_to_load}.mo" );
    2335         return $translation_to_load;
    2336 }
  • trunk/src/wp-admin/install.php

    r29611 r29630  
    3838/** Load WordPress Administration Upgrade API */
    3939require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     40
     41/** Load WordPress Translation Install API */
     42require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
    4043
    4144/** Load wpdb */
    … …  
    179182}
    180183
     184$langugage = '';
     185if ( ! empty( $_REQUEST['language'] ) ) {
     186        $langugage = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] );
     187}
     188
    181189switch($step) {
    182190        case 0: // Step 0
    183191
    184                 if ( empty( $_GET['language'] ) && ( $languages = wp_get_available_translations_from_api() ) ) {
     192                if ( empty( $langugage ) && ( $languages = wp_get_available_translations() ) ) {
    185193                        display_header( 'language-chooser' );
    186194                        echo '<form id="setup" method="post" action="?step=1">';
    … …  
    193201
    194202        case 1: // Step 1, direct link or from language chooser.
    195                 if ( ! empty( $_REQUEST['language'] ) ) {
    196                         $loaded_language = wp_install_download_language_pack( $_REQUEST['language'] );
     203                if ( ! empty( $langugage ) ) {
     204                        $loaded_language = wp_download_language_pack( $langugage );
    197205                        if ( $loaded_language ) {
    198                                 wp_install_load_language( $loaded_language );
     206                                load_default_textdomain( $loaded_language );
    199207                        }
    200208                }
    … …  
    212220                break;
    213221        case 2:
    214                 if ( !empty( $_REQUEST['language'] ) ) {
    215                         $loaded_language = wp_install_load_language( $_REQUEST['language'] );
     222                if ( ! empty( $langugage ) && load_default_textdomain( $langugage ) ) {
     223                        $loaded_language = $langugage;
    216224                } else {
    217225                        $loaded_language = 'en_US';
    … …  
    227235                $admin_password = isset($_POST['admin_password']) ? wp_unslash( $_POST['admin_password'] ) : '';
    228236                $admin_password_check = isset($_POST['admin_password2']) ? wp_unslash( $_POST['admin_password2'] ) : '';
    229                 $admin_email  = isset( $_POST['admin_email']  ) ?trim( wp_unslash( $_POST['admin_email'] ) ) : '';
    230                 $public       = isset( $_POST['blog_public']  ) ? (int) $_POST['blog_public'] : 0;
     237                $admin_email  = isset( $_POST['admin_email'] ) ?trim( wp_unslash( $_POST['admin_email'] ) ) : '';
     238                $public       = isset( $_POST['blog_public'] ) ? (int) $_POST['blog_public'] : 0;
    231239
    232240                // Check e-mail address.
  • trunk/src/wp-admin/network/settings.php

    r29030 r29630  
    103103                                        <p class="description">
    104104                                                <?php _e( 'This email address will receive notifications. Registration and support emails will also come from this address.' ); ?>
    105                                         </p>   
     105                                        </p>
    106106                                </td>
    107107                        </tr>
    … …  
    166166                                        <p class="description">
    167167                                                <?php _e( 'If you want to limit site registrations to certain domains. One domain per line.' ) ?>
    168                                         </p>   
     168                                        </p>
    169169                                </td>
    170170                        </tr>
    … …  
    232232                                        <p class="description">
    233233                                                <?php _e( 'The first comment on a new site.' ) ?>
    234                                         </p>   
     234                                        </p>
    235235                                </td>
    236236                        </tr>
    … …  
    274274                </table>
    275275
    276 <?php
     276                <?php
    277277                $languages = get_available_languages();
    278278                if ( ! empty( $languages ) ) {
    279                         $lang = get_site_option( 'WPLANG' );
    280 ?>
    281                 <h3><?php _e( 'Language Settings' ); ?></h3>
    282                 <table class="form-table">
     279                        ?>
     280                        <h3><?php _e( 'Language Settings' ); ?></h3>
     281                        <table class="form-table">
    283282                                <tr>
    284283                                        <th><label for="WPLANG"><?php _e( 'Default Language' ); ?></label></th>
    285284                                        <td>
    286                                                 <select name="WPLANG" id="WPLANG">
    287                                                         <?php mu_dropdown_languages( $languages, get_site_option( 'WPLANG' ) ); ?>
    288                                                 </select>
     285                                                <?php
     286                                                $lang = get_site_option( 'WPLANG' );
     287                                                if ( ! in_array( $lang, $languages ) ) {
     288                                                        $lang = '';
     289                                                }
     290
     291                                                wp_dropdown_languages( array(
     292                                                        'name'      => 'WPLANG',
     293                                                        'id'        => 'WPLANG',
     294                                                        'selected'  => $lang,
     295                                                        'languages' => $languages,
     296                                                ) );
     297                                                ?>
    289298                                        </td>
    290299                                </tr>
    291                 </table>
    292 <?php
    293                 } // languages
    294 ?>
     300                        </table>
     301                        <?php
     302                }
     303                ?>
    295304
    296305                <h3><?php _e( 'Menu Settings' ); ?></h3>
    … …  
    325334                </table>
    326335
    327                 <?php 
     336                <?php
    328337                /**
    329338                 * Fires at the end of the Network Settings form, before the submit button.
  • trunk/src/wp-admin/options-general.php

    r29514 r29630  
    303303</tr>
    304304<?php do_settings_fields('general', 'default'); ?>
    305 <?php
    306         $languages = get_available_languages();
    307         if ( $languages ) :
    308 ?>
     305
     306<?php
     307$languages = get_available_languages();
     308if ( ! empty( $languages ) ) {
     309        ?>
    309310        <tr>
    310                 <th width="33%" scope="row"><label for="WPLANG"><?php _e('Site Language') ?></label></th>
     311                <th width="33%" scope="row"><label for="WPLANG"><?php _e( 'Site Language' ); ?></label></th>
    311312                <td>
    312                         <?php wp_dropdown_languages( array(
     313                        <?php
     314                        $locale = get_locale();
     315                        if ( ! in_array( $locale, $languages ) ) {
     316                                $locale = '';
     317                        }
     318
     319                        wp_dropdown_languages( array(
    313320                                'name'      => 'WPLANG',
    314321                                'id'        => 'WPLANG',
    315                                 'selected'  => get_option( 'WPLANG' ),
     322                                'selected'  => $locale,
    316323                                'languages' => $languages,
    317                         ) ); ?>
     324                        ) );
     325
     326                        // Add note about deprecated WPLANG constant.
     327                        if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && $locale !== WPLANG ) {
     328                                if ( is_super_admin() ) {
     329                                        ?>
     330                                        <p class="description">
     331                                                <strong><?php _e( 'Note:' ); ?></strong> <?php printf( __( 'The %s constant in your %s file is no longer needed.' ), '<code>WPLANG</code>', '<code>wp-config.php</code>' ); ?>
     332                                        </p>
     333                                        <?php
     334                                }
     335                                _deprecated_argument( 'define()', '4.0', sprintf( __( 'The %s constant in your %s file is no longer needed.' ), 'WPLANG', 'wp-config.php' ) );
     336                        }
     337                        ?>
    318338                </td>
    319339        </tr>
    320 <?php
    321         endif;
     340        <?php
     341}
    322342?>
    323343</table>
  • trunk/src/wp-admin/options.php

    r29206 r29630  
    152152        }
    153153
    154         // Handle custom date/time formats
     154        // Handle custom date/time formats.
    155155        if ( 'general' == $option_page ) {
    156156                if ( !empty($_POST['date_format']) && isset($_POST['date_format_custom']) && '\c\u\s\t\o\m' == wp_unslash( $_POST['date_format'] ) )
    … …  
    180180                        }
    181181                        update_option( $option, $value );
     182                }
     183
     184                // Switch translation in case WPLANG was changed.
     185                $language = get_option( 'WPLANG' );
     186                if ( $language ) {
     187                        load_default_textdomain( $language );
     188                } else {
     189                        unload_textdomain( 'default' );
    182190                }
    183191        }
  • trunk/src/wp-admin/setup-config.php

    r29599 r29630  
    3333require( ABSPATH . 'wp-settings.php' );
    3434
    35 require( ABSPATH . 'wp-admin/includes/upgrade.php' );
     35/** Load WordPress Administration Upgrade API */
     36require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     37
     38/** Load WordPress Translation Install API */
     39require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
    3640
    3741nocache_headers();
    … …  
    8690} // end function setup_config_display_header();
    8791
     92$language = '';
     93if ( ! empty( $_REQUEST['language'] ) ) {
     94        $language = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] );
     95}
    8896switch($step) {
    8997        case -1:
    90 
    91                 if ( empty( $_GET['language'] ) && ( $languages = wp_get_available_translations_from_api() ) ) {
     98                if ( empty( $language ) && ( $languages = wp_get_available_translations() ) ) {
    9299                        setup_config_display_header( 'language-chooser' );
    93100                        echo '<form id="setup" method="post" action="?step=0">';
    … …  
    100107
    101108        case 0:
    102                 if ( ! empty( $_REQUEST['language'] ) ) {
    103                         $loaded_language = wp_install_download_language_pack( $_REQUEST['language'] );
     109                if ( ! empty( $language ) ) {
     110                        $loaded_language = wp_download_language_pack( $language );
    104111                        if ( $loaded_language ) {
    105                                 wp_install_load_language( $loaded_language );
     112                                load_default_textdomain( $loaded_language );
    106113                        }
    107114                }
    … …  
    137144
    138145        case 1:
    139                 $loaded_language = wp_install_load_language( $_REQUEST['language'] );
     146                load_default_textdomain( $language );
    140147                setup_config_display_header();
    141148        ?>
    … …  
    170177        </table>
    171178        <?php if ( isset( $_GET['noapi'] ) ) { ?><input name="noapi" type="hidden" value="1" /><?php } ?>
    172         <input type="hidden" name="language" value="<?php echo esc_attr( $loaded_language ); ?>" />
     179        <input type="hidden" name="language" value="<?php echo esc_attr( $language ); ?>" />
    173180        <p class="step"><input name="submit" type="submit" value="<?php echo htmlspecialchars( __( 'Submit' ), ENT_QUOTES ); ?>" class="button button-large" /></p>
    174181</form>
    … …  
    177184
    178185        case 2:
    179         $loaded_language = wp_install_load_language( $_REQUEST['language'] );
     186        load_default_textdomain( $language );
    180187        $dbname = trim( wp_unslash( $_POST[ 'dbname' ] ) );
    181188        $uname = trim( wp_unslash( $_POST[ 'uname' ] ) );
    … …  
    190197        }
    191198
    192         if ( $loaded_language ) {
    193                 $step_1 .= '&amp;language=' . $loaded_language;
    194                 $install .= '?language=' . $loaded_language;
     199        if ( ! empty( $language ) ) {
     200                $step_1 .= '&amp;language=' . $language;
     201                $install .= '?language=' . $language;
    195202        } else {
    196203                $install .= '?language=en_US';
  • trunk/src/wp-includes/l10n.php

    r29163 r29630  
    2525 */
    2626function get_locale() {
    27         global $locale;
     27        global $locale, $wp_local_package;
    2828
    2929        if ( isset( $locale ) ) {
    … …  
    3838        }
    3939
    40         // WPLANG is defined in wp-config.
    41         if ( defined( 'WPLANG' ) )
     40        if ( isset( $wp_local_package ) ) {
     41                $locale = $wp_local_package;
     42        }
     43
     44        // WPLANG was defined in wp-config.
     45        if ( defined( 'WPLANG' ) ) {
    4246                $locale = WPLANG;
     47        }
    4348
    4449        // If multisite, check options.
    4550        if ( is_multisite() ) {
    4651                // Don't check blog option when installing.
    47                 if ( defined( 'WP_INSTALLING' ) || ( false === $ms_locale = get_option( 'WPLANG' ) ) )
    48                         $ms_locale = get_site_option('WPLANG');
    49 
    50                 if ( $ms_locale !== false )
     52                if ( defined( 'WP_INSTALLING' ) || ( false === $ms_locale = get_option( 'WPLANG' ) ) ) {
     53                        $ms_locale = get_site_option( 'WPLANG' );
     54                }
     55
     56                if ( $ms_locale !== false ) {
    5157                        $locale = $ms_locale;
    52         } elseif ( ! defined( 'WP_INSTALLING' ) ) {
     58                }
     59        } else {
    5360                $db_locale = get_option( 'WPLANG' );
    54                 if ( $db_locale ) {
     61                if ( $db_locale !== false ) {
    5562                        $locale = $db_locale;
    5663                }
    5764        }
    5865
    59         if ( empty( $locale ) )
     66        if ( empty( $locale ) ) {
    6067                $locale = 'en_US';
     68        }
    6169
    6270        /** This filter is documented in wp-includes/l10n.php */
    … …  
    524532 *
    525533 * @since 1.5.0
    526  */
    527 function load_default_textdomain() {
    528         $locale = get_locale();
    529 
    530         load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo" );
     534 *
     535 * @param string $locale Optional. Locale to load. Defaults to get_locale().
     536 */
     537function load_default_textdomain( $locale = null ) {
     538        if ( null === $locale ) {
     539                $locale = get_locale();
     540        }
     541
     542        // Unload previously loaded strings so we can switch translations.
     543        unload_textdomain( 'default' );
     544
     545        $return = load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo" );
    531546
    532547        if ( ( is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) && ! file_exists(  WP_LANG_DIR . "/admin-$locale.mo" ) ) {
    533548                load_textdomain( 'default', WP_LANG_DIR . "/ms-$locale.mo" );
    534                 return;
    535         }
    536 
    537         if ( is_admin() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) )
     549                return $return;
     550        }
     551
     552        if ( is_admin() || defined( 'WP_INSTALLING' ) || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) ) {
    538553                load_textdomain( 'default', WP_LANG_DIR . "/admin-$locale.mo" );
     554        }
    539555
    540556        if ( is_network_admin() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) )
    541557                load_textdomain( 'default', WP_LANG_DIR . "/admin-network-$locale.mo" );
    542558
     559        return $return;
    543560}
    544561
    … …  
    819836
    820837/**
    821  * Language selector. More to come.
     838 * Language selector.
    822839 *
    823840 * @since 4.0.0
    824841 *
    825842 * @see get_available_languages()
     843 * @see wp_get_available_translations()
    826844 *
    827845 * @param array $args Optional arguments. Default empty array.
    828846 */
    829847function wp_dropdown_languages( $args = array() ) {
    830         if ( isset( $args['languages'] ) ) {
    831                 $languages = $args['languages'];
    832         } else {
    833                 $languages = get_available_languages();
     848        require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
     849
     850        $args = wp_parse_args( $args, array(
     851                'id'        => '',
     852                'name'      => '',
     853                'languages' => array(),
     854                'selected'  => ''
     855        ) );
     856
     857        if ( empty( $args['languages'] ) ) {
     858                return false;
     859        }
     860
     861        $translations = wp_get_available_translations();
     862
     863        /*
     864         * $args['languages'] should only contain the locales. Find the locale in
     865         * $translations to get the native name. Fall back to locale.
     866         */
     867        $languages = array();
     868        foreach ( $args['languages'] as $locale ) {
     869                if ( isset( $translations[ $locale ] ) ) {
     870                        $translation = $translations[ $locale ];
     871                        $languages[] = array(
     872                                'language'    => $translation['language'],
     873                                'native_name' => $translation['native_name'],
     874                                'lang'        => $translation['iso'][1],
     875                        );
     876                } else {
     877                        $languages[] = array(
     878                                'language'    => $locale,
     879                                'native_name' => $locale,
     880                                'lang'        => '',
     881                        );
     882                }
    834883        }
    835884
    836885        printf( '<select name="%s" id="%s">', esc_attr( $args['name'] ), esc_attr( $args['id'] ) );
    837         echo '<option value="">en_US</option>';
     886
     887        // List installed languages.
     888        echo '<option value="" lang="en">English (United States)</option>';
    838889        foreach ( $languages as $language ) {
    839                 $selected = selected( $language, $args['selected'], false );
    840                 echo '<option value="' . esc_attr( $language ) .'"' . $selected . '>' . $language . '</option>';
    841         }
     890                $selected = selected( $language['language'], $args['selected'], false );
     891                printf(
     892                        '<option value="%s" lang="%s"%s>%s</option>',
     893                        esc_attr( $language['language'] ),
     894                        esc_attr( $language['lang'] ),
     895                        $selected,
     896                        esc_html( $language['native_name'] )
     897                );
     898        }
     899
    842900        echo '</select>';
    843901}
  • trunk/src/wp-includes/version.php

    r29589 r29630  
    1212 * @global int $wp_db_version
    1313 */
    14 $wp_db_version = 29188;
     14$wp_db_version = 29630;
    1515
    1616/**
  • trunk/wp-config-sample.php

    r25173 r29630  
    6363
    6464/**
    65  * WordPress Localized Language, defaults to English.
    66  *
    67  * Change this to localize WordPress. A corresponding MO file for the chosen
    68  * language must be installed to wp-content/languages. For example, install
    69  * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
    70  * language support.
    71  */
    72 define('WPLANG', '');
    73 
    74 /**
    7565 * For developers: WordPress debugging mode.
    7666 *
Note: See TracChangeset for help on using the changeset viewer.