WordPress.org

Make WordPress Core

Ticket #18200: lp.3.diff

File lp.3.diff, 17.5 KB (added by dd32, 2 years ago)
  • wp-includes/update.php

     
    6363                $wp_install = home_url( '/' ); 
    6464        } 
    6565 
     66        $installed_languages = get_installed_language_files( 'core' ); 
     67 
    6668        $query = array( 
    6769                'version'           => $wp_version, 
    6870                'php'               => $php_version, 
     
    7981        $options = array( 
    8082                'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ), 
    8183                'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), 
     84                'body' => array( 'installed_languages' => serialize( $installed_languages ) ), 
    8285                'headers' => array( 
    8386                        'wp_install' => $wp_install, 
    8487                        'wp_blog' => home_url( '/' ) 
    8588                ) 
    8689        ); 
    8790 
    88         $response = wp_remote_get($url, $options); 
     91        $response = wp_remote_post($url, $options); 
    8992 
    9093        if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) 
    9194                return false; 
     
    142145        if ( !function_exists( 'get_plugins' ) ) 
    143146                require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); 
    144147 
     148        // If we've just finished an update, get some fresh data 
     149        if ( 'upgrader_process_complete' == current_filter() ) 
     150                wp_cache_delete( 'plugins', 'plugins' ); 
     151 
    145152        $plugins = get_plugins(); 
    146153        $active  = get_option( 'active_plugins', array() ); 
    147154        $current = get_site_transient( 'update_plugins' ); 
     
    153160 
    154161        // Check for update on a different schedule, depending on the page. 
    155162        switch ( current_filter() ) { 
     163                case 'upgrader_process_complete': 
     164                        $timeout = 0; 
     165                        break; 
    156166                case 'load-update-core.php' : 
    157167                        $timeout = 60; // 1 min 
    158168                        break; 
     
    193203        $current->last_checked = time(); 
    194204        set_site_transient( 'update_plugins', $current ); 
    195205 
     206        $installed_languages = get_installed_language_files( 'plugins' ); 
     207 
    196208        $to_send = (object) compact('plugins', 'active'); 
    197209 
    198210        $options = array( 
    199211                'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3), 
    200                 'body' => array( 'plugins' => serialize( $to_send ) ), 
     212                'body' => array( 'plugins' => serialize( $to_send ), 'installed_languages' => serialize( $installed_languages ) ), 
    201213                'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) 
    202214        ); 
    203215 
     
    235247        if ( defined( 'WP_INSTALLING' ) ) 
    236248                return false; 
    237249 
     250        //if ( 'upgrader_process_complete' == current_filter() ) 
     251        //      delete_some_magical_cache(); 
     252 
    238253        $installed_themes = wp_get_themes(); 
    239254        $last_update = get_site_transient( 'update_themes' ); 
    240255        if ( ! is_object($last_update) ) 
     
    262277 
    263278        // Check for update on a different schedule, depending on the page. 
    264279        switch ( current_filter() ) { 
     280                case 'upgrader_process_complete': 
     281                        $timeout = 0; 
     282                        break; 
    265283                case 'load-update-core.php' : 
    266284                        $timeout = 60; // 1 min 
    267285                        break; 
     
    302320        $last_update->last_checked = time(); 
    303321        set_site_transient( 'update_themes', $last_update ); 
    304322 
     323        $installed_languages = get_installed_language_files( 'themes' ); 
     324 
    305325        $options = array( 
    306326                'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3), 
    307                 'body'                  => array( 'themes' => serialize( $themes ) ), 
     327                'body'                  => array( 'themes' => serialize( $themes ), 'installed_languages' => serialize( $installed_languages ) ), 
    308328                'user-agent'    => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) 
    309329        ); 
    310330 
     
    434454 
    435455add_action( 'admin_init', '_maybe_update_core' ); 
    436456add_action( 'wp_version_check', 'wp_version_check' ); 
     457add_action( 'upgrader_process_complete', 'wp_version_check' ); 
    437458 
    438459add_action( 'load-plugins.php', 'wp_update_plugins' ); 
    439460add_action( 'load-update.php', 'wp_update_plugins' ); 
    440461add_action( 'load-update-core.php', 'wp_update_plugins' ); 
    441462add_action( 'admin_init', '_maybe_update_plugins' ); 
    442463add_action( 'wp_update_plugins', 'wp_update_plugins' ); 
     464add_action( 'upgrader_process_complete', 'wp_update_plugins' ); // NOTE: This is used to force the updates to be done after upgrades, retrieving any new language file updates for the now installed plugin/theme. Has the side benefit that the Buble updates with the correct update number on next pageload! 
    443465 
    444466add_action( 'load-themes.php', 'wp_update_themes' ); 
    445467add_action( 'load-update.php', 'wp_update_themes' ); 
    446468add_action( 'load-update-core.php', 'wp_update_themes' ); 
    447469add_action( 'admin_init', '_maybe_update_themes' ); 
    448470add_action( 'wp_update_themes', 'wp_update_themes' ); 
     471add_action( 'upgrader_process_complete', 'wp_update_themes' ); 
    449472 
    450473add_action('init', 'wp_schedule_update_checks'); 
  • wp-includes/l10n.php

     
    540540        } 
    541541 
    542542        return $languages; 
     543} 
     544 
     545// Returns a list of translation files and their details. 
     546function get_installed_language_files( $type = false ) { 
     547        $language_files = array(); 
     548 
     549        if ( ! is_dir( WP_LANG_DIR ) ) 
     550                return array(); 
     551 
     552        $dirs_to_check = array( WP_LANG_DIR ); 
     553        foreach ( (array)glob( WP_LANG_DIR . '/*', GLOB_ONLYDIR) as $dir ) 
     554                $dirs_to_check[] = $dir; 
     555 
     556        foreach ( $dirs_to_check as $dir ) { 
     557                foreach ( (array)glob( $dir . '/*.po') as $lang_file ) { 
     558                        $lang_file = str_replace( trailingslashit(WP_LANG_DIR), '', $lang_file ); 
     559 
     560                        $file_data = get_translation_file_data( $lang_file ); 
     561                        $file_data['file'] = basename( $lang_file ); 
     562                        $file_data['type'] = dirname( $lang_file ); 
     563                        if ( '.' == $file_data['type'] ) 
     564                                $file_data['type'] = 'core';                             
     565 
     566                        if ( preg_match( '!(.*?)-?([a-z]{2}_[a-z]{2})?\.po!i', $file_data['file'], $lang_match ) ) { 
     567                                $file_data['slug'] = $lang_match[1]; 
     568                                if ( isset( $lang_match[2] ) ) 
     569                                        $file_data['language'] = $lang_match[2]; 
     570                        } 
     571 
     572                        $language_files[] = $file_data; 
     573 
     574                } 
     575        } 
     576 
     577        // @TODO: Wasteful, Slot this into the above somewhere instead 
     578        if ( $type ) 
     579                $language_files = wp_list_filter( $language_files, array( 'type' => $type ) ); 
     580 
     581        return $language_files; 
     582} 
     583 
     584// retrieves the date/generator/project-id headers from a po file relative to WP_LANG_DIR 
     585function get_translation_file_data( $file ) { 
     586        // Just incase someone calls with the machine file instead of the textual version 
     587        $file = preg_replace( '!\.mo$!i', '.po', $file ); 
     588 
     589        // Lets just assume that it's within the WP_LANG_DIR for now 
     590        // if we keep track of the loaded text domains later, we can probably include a lookup for the location of the files instead. 
     591        $data = get_file_data(  WP_LANG_DIR . '/' . $file, 
     592                                                        array( 
     593                                                                'date' => '"PO-Revision-Date', 
     594                                                                'generator' => '"X-Generator', 
     595                                                                'project-id' => '"Project-Id-Version' 
     596                                                                ) 
     597                                                ); 
     598 
     599        // Strip the .po field endings off the values, which may, or may not, include a textual \n 
     600        foreach ( (array)$data as $key => $value ) 
     601                $data[$key] = preg_replace( '!(\\\n)?"$!', '', $value); 
     602 
     603        return $data; 
    543604} 
     605 No newline at end of file 
  • wp-admin/includes/update.php

     
    301301        echo "<div class='update-nag'>$msg</div>"; 
    302302} 
    303303add_action( 'admin_notices', 'maintenance_nag' ); 
     304 
     305// Retrieves a list of all language updates available. 
     306function get_language_updates() { 
     307 
     308        $updates = array(); 
     309        foreach ( array( 'update_core' => 'core', 'update_plugins' => 'plugin', 'update_themes' => 'theme' ) as $transient => $type ) { 
     310 
     311                $transient = get_site_transient( $transient ); 
     312                if ( empty( $transient->language_updates ) ) 
     313                        continue; 
     314 
     315                foreach ( (array)$transient->language_updates as $update ) { 
     316                        if ( empty( $update->type ) ) 
     317                                $update->type = $type; 
     318 
     319                        $updates[] = $update; 
     320                } 
     321        } 
     322 
     323        return $updates; 
     324 
     325/*      // Expected content: 
     326        return array( 
     327                        (object)array( 
     328                                                'type' => 'core', 
     329                                                'lang' => 'de_DE', // The language it is.. This isn't currently used anywhere 
     330                                                'version' => '2012-02-18 08:48:04', // New Version - Nothing looks at this either. 
     331                                                'package' => 'http://tools.dd32.id.au/wordpress/core-downloads/core-de_DE.zip' 
     332                                                ), 
     333                        (object)array( 
     334                                                'type' => 'plugin', // The type of the upgrade, 'plugin' or 'theme' will throw files into that folder, any other name (ie. 'core') is thrown into WP_LANG_DIR..  
     335                                                'slug' => 'akismet', // not used. 
     336                                                'for' => 'akismet/akismet.php', // again, not used yet. 
     337                                                'lang' => 'de_DE', 
     338                                                'version' => '2012-02-18 08:48:04', 
     339                                                'package' => 'http://tools.dd32.id.au/wordpress/core-downloads/akismet-de_DE.zip' 
     340                                                ), 
     341                        (object)array( 
     342                                                'type' => 'theme', 
     343                                                'slug' => 'twentytwelve', 
     344                                                'lang' => 'de_DE', 
     345                                                'version' => '2012-02-18 08:48:04', 
     346                                                'package' => 'http://tools.dd32.id.au/wordpress/core-downloads/twentytwelve-de_DE.zip' // And no, this isn't a translation of 2012, I believe it's a out of date Core set. 
     347                                                ) 
     348                );*/ 
     349} 
     350 No newline at end of file 
  • wp-admin/includes/class-wp-upgrader.php

     
    165165        function install_package($args = array()) { 
    166166                global $wp_filesystem; 
    167167                $defaults = array( 'source' => '', 'destination' => '', //Please always pass these 
    168                                                 'clear_destination' => false, 'clear_working' => false, 
     168                                                'clear_destination' => false, 'clear_working' => false, 'abort_if_destination_exists' => true, 
    169169                                                'hook_extra' => array()); 
    170170 
    171171                $args = wp_parse_args($args, $defaults); 
     
    224224                                return $removed; 
    225225                        else if ( ! $removed ) 
    226226                                return new WP_Error('remove_old_failed', $this->strings['remove_old_failed']); 
    227                 } elseif ( $wp_filesystem->exists($remote_destination) ) { 
     227                } elseif ( $abort_if_destination_exists && $wp_filesystem->exists($remote_destination) ) { 
    228228                        //If we're not clearing the destination folder and something exists there already, Bail. 
    229229                        //But first check to see if there are actually any files in the folder. 
    230230                        $_files = $wp_filesystem->dirlist($remote_destination); 
     
    272272                $defaults = array(      'package' => '', //Please always pass this. 
    273273                                                        'destination' => '', //And this 
    274274                                                        'clear_destination' => false, 
     275                                                        'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please 
    275276                                                        'clear_working' => true, 
    276277                                                        'is_multi' => false, 
    277278                                                        'hook_extra' => array() //Pass any extra $hook_extra args here, this will be passed to any hooked filters. 
     
    318319                                                                                        'source' => $working_dir, 
    319320                                                                                        'destination' => $destination, 
    320321                                                                                        'clear_destination' => $clear_destination, 
     322                                                                                        'abort_if_destination_exists' => $abort_if_destination_exists, 
    321323                                                                                        'clear_working' => $clear_working, 
    322324                                                                                        'hook_extra' => $hook_extra 
    323325                                                                                ) ); 
     
    410412                if ( ! $this->result || is_wp_error($this->result) ) 
    411413                        return $this->result; 
    412414 
    413                 // Force refresh of plugin update information 
    414                 delete_site_transient('update_plugins'); 
     415                do_action( 'upgrader_process_complete', $this, 'install-plugin', $package ); 
    415416 
    416417                return true; 
    417418        } 
     
    454455                if ( ! $this->result || is_wp_error($this->result) ) 
    455456                        return $this->result; 
    456457 
    457                 // Force refresh of plugin update information 
    458                 delete_site_transient('update_plugins'); 
     458                do_action( 'upgrader_process_complete', $this, 'update-plugin', $plugin ); 
     459 
    459460        } 
    460461 
    461462        function bulk_upgrade($plugins) { 
     
    535536                // Cleanup our hooks, in case something else does a upgrade on this connection. 
    536537                remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin')); 
    537538 
    538                 // Force refresh of plugin update information 
    539                 delete_site_transient('update_plugins'); 
     539                do_action( 'upgrader_process_complete', $this, 'bulk-upgrade-plugins', $plugins ); 
    540540 
    541541                return $results; 
    542542        } 
     
    761761                if ( ! $this->result || is_wp_error($this->result) ) 
    762762                        return $this->result; 
    763763 
    764                 // Force refresh of theme update information 
    765                 delete_site_transient('update_themes'); 
     764                do_action( 'upgrader_process_complete', $this, 'install-theme', $package ); 
    766765 
    767766                return true; 
    768767        } 
     
    807806                if ( ! $this->result || is_wp_error($this->result) ) 
    808807                        return $this->result; 
    809808 
    810                 // Force refresh of theme update information 
    811                 delete_site_transient('update_themes'); 
     809                do_action( 'upgrader_process_complete', $this, 'upgrade-theme', $theme ); 
    812810 
    813811                return true; 
    814812        } 
     
    894892                remove_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2); 
    895893                remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4); 
    896894 
    897                 // Force refresh of theme update information 
    898                 delete_site_transient('update_themes'); 
     895                do_action( 'upgrader_process_complete', $this, 'bulk-upgrade-themes', $themes ); 
    899896 
    900897                return $results; 
    901898        } 
     
    10641061 
    10651062                require(ABSPATH . 'wp-admin/includes/update-core.php'); 
    10661063 
     1064                //  @TODO: Add the upgrader_process_complete bizzo here somewhere 
    10671065                return update_core($working_dir, $wp_dir); 
    10681066        } 
    10691067 
    10701068} 
    10711069 
     1070add_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20, 3); 
     1071class Language_Pack_Upgrader extends WP_Upgrader { 
     1072         
     1073        var $result; 
     1074        var $bulk = true; 
     1075 
     1076        static function async_upgrade( $upgrader, $context, $package ) { 
     1077                // Don't do Language updates on language updates on language updates.. 
     1078                if ( $upgrader instanceof Language_Pack_Upgrader ) 
     1079                        return; 
     1080 
     1081                echo '<!-- start languages --><div style="padding-left: 3em; border-left: 5px solid grey">'; 
     1082 
     1083                $lp_upgrader = new Language_Pack_Upgrader( new Headerless_Skin() ); 
     1084 
     1085                $lp_upgrader->upgrade(); 
     1086 
     1087                echo '</div><!-- end of languages -->'; 
     1088        } 
     1089        function upgrade_strings() { 
     1090                $this->strings['starting_upgrade'] = __( 'Some of your language files need updating, Sit tight for a few more seconds while we update them as well.' ); 
     1091                $this->strings['up_to_date'] = __('The language is up to date.'); // We need to silently skip this case 
     1092                $this->strings['no_package'] = __('Update package not available.'); 
     1093                $this->strings['downloading_package'] = __('Downloading language update from <span class="code">%s</span>&#8230;'); 
     1094                $this->strings['unpack_package'] = __('Unpacking the update&#8230;'); 
     1095                $this->strings['remove_old'] = __('Removing the old version of the language&#8230;'); 
     1096                $this->strings['remove_old_failed'] = __('Could not remove the old language.'); 
     1097                $this->strings['process_failed'] = __('Language update failed.'); 
     1098                $this->strings['process_success'] = __('Language updated successfully.'); 
     1099        } 
     1100 
     1101        function upgrade() { 
     1102                return $this->bulk_upgrade(); 
     1103        } 
     1104 
     1105        function bulk_upgrade() { 
     1106 
     1107                $this->init(); 
     1108                $this->upgrade_strings(); 
     1109 
     1110                $language_updates = get_language_updates(); 
     1111 
     1112                if ( empty($language_updates) ) 
     1113                        return true; 
     1114                 
     1115                $this->skin->feedback( 'starting_upgrade' ); 
     1116 
     1117                add_filter('upgrader_source_selection', array(&$this, 'check_package'), 10, 3 ); 
     1118 
     1119                $this->skin->header(); 
     1120 
     1121                // Connect to the Filesystem first. 
     1122                $res = $this->fs_connect( array(WP_CONTENT_DIR, WP_LANG_DIR) ); 
     1123                if ( ! $res ) { 
     1124                        $this->skin->footer(); 
     1125                        return false; 
     1126                } 
     1127 
     1128                $results = array(); 
     1129 
     1130                $this->update_count = count($language_updates); 
     1131                $this->update_current = 0; 
     1132                foreach ( $language_updates as $language_update ) { 
     1133 
     1134                        $destination = WP_LANG_DIR; 
     1135                        if ( 'plugin' == $language_update->type ) { 
     1136                                $destination .= '/plugins'; 
     1137                        } elseif ( 'theme' == $language_update->type ) { 
     1138                                $destination .= '/themes'; 
     1139                        } 
     1140 
     1141                        $this->update_current++; 
     1142 
     1143                        $options = array( 
     1144                                                        'package' => $language_update->package, 
     1145                                                        'destination' => $destination, 
     1146                                                        'clear_destination' => false, 
     1147                                                        'abort_if_destination_exists' => false, // We expect the destination to exist. 
     1148                                                        'clear_working' => true, 
     1149                                                        'is_multi' => true, 
     1150                                                        'hook_extra' => array( 
     1151                                                                                                'language_update_type' => $language_update->type, 
     1152                                                                                                'language_update' => $language_update, 
     1153                                                                                                ) 
     1154                                                        ); 
     1155 
     1156                        $result = $this->run($options); 
     1157 
     1158                        $results[] = $this->result; 
     1159 
     1160                        // Prevent credentials auth screen from displaying multiple times 
     1161                        if ( false === $result ) 
     1162                                break; 
     1163                } //end foreach $language_updates 
     1164 
     1165                // Cleanup our hooks, in case something else does a upgrade on this connection. 
     1166                remove_filter('upgrader_source_selection', array(&$this, 'check_package'), 10, 2 ); 
     1167 
     1168                return $results; 
     1169        } 
     1170 
     1171        function check_package( $source, $remote_source ) { 
     1172                global $wp_filesystem; 
     1173 
     1174                if ( is_wp_error($source) ) 
     1175                        return $source; 
     1176 
     1177                // Check the folder contains a valid language 
     1178                $files = $wp_filesystem->dirlist( $remote_source ); 
     1179 
     1180                // Check to see if a .po and .mo exist in the folder.. 
     1181                $po = $mo = false; 
     1182                foreach ( (array)$files as $file => $filedata ) { 
     1183                        if ( '.po' == substr( $file, -3) ) 
     1184                                $po = true; 
     1185                        elseif ( '.mo' == substr($file, -3) ) 
     1186                                $mo = true; 
     1187                } 
     1188 
     1189                if ( ! $mo || ! $po ) 
     1190                        return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], __( 'The language pack is missing either the <code>.po</code> or <code>.mo</code> files.' ) ); 
     1191 
     1192                return $source; 
     1193        } 
     1194 
     1195} 
     1196 
    10721197/** 
    10731198 * Generic Skin for the WordPress Upgrader classes. This skin is designed to be extended for specific purposes. 
    10741199 * 
     
    11571282} 
    11581283 
    11591284/** 
     1285 * A basic Upgrader skin which doesn't have any Header/Footers 
     1286 * 
     1287 * @package WordPress 
     1288 * @subpackage Upgrader 
     1289 * @since 3.4.0 
     1290 */ 
     1291class Headerless_Skin extends WP_Upgrader_Skin { 
     1292        function before() {} 
     1293        function after() {} 
     1294        function header() {} 
     1295        function footer() {} 
     1296} 
     1297 
     1298/** 
    11601299 * Plugin Upgrader Skin for WordPress Plugin Upgrades. 
    11611300 * 
    11621301 * @TODO More Detailed docs, for methods as well.