WordPress.org

Make WordPress Core

Changeset 11598


Ignore:
Timestamp:
06/18/09 17:40:57 (5 years ago)
Author:
ryan
Message:

Optimize timezone dropdown creation. Props sambauers. fixes #10125 for 2.8.1

Location:
branches/2.8
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/2.8/wp-admin/options-general.php

    r11380 r11598  
    158158<br /> 
    159159<span> 
    160 <?php if (get_option('timezone_string')) : ?> 
     160<?php if ($tzstring) : ?> 
    161161    <?php 
    162162    $now = localtime(time(),true); 
     
    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            } 
     
    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.'); 
  • branches/2.8/wp-includes/functions.php

    r11544 r11598  
    31503150 */ 
    31513151function wp_timezone_override_offset() { 
    3152     if (!wp_timezone_supported()) return false; 
    3153  
    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; 
     3152    if ( !wp_timezone_supported() ) { 
     3153        return false; 
     3154    } 
     3155    if ( !$timezone_string = get_option( 'timezone_string' ) ) { 
     3156        return false; 
     3157    } 
     3158 
     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); 
    3180  
    3181     return apply_filters('timezone_support',false); 
     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} 
     3183 
     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 
     
    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++; 
    3216     } 
    3217  
    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         ')); 
    3234  
    3235     $structure = ''; 
    3236     $pad = '&nbsp;&nbsp;&nbsp;'; 
    3237  
    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 
     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        ); 
     3269    } 
     3270    usort( $zonen, '_wp_timezone_choice_usort_callback' ); 
     3271 
     3272    $structure = array(); 
     3273 
     3274    if ( empty( $selected_zone ) ) { 
     3275        $structure[] = '<option selected="selected" value="">' . __( 'Select a city' ) . '</option>'; 
     3276    } 
     3277 
     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 ) .'">'; 
     3292            } 
     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                } 
    32513311            } 
    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        } 
    3269     } 
    3270  
    3271     if ( !empty($selectcontinent) ) 
    3272         $structure .= "</optgroup>\n"; 
    3273     return $structure; 
     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        } 
     3326    } 
     3327 
     3328    return join( "\n", $structure ); 
    32743329} 
    32753330 
Note: See TracChangeset for help on using the changeset viewer.