WordPress.org

Make WordPress Core

Ticket #3962: 3962.diff

File 3962.diff, 6.6 KB (added by Otto42, 9 years ago)

First draft of smarter timezone support

  • wp-admin/options-general.php

     
    9393</td>
    9494</tr>
    9595<tr>
     96<?php
     97if (!wp_timezone_supported()) : // no magic timezone support here
     98?>
    9699<th scope="row"><label for="gmt_offset"><?php _e('Timezone') ?> </label></th>
    97100<td>
    98101<select name="gmt_offset" id="gmt_offset">
     
    127130<br/>
    128131<span class="setting-description"><?php _e('Unfortunately, you have to manually update this for Daylight Savings Time. Lame, we know, but will be fixed in the future.'); ?></span>
    129132</td>
     133<?php
     134else: // looks like we can do nice timezone selection!
     135$current_offset = get_option('gmt_offset');
     136?>
     137<th scope="row"><label for="timezone_string"><?php _e('Timezone') ?></label></th>
     138<td>
     139
     140<select id="timezone_string" name="timezone_string">
     141<?php echo wp_timezone_choice(get_option('timezone_string')); ?>
     142</select>
     143
     144<span id="utc-time"><?php printf(__('<abbr title="Coordinated Universal Time">UTC</abbr> time is <code>%s</code>'), date_i18n(__('Y-m-d G:i:s'), false, 'gmt')); ?></span>
     145<?php if (get_option('timezone_string')) : ?>
     146        <span id="local-time"><?php printf(__('Current time in %1$s is <code>%2$s</code>'), get_option('timezone_string'), date_i18n(__('Y-m-d G:i:s'))); ?></span>
     147<?php endif; ?>
     148<br/>
     149<span class="setting-description"><?php _e('Choose a city in the same timezone as you.'); ?></span>
     150</td>
     151
     152<?php endif; ?>
    130153</tr>
    131154<tr>
    132155<th scope="row"><?php _e('Date Format') ?></th>
  • wp-admin/options.php

     
    2222wp_reset_vars(array('action'));
    2323
    2424$whitelist_options = array(
    25         'general' => array( 'blogname', 'blogdescription', 'admin_email', 'users_can_register', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'default_role' ),
     25        'general' => array( 'blogname', 'blogdescription', 'admin_email', 'users_can_register', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'default_role', 'timezone_string' ),
    2626        'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),
    2727        'misc' => array( 'hack_file', 'use_linksupdate', 'uploads_use_yearmonth_folders', 'upload_path', 'upload_url_path' ),
    2828        'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type' ),
  • wp-includes/default-filters.php

     
    203203add_action('edit_form_advanced', 'wp_remember_old_slug');
    204204add_action('init', '_show_post_preview');
    205205
     206add_filter('pre_option_gmt_offset','wp_timezone_override_offset');
     207
    206208?>
  • wp-includes/functions.php

     
    29022902        return $can_clone ? clone( $object ) : $object;
    29032903}
    29042904
     2905/**
     2906 * gmt_offset modification for smart timezone handling
     2907 *
     2908 * Overrides the gmt_offset option if we have a timezone_string available
     2909 */
     2910function wp_timezone_override_offset() {
     2911        if (!wp_timezone_supported()) return false;
    29052912
    2906 ?>
     2913        $tz = get_option('timezone_string');
     2914        if (empty($tz)) return false;
     2915
     2916        @date_default_timezone_set($tz);
     2917               
     2918        $dateTimeZoneSelected = timezone_open($tz);
     2919        $dateTimeServer = date_create();
     2920        if ($dateTimeZoneSelected === false || $dateTimeServer === false) return false;
     2921               
     2922        $timeOffset = timezone_offset_get($dateTimeZoneSelected, $dateTimeServer);
     2923        $timeOffset = $timeOffset / 3600;
     2924               
     2925        return $timeOffset;
     2926}
     2927
     2928/**
     2929 * Check for PHP timezone support
     2930 *
     2931 */
     2932function wp_timezone_supported() {
     2933        if (function_exists('date_default_timezone_set')
     2934            && function_exists('timezone_identifiers_list')
     2935            && function_exists('timezone_open')
     2936            && function_exists('timezone_offset_get')
     2937            )
     2938            return true;
     2939
     2940        return false;
     2941}
     2942
     2943/**
     2944 * Gives a nicely formatted list of timezone strings // temporary! Not in final
     2945 *
     2946 * @param string $selectedzone - which zone should be the selected one
     2947 *
     2948 */
     2949function wp_timezone_choice($selectedzone) {
     2950    $all = timezone_identifiers_list();
     2951
     2952    $i = 0;
     2953    foreach($all AS $zone) {
     2954      $zone = explode('/',$zone);
     2955      $zonen[$i]['continent'] = isset($zone[0]) ? $zone[0] : '';
     2956      $zonen[$i]['city'] = isset($zone[1]) ? $zone[1] : '';
     2957      $zonen[$i]['subcity'] = isset($zone[2]) ? $zone[2] : '';
     2958      $i++;
     2959    }
     2960
     2961    asort($zonen);
     2962    $structure = '';
     2963    foreach($zonen AS $zone) {
     2964      extract($zone);
     2965      if($continent == 'Africa' || $continent == 'America' || $continent == 'Antarctica' || $continent == 'Arctic' || $continent == 'Asia' || $continent == 'Atlantic' || $continent == 'Australia' || $continent == 'Europe' || $continent == 'Indian' || $continent == 'Pacific') {
     2966        if(!isset($selectcontinent)) {
     2967          $structure .= '<optgroup label="'.$continent.'">'; // continent
     2968        } elseif($selectcontinent != $continent) {
     2969          $structure .= '</optgroup><optgroup label="'.$continent.'">'; // continent
     2970        }
     2971
     2972        if(isset($city) != ''){
     2973          if (!empty($subcity) != ''){
     2974            $city = $city . '/'. $subcity;
     2975          }
     2976          $structure .= "<option ".((($continent.'/'.$city)==$selectedzone)?'selected="selected "':'')." value=\"".($continent.'/'.$city)."\">".str_replace('_',' ',$city)."</option>"; //Timezone
     2977        } else {
     2978          if (!empty($subcity) != ''){
     2979            $city = $city . '/'. $subcity;
     2980          }
     2981          $structure .= "<option ".(($continent==$selectedzone)?'selected="selected "':'')." value=\"".$continent."\">".$continent."</option>"; //Timezone
     2982        }
     2983
     2984        $selectcontinent = $continent;
     2985      }
     2986    }
     2987    $structure .= '</optgroup>';
     2988    return $structure;
     2989}
     2990
     2991
     2992?>
     2993 No newline at end of file