Make WordPress Core

Changeset 29630


Ignore:
Timestamp:
08/26/2014 07:58:33 PM (10 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.