WordPress.org

Make WordPress Core

Ticket #10125: faster_timezone_selector_building.diff

File faster_timezone_selector_building.diff, 11.3 KB (added by sambauers, 9 years ago)
  • wp-includes/functions.php

     
    31493149 * Overrides the gmt_offset option if we have a timezone_string available
    31503150 */
    31513151function wp_timezone_override_offset() {
    3152         if (!wp_timezone_supported()) return false;
     3152        if ( !wp_timezone_supported() ) {
     3153                return false;
     3154        }
     3155        if ( !$timezone_string = get_option( 'timezone_string' ) ) {
     3156                return false;
     3157        }
    31533158
    3154         $tz = get_option('timezone_string');
    3155         if (empty($tz)) return false;
    3156 
    3157         @date_default_timezone_set($tz);
    3158 
    3159         $dateTimeZoneSelected = timezone_open($tz);
    3160         $dateTimeServer = date_create();
    3161         if ($dateTimeZoneSelected === false || $dateTimeServer === false) return false;
    3162 
    3163         $timeOffset = timezone_offset_get($dateTimeZoneSelected, $dateTimeServer);
    3164         $timeOffset = $timeOffset / 3600;
    3165 
    3166         return $timeOffset;
     3159        @date_default_timezone_set( $timezone_string );
     3160        $timezone_object = timezone_open( $timezone_string );
     3161        $datetime_object = date_create();
     3162        if ( false === $timezone_object || false === $datetime_object ) {
     3163                return false;
     3164        }
     3165        return round( timezone_offset_get( $timezone_object, $datetime_object ) / 3600, 2 );
    31673166}
    31683167
    31693168/**
    31703169 * Check for PHP timezone support
    3171  *
    31723170 */
    31733171function wp_timezone_supported() {
    3174         if (function_exists('date_default_timezone_set')
    3175                 && function_exists('timezone_identifiers_list')
    3176                 && function_exists('timezone_open')
    3177                 && function_exists('timezone_offset_get')
    3178                 )
    3179                 return apply_filters('timezone_support',true);
     3172        $support = false;
     3173        if (
     3174                function_exists( 'date_default_timezone_set' ) &&
     3175                function_exists( 'timezone_identifiers_list' ) &&
     3176                function_exists( 'timezone_open' ) &&
     3177                function_exists( 'timezone_offset_get' )
     3178        ) {
     3179                $support = true;
     3180        }
     3181        return apply_filters( 'timezone_support', $support );
     3182}
    31803183
    3181         return apply_filters('timezone_support',false);
     3184function _wp_timezone_choice_usort_callback( $a, $b ) {
     3185        // Don't use translated versions of Etc
     3186        if ( 'Etc' === $a['continent'] && 'Etc' === $b['continent'] ) {
     3187                // Make the order of these more like the old dropdown
     3188                if ( 'GMT+' === substr( $a['city'], 0, 4 ) && 'GMT+' === substr( $b['city'], 0, 4 ) ) {
     3189                        return -1 * ( strnatcasecmp( $a['city'], $b['city'] ) );
     3190                }
     3191                if ( 'UTC' === $a['city'] ) {
     3192                        if ( 'GMT+' === substr( $b['city'], 0, 4 ) ) {
     3193                                return 1;
     3194                        }
     3195                        return -1;
     3196                }
     3197                if ( 'UTC' === $b['city'] ) {
     3198                        if ( 'GMT+' === substr( $a['city'], 0, 4 ) ) {
     3199                                return -1;
     3200                        }
     3201                        return 1;
     3202                }
     3203                return strnatcasecmp( $a['city'], $b['city'] );
     3204        }
     3205        if ( $a['t_continent'] == $b['t_continent'] ) {
     3206                if ( $a['t_city'] == $b['t_city'] ) {
     3207                        return strnatcasecmp( $a['t_subcity'], $b['t_subcity'] );
     3208                }
     3209                return strnatcasecmp( $a['t_city'], $b['t_city'] );
     3210        } else {
     3211                // Force Etc to the bottom of the list
     3212                if ( 'Etc' === $a['continent'] ) {
     3213                        return 1;
     3214                }
     3215                if ( 'Etc' === $b['continent'] ) {
     3216                        return -1;
     3217                }
     3218                return strnatcasecmp( $a['t_continent'], $b['t_continent'] );
     3219        }
    31823220}
    31833221
    31843222/**
     
    31873225 * @param string $selectedzone - which zone should be the selected one
    31883226 *
    31893227 */
    3190 function wp_timezone_choice($selectedzone) {
     3228function wp_timezone_choice( $selected_zone ) {
    31913229        static $mo_loaded = false;
    31923230
    3193         $continents = array('Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific', 'Etc');
     3231        $continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific', 'Etc' );
    31943232
    31953233        // Load translations for continents and cities
    3196         if ( ! $mo_loaded ) {
     3234        if ( !$mo_loaded ) {
    31973235                $locale = get_locale();
    3198                 $mofile = WP_LANG_DIR . "/continents-cities-$locale.mo";
    3199                 load_textdomain('continents-cities', $mofile);
     3236                $mofile = WP_LANG_DIR . '/continents-cities-' . $locale . '.mo';
     3237                load_textdomain( 'continents-cities', $mofile );
    32003238                $mo_loaded = true;
    32013239        }
    32023240
    3203         $all = timezone_identifiers_list();
    3204 
    3205         $i = 0;
    3206         foreach ( $all as $zone ) {
    3207                 $zone = explode('/',$zone);
    3208                 if ( ! in_array($zone[0], $continents) )
     3241        $zonen = array();
     3242        foreach ( timezone_identifiers_list() as $zone ) {
     3243                $zone = explode( '/', $zone );
     3244                if ( !in_array( $zone[0], $continents ) ) {
    32093245                        continue;
    3210                 if ( $zone[0] == 'Etc' && in_array($zone[1], array('UCT', 'GMT', 'GMT0', 'GMT+0', 'GMT-0', 'Greenwich', 'Universal', 'Zulu')) )
     3246                }
     3247                if ( 'Etc' === $zone[0] && in_array( $zone[1], array( 'UCT', 'GMT', 'GMT0', 'GMT+0', 'GMT-0', 'Greenwich', 'Universal', 'Zulu' ) ) ) {
    32113248                        continue;
    3212                 $zonen[$i]['continent'] = isset($zone[0]) ? $zone[0] : '';
    3213                 $zonen[$i]['city'] = isset($zone[1]) ? $zone[1] : '';
    3214                 $zonen[$i]['subcity'] = isset($zone[2]) ? $zone[2] : '';
    3215                 $i++;
     3249                }
     3250
     3251                // This determines what gets set and translated - we don't translate Etc/* strings here, they are done later
     3252                $exists = array(
     3253                        0 => ( isset( $zone[0] ) && $zone[0] ) ? true : false,
     3254                        1 => ( isset( $zone[1] ) && $zone[1] ) ? true : false,
     3255                        2 => ( isset( $zone[2] ) && $zone[2] ) ? true : false
     3256                );
     3257                $exists[3] = ( $exists[0] && 'Etc' !== $zone[0] ) ? true : false;
     3258                $exists[4] = ( $exists[1] && $exists[3] ) ? true : false;
     3259                $exists[5] = ( $exists[2] && $exists[3] ) ? true : false;
     3260
     3261                $zonen[] = array(
     3262                        'continent'   => ( $exists[0] ? $zone[0] : '' ),
     3263                        'city'        => ( $exists[1] ? $zone[1] : '' ),
     3264                        'subcity'     => ( $exists[2] ? $zone[2] : '' ),
     3265                        't_continent' => ( $exists[3] ? translate( str_replace( '_', ' ', $zone[0] ), 'continents-cities' ) : '' ),
     3266                        't_city'      => ( $exists[4] ? translate( str_replace( '_', ' ', $zone[1] ), 'continents-cities' ) : '' ),
     3267                        't_subcity'   => ( $exists[5] ? translate( str_replace( '_', ' ', $zone[2] ), 'continents-cities' ) : '' )
     3268                );
    32163269        }
     3270        usort( $zonen, '_wp_timezone_choice_usort_callback' );
    32173271
    3218         usort($zonen, create_function(
    3219                 '$a, $b', '
    3220                 $t = create_function(\'$s\', \'return translate(str_replace("_", " ", $s), "continents-cities");\');
    3221                 $a_continent = $t($a["continent"]);
    3222                 $b_continent = $t($b["continent"]);
    3223                 $a_city = $t($a["city"]);
    3224                 $b_city = $t($b["city"]);
    3225                 $a_subcity = $t($a["subcity"]);
    3226                 $b_subcity = $t($b["subcity"]);
    3227                 if ( $a_continent == $b_continent && $a_city == $b_city )
    3228                         return strnatcasecmp($a_subcity, $b_subcity);
    3229                 elseif ( $a_continent == $b_continent )
    3230                         return strnatcasecmp($a_city, $b_city);
    3231                 else
    3232                         return strnatcasecmp($a_continent, $b_continent);
    3233                 '));
     3272        $structure = array();
    32343273
    3235         $structure = '';
    3236         $pad = '   ';
     3274        if ( empty( $selected_zone ) ) {
     3275                $structure[] = '<option selected="selected" value="">' . __( 'Select a city' ) . '</option>';
     3276        }
    32373277
    3238         if ( empty($selectedzone) )
    3239                 $structure .= '<option selected="selected" value="">' . __('Select a city') . "</option>\n";
    3240         foreach ( $zonen as $zone ) {
    3241                 extract($zone);
    3242                 if ( empty($selectcontinent) && !empty($city) ) {
    3243                         $selectcontinent = $continent;
    3244                         $structure .= '<optgroup label="'. esc_attr( translate( $continent, "continents-cities" ) ) .'">' . "\n"; // continent
    3245                 } elseif ( !empty($selectcontinent) && $selectcontinent != $continent ) {
    3246                         $structure .= "</optgroup>\n";
    3247                         $selectcontinent = '';
    3248                         if ( !empty($city) ) {
    3249                                 $selectcontinent = $continent;
    3250                                 $structure .= '<optgroup label="'. esc_attr( translate( $continent, "continents-cities" ) ) .'">' . "\n"; // continent
     3278        foreach ( $zonen as $key => $zone ) {
     3279                // Build value in an array to join later
     3280                $value = array( $zone['continent'] );
     3281
     3282                if ( empty( $zone['city'] ) ) {
     3283                        // It's at the continent level (generally won't happen)
     3284                        $display = $zone['t_continent'];
     3285                } else {
     3286                        // It's inside a continent group
     3287                       
     3288                        // Continent optgroup
     3289                        if ( !isset( $zonen[$key - 1] ) || $zonen[$key - 1]['continent'] !== $zone['continent'] ) {
     3290                                $label = ( 'Etc' === $zone['continent'] ) ? __( 'Manual offsets' ) : $zone['t_continent'];
     3291                                $structure[] = '<optgroup label="'. esc_attr( $label ) .'">';
    32513292                        }
     3293                       
     3294                        // Add the city to the value
     3295                        $value[] = $zone['city'];
     3296                        if ( 'Etc' === $zone['continent'] ) {
     3297                                if ( 'UTC' === $zone['city'] ) {
     3298                                        $display = '';
     3299                                } else {
     3300                                        $display = str_replace( 'GMT', '', $zone['city'] );
     3301                                        $display = strtr( $display, '+-', '-+' ) . ':00';
     3302                                }
     3303                                $display = '&nbsp;&nbsp;&nbsp;' . sprintf( __( 'UTC %s' ), $display );
     3304                        } else {
     3305                                $display = '&nbsp;&nbsp;&nbsp;' . $zone['t_city'];
     3306                                if ( !empty( $zone['subcity'] ) ) {
     3307                                        // Add the subcity to the value
     3308                                        $value[] = $zone['subcity'];
     3309                                        $display .= ' - ' . $zone['t_subcity'];
     3310                                }
     3311                        }
    32523312                }
    32533313
    3254                 if ( !empty($city) ) {
    3255                         $display = str_replace('_',' ',$city);
    3256                         $display = translate($display, "continents-cities");
    3257                         if ( !empty($subcity) ) {
    3258                                 $display_subcity = str_replace('_', ' ', $subcity);
    3259                                 $display_subcity = translate($display_subcity, "continents-cities");
    3260                                 $city = $city . '/'. $subcity;
    3261                                 $display = $display . '/' . $display_subcity;
    3262                         }
    3263                         if ( $continent == 'Etc' )
    3264                                 $display = strtr($display, '+-', '-+');
    3265                         $structure .= "\t<option ".((($continent.'/'.$city)==$selectedzone)?'selected="selected"':'')." value=\"".($continent.'/'.$city)."\">$pad".$display."</option>\n"; //Timezone
    3266                 } else {
    3267                         $structure .= "<option ".(($continent==$selectedzone)?'selected="selected"':'')." value=\"".$continent."\">" . translate($continent, "continents-cities") . "</option>\n"; //Timezone
     3314                // Build the value
     3315                $value = join( '/', $value );
     3316                $selected = '';
     3317                if ( $value === $selected_zone ) {
     3318                        $selected = 'selected="selected" ';
    32683319                }
     3320                $structure[] = '<option ' . $selected . 'value="' . esc_attr( $value ) . '">' . esc_html( $display ) . "</option>";
     3321               
     3322                // Close continent optgroup
     3323                if ( !empty( $zone['city'] ) && isset( $zonen[$key + 1] ) && $zonen[$key + 1]['continent'] !== $zone['continent'] ) {
     3324                        $structure[] = '</optgroup>';
     3325                }
    32693326        }
    32703327
    3271         if ( !empty($selectcontinent) )
    3272                 $structure .= "</optgroup>\n";
    3273         return $structure;
     3328        return join( "\n", $structure );
    32743329}
    32753330
    32763331
  • wp-admin/options-general.php

     
    157157<span class="description"><?php _e('Choose a city in the same timezone as you.'); ?></span>
    158158<br />
    159159<span>
    160 <?php if (get_option('timezone_string')) : ?>
     160<?php if ($tzstring) : ?>
    161161        <?php
    162162        $now = localtime(time(),true);
    163163        if ($now['tm_isdst']) _e('This timezone is currently in daylight savings time.');
     
    165165        ?>
    166166        <br />
    167167        <?php
    168         if (function_exists('timezone_transitions_get') && $tzstring) {
     168        if (function_exists('timezone_transitions_get')) {
    169169                $dateTimeZoneSelected = new DateTimeZone($tzstring);
    170170                foreach (timezone_transitions_get($dateTimeZoneSelected) as $tr) {
    171171                        if ($tr['ts'] > time()) {
    172                                 $found = true;
     172                            $found = true;
    173173                                break;
    174174                        }
    175175                }
     
    179179                        $message = $tr['isdst'] ?
    180180                                __('Daylight savings time begins on: <code>%s</code>.') :
    181181                                __('Standard time begins  on: <code>%s</code>.');
    182                         $tz = new DateTimeZone($tzstring);
    183                         $d = new DateTime( "@{$tr['ts']}" );
    184                         $d->setTimezone($tz);
    185                         printf( $message, date_i18n(get_option('date_format').' '.get_option('time_format'), $d->format('U') ) );
     182                        printf( $message, date_i18n(get_option('date_format').' '.get_option('time_format'), $tr['ts'] ) );
    186183                } else {
    187184                        _e('This timezone does not observe daylight savings time.');
    188185                }