WordPress.org

Make WordPress Core

Ticket #39441: 39441.implementation.2.diff

File 39441.implementation.2.diff, 31.0 KB (added by flixos90, 4 years ago)
  • src/wp-admin/includes/options-general.php

     
     1<?php
     2/**
     3 * WordPress Options implementation for General Settings.
     4 *
     5 * @package WordPress
     6 * @subpackage Administration
     7 * @since 4.8.0
     8 */
     9
     10/**
     11 * Adds default settings fields for the General Settings page.
     12 *
     13 * @since 4.8.0
     14 */
     15function add_settings_fields_options_general() {
     16        add_settings_field( 'blogname', __( 'Site Title' ), 'text', 'general', 'default', array(
     17                'input_class' => 'regular-text',
     18        ) );
     19
     20        add_settings_field( 'blogdescription', __( 'Tagline' ), 'text', 'general', 'default', array(
     21                'input_class'    => 'regular-text',
     22                'description_id' => 'tagline-description',
     23                'description'    => __( 'In a few words, explain what this site is about.' ),
     24        ) );
     25
     26        if ( ! is_multisite() ) {
     27                add_settings_field( 'siteurl', __( 'WordPress Address (URL)' ), 'url', 'general', 'default', array(
     28                        'input_class' => 'regular-text code' . ( defined( 'WP_SITEURL' ) ? ' disabled' : '' ),
     29                        'disabled'    => defined( 'WP_SITEURL' ) ? true : false,
     30                ) );
     31
     32                add_settings_field( 'home', __( 'Site Address (URL)' ), 'url', 'general', 'default', array(
     33                        'input_class' => 'regular-text code' . ( defined( 'WP_HOME' ) ? ' disabled' : '' ),
     34                        'disabled'    => defined( 'WP_HOME' ) ? true : false,
     35                        'description' => __( 'Enter the address here if you <a href="https://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">want your site home page to be different from your WordPress installation directory.</a>' ),
     36                ) );
     37
     38                add_settings_field( 'admin_email', __( 'Email Address' ), 'email', 'general', 'default', array(
     39                        'input_id'    => 'admin-email',
     40                        'input_class' => 'regular-text ltr',
     41                        'description' => __( 'This address is used for admin purposes, like new user notification.' ),
     42                ) );
     43
     44                add_settings_field( 'users_can_register', __( 'Anyone can register' ), 'checkbox', 'general', 'default' );
     45
     46                add_settings_field( 'default_role', __( 'New User Default Role' ), 'render_settings_field_roles_dropdown', 'general', 'default' );
     47        } else {
     48                add_settings_field( 'admin_email', __( 'Email Address' ), 'email', 'general', 'default', array(
     49                        'input_id'       => 'new_admin_email',
     50                        'input_name'     => 'new_admin_email',
     51                        'input_class'    => 'regular-text ltr',
     52                        'description_id' => 'new-admin-email-description',
     53                        'description'    => __( 'This address is used for admin purposes. If you change this we will send you an email at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ),
     54                        'value_callback' => 'settings_field_admin_email_get_option',
     55                        'after'          => 'settings_field_admin_email_after',
     56                ) );
     57        }
     58
     59        $languages = get_available_languages();
     60        $translations = wp_get_available_translations();
     61        if ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG && ! in_array( WPLANG, $languages ) ) {
     62                $languages[] = WPLANG;
     63        }
     64        if ( ! empty( $languages ) || ! empty( $translations ) ) {
     65                add_settings_field( 'WPLANG', __( 'Site Language' ), 'render_settings_field_languages_dropdown', 'general', 'default', array(
     66                        'languages'    => $languages,
     67                        'translations' => $translations,
     68                        'after'        => 'settings_field_wplang_after',
     69                ) );
     70        }
     71
     72        add_settings_field( 'timezone_string', __( 'Timezone' ), 'render_settings_field_timezones_dropdown', 'general', 'default', array(
     73                'description_id' => 'timezone-description',
     74                'description'    => __( 'Choose either a city in the same timezone as you or a UTC timezone offset.' ),
     75        ) );
     76
     77        add_settings_field( 'date_format', __( 'Date Format' ), 'render_settings_field_datetime_format_radio', 'general', 'default', array(
     78                'mode'     => 'date_format',
     79                'fieldset' => true,
     80        ) );
     81
     82        add_settings_field( 'time_format', __( 'Time Format' ), 'render_settings_field_datetime_format_radio', 'general', 'default', array(
     83                'mode'     => 'time_format',
     84                'fieldset' => true,
     85                'after'    => 'settings_field_time_format_after',
     86        ) );
     87
     88        /**
     89         * @global WP_Locale $wp_locale
     90         */
     91        global $wp_locale;
     92
     93        $start_of_week_choices = array();
     94        for ( $day_index = 0; $day_index <= 6; $day_index++ ) {
     95                $start_of_week_choices[ $day_index ] = $wp_locale->get_weekday( $day_index );
     96        }
     97
     98        add_settings_field( 'start_of_week', __( 'Week Starts On' ), 'select', 'general', 'default', array(
     99                'choices'        => $start_of_week_choices,
     100        ) );
     101}
     102
     103/**
     104 * Settings field callback to print a roles dropdown control.
     105 *
     106 * @since 4.8.0
     107 *
     108 * @see add_settings_field()
     109 *
     110 * @param array $field_args Array of field arguments.
     111 */
     112function render_settings_field_roles_dropdown( $field_args ) {
     113        $input_attrs = array(
     114                'id'    => ! empty( $field_args['input_id'] ) ? $field_args['input_id'] : '',
     115                'name'  => ! empty( $field_args['input_name'] ) ? $field_args['input_name'] : '',
     116                'class' => ! empty( $field_args['input_class'] ) ? $field_args['input_class'] : '',
     117        );
     118
     119        $description_attrs = array();
     120
     121        if ( ! empty( $field_args['description'] ) ) {
     122                if ( ! empty( $field_args['description_id'] ) ) {
     123                        $description_attrs['id'] = $field_args['description_id'];
     124                        $input_attrs['aria-describedby'] = $field_args['description_id'];
     125                }
     126                $description_attrs['class'] = 'description';
     127        }
     128
     129        $current = ! empty( $field_args['value'] ) ? $field_args['value'] : '';
     130        ?>
     131        <select<?php attrs( $input_attrs ); ?>><?php wp_dropdown_roles( $current ); ?></select>
     132        <?php
     133
     134        if ( ! empty( $field_args['description'] ) ) {
     135                echo '<p' . attrs( $description_attrs, false ) . '>' . $field_args['description'] . '</p>';
     136        }
     137}
     138
     139/**
     140 * Settings field callback to print a languages dropdown control.
     141 *
     142 * @since 4.8.0
     143 *
     144 * @see add_settings_field()
     145 *
     146 * @param array $field_args Array of field arguments.
     147 */
     148function render_settings_field_languages_dropdown( $field_args ) {
     149        $languages    = isset( $field_args['languages'] ) ? $field_args['languages'] : get_available_languages();
     150        $translations = isset( $field_args['translations'] ) ? $field_args['translations'] : wp_get_available_translations();
     151
     152        $locale = get_locale();
     153        if ( ! in_array( $locale, $languages ) ) {
     154                $locale = '';
     155        }
     156
     157        wp_dropdown_languages( array(
     158                'name'         => ! empty( $field_args['input_name'] ) ? $field_args['input_name'] : '',
     159                'id'           => ! empty( $field_args['input_id'] ) ? $field_args['input_id'] : '',
     160                'selected'     => $locale,
     161                'languages'    => $languages,
     162                'translations' => $translations,
     163                'show_available_translations' => ( ! is_multisite() || is_super_admin() ) && wp_can_install_language_pack(),
     164        ) );
     165}
     166
     167/**
     168 * Settings field callback to print a timezones dropdown control.
     169 *
     170 * @since 4.8.0
     171 *
     172 * @see add_settings_field()
     173 *
     174 * @param array $field_args Array of field arguments.
     175 */
     176function render_settings_field_timezones_dropdown( $field_args ) {
     177        $current_offset = get_option('gmt_offset');
     178        $tzstring = ! empty( $field_args['value'] ) ? $field_args['value'] : '';
     179
     180        $check_zone_info = true;
     181
     182        // Remove old Etc mappings. Fallback to gmt_offset.
     183        if ( false !== strpos($tzstring,'Etc/GMT') )
     184                $tzstring = '';
     185
     186        if ( empty($tzstring) ) { // Create a UTC+- zone if no timezone string exists
     187                $check_zone_info = false;
     188                if ( 0 == $current_offset )
     189                        $tzstring = 'UTC+0';
     190                elseif ($current_offset < 0)
     191                        $tzstring = 'UTC' . $current_offset;
     192                else
     193                        $tzstring = 'UTC+' . $current_offset;
     194        }
     195
     196        $input_attrs = array(
     197                'id'    => ! empty( $field_args['input_id'] ) ? $field_args['input_id'] : '',
     198                'name'  => ! empty( $field_args['input_name'] ) ? $field_args['input_name'] : '',
     199                'class' => ! empty( $field_args['input_class'] ) ? $field_args['input_class'] : '',
     200        );
     201
     202        $description_attrs = array();
     203
     204        if ( ! empty( $field_args['description'] ) ) {
     205                if ( ! empty( $field_args['description_id'] ) ) {
     206                        $description_attrs['id'] = $field_args['description_id'];
     207                        $input_attrs['aria-describedby'] = $field_args['description_id'];
     208                }
     209                $description_attrs['class'] = 'description';
     210        }
     211
     212        ?>
     213        <select<?php attrs( $input_attrs ); ?>><?php echo wp_timezone_choice( $tzstring, get_user_locale() ); ?></select>
     214        <?php
     215
     216        if ( ! empty( $field_args['description'] ) ) {
     217                echo '<p' . attrs( $description_attrs, false ) . '>' . $field_args['description'] . '</p>';
     218        }
     219
     220        $timezone_format = _x( 'Y-m-d H:i:s', 'timezone date format' );
     221
     222        ?>
     223        <p class="timezone-info">
     224                <span id="utc-time"><?php
     225                        /* translators: 1: UTC abbreviation, 2: UTC time */
     226                        printf( __( 'Universal time (%1$s) is %2$s.' ),
     227                                '<abbr>' . __( 'UTC' ) . '</abbr>',
     228                                '<code>' . date_i18n( $timezone_format, false, true ) . '</code>'
     229                        );
     230                ?></span>
     231        <?php if ( get_option( 'timezone_string' ) || ! empty( $current_offset ) ) : ?>
     232                <span id="local-time"><?php
     233                        /* translators: %s: local time */
     234                        printf( __( 'Local time is %s.' ),
     235                                '<code>' . date_i18n( $timezone_format ) . '</code>'
     236                        );
     237                ?></span>
     238        <?php endif; ?>
     239        </p>
     240
     241        <?php if ( $check_zone_info && $tzstring ) : ?>
     242        <p class="timezone-info">
     243        <span>
     244                <?php
     245                // Set TZ so localtime works.
     246                date_default_timezone_set($tzstring);
     247                $now = localtime(time(), true);
     248                if ( $now['tm_isdst'] )
     249                        _e('This timezone is currently in daylight saving time.');
     250                else
     251                        _e('This timezone is currently in standard time.');
     252                ?>
     253                <br />
     254                <?php
     255                $allowed_zones = timezone_identifiers_list();
     256
     257                if ( in_array( $tzstring, $allowed_zones) ) {
     258                        $found = false;
     259                        $date_time_zone_selected = new DateTimeZone($tzstring);
     260                        $tz_offset = timezone_offset_get($date_time_zone_selected, date_create());
     261                        $right_now = time();
     262                        foreach ( timezone_transitions_get($date_time_zone_selected) as $tr) {
     263                                if ( $tr['ts'] > $right_now ) {
     264                                    $found = true;
     265                                        break;
     266                                }
     267                        }
     268
     269                        if ( $found ) {
     270                                echo ' ';
     271                                $message = $tr['isdst'] ?
     272                                        /* translators: %s: date and time  */
     273                                        __( 'Daylight saving time begins on: %s.')  :
     274                                        /* translators: %s: date and time  */
     275                                        __( 'Standard time begins on: %s.' );
     276                                // Add the difference between the current offset and the new offset to ts to get the correct transition time from date_i18n().
     277                                printf( $message,
     278                                        '<code>' . date_i18n(
     279                                                __( 'F j, Y' ) . ' ' . __( 'g:i a' ),
     280                                                $tr['ts'] + ( $tz_offset - $tr['offset'] )
     281                                        ) . '</code>'
     282                                );
     283                        } else {
     284                                _e( 'This timezone does not observe daylight saving time.' );
     285                        }
     286                }
     287                // Set back to UTC.
     288                date_default_timezone_set('UTC');
     289                ?>
     290                </span>
     291        </p>
     292        <?php endif;
     293}
     294
     295/**
     296 * Settings field callback to print a date or time radio group.
     297 *
     298 * @since 4.8.0
     299 *
     300 * @see add_settings_field()
     301 *
     302 * @param array $field_args Array of field arguments.
     303 */
     304function render_settings_field_datetime_format_radio( $field_args ) {
     305        $input_attrs = array(
     306                'type'  => 'radio',
     307                'id'    => ! empty( $field_args['input_id'] ) ? $field_args['input_id'] : '',
     308                'name'  => ! empty( $field_args['input_name'] ) ? $field_args['input_name'] : '',
     309                'class' => ! empty( $field_args['input_class'] ) ? $field_args['input_class'] : '',
     310        );
     311
     312        $choices = array();
     313        $custom_radio_label = '';
     314        $custom_label = '';
     315
     316        if ( ! empty( $field_args['mode'] ) && 'time_format' === $field_args['mode'] ) {
     317                /**
     318                 * Filters the default time formats.
     319                 *
     320                 * @since 2.7.0
     321                 *
     322                 * @param array $default_time_formats Array of default time formats.
     323                 */
     324                $choices = array_unique( apply_filters( 'time_formats', array( __( 'g:i a' ), 'g:i A', 'H:i' ) ) );
     325
     326                $custom_radio_label = __( 'Custom: enter a custom time format in the field below' );
     327                $custom_label = __( 'Custom time format:' );
     328        } else {
     329                /**
     330                 * Filters the default date formats.
     331                 *
     332                 * @since 2.7.0
     333                 * @since 4.0.0 Added ISO date standard YYYY-MM-DD format.
     334                 *
     335                 * @param array $default_date_formats Array of default date formats.
     336                 */
     337                $choices = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) );
     338
     339                $custom_radio_label = __( 'Custom: enter a custom date format in the field below' );
     340                $custom_label = __( 'Custom date format:' );
     341        }
     342
     343        $current = ! empty( $field_args['value'] ) ? $field_args['value'] : $choices[0];
     344
     345        $custom = false;
     346        if ( ! in_array( $current, $choices ) ) {
     347                $custom = true;
     348        }
     349
     350        $id_suffix = 0;
     351        foreach ( $choices as $value ) {
     352                $id_suffix++;
     353
     354                $radio_attrs = $input_attrs;
     355                $radio_attrs['id'] .= '-' . zeroise( $id_suffix, 2 );
     356                $radio_attrs['value'] = $value;
     357
     358                echo '<span class="radio-item">';
     359                echo '<input' . attrs( $radio_attrs, false ) . checked( $current, $value, false ) . ' />';
     360                echo ' <label for="' . $radio_attrs['id'] . '"><span class="date-time-text format-i18n">' . date_i18n( $value ) . '</span><code>' . esc_html( $value ) . '</code></label>';
     361                echo '</span><br />';
     362        }
     363
     364        $radio_attrs = $input_attrs;
     365        $radio_attrs['id'] = $radio_attrs['name'] . '_custom_radio';
     366        $radio_attrs['value'] = '\c\u\s\t\o\m';
     367
     368        echo '<span class="radio-item">';
     369        echo '<input' . attrs( $radio_attrs, false ) . checked( $custom, true, false ) . ' />';
     370        echo ' <label for="' . $radio_attrs['id'] . '">' . $custom_radio_label . '</label>';
     371        echo '</span><br />';
     372
     373        $description_id = $radio_attrs['id'] . '-custom-description';
     374        $text_attrs = array(
     375                'type'             => 'text',
     376                'id'               => $radio_attrs['name'] . '_custom',
     377                'name'             => $radio_attrs['name'] . '_custom',
     378                'class'            => 'small-text',
     379                'value'            => $current,
     380                'aria-describedby' => $description_id,
     381        );
     382
     383        echo '<span class="radio-item">';
     384        echo '<label for="' . esc_attr( $text_attrs['id'] ) . '">' . $custom_label . '</label>';
     385        echo ' <input' . attrs( $text_attrs, false ) . ' />';
     386        echo ' <span class="description" id="' . $description_id . '">' . __( 'Example:' ) . ' <span class="example">' . date_i18n( $current ) . '</span><span class="spinner"></span></span>';
     387        echo '</span>';
     388}
     389
     390/**
     391 * Settings field callback to retrieve the admin email.
     392 *
     393 * @since 4.8
     394 *
     395 * @return string Admin email address.
     396 */
     397function settings_field_admin_email_get_option() {
     398        return get_option( 'admin_email' );
     399}
     400
     401/**
     402 * Settings field callback to print additional content for the 'admin_email' control.
     403 *
     404 * @since 4.8
     405 */
     406function settings_field_admin_email_after() {
     407        $new_admin_email = get_option( 'new_admin_email' );
     408        if ( $new_admin_email && $new_admin_email != get_option('admin_email') ) : ?>
     409        <div class="updated inline">
     410        <p><?php
     411                printf(
     412                        /* translators: %s: new admin email */
     413                        __( 'There is a pending change of the admin email to %s.' ),
     414                        '<code>' . esc_html( $new_admin_email ) . '</code>'
     415                );
     416                printf(
     417                        ' <a href="%1$s">%2$s</a>',
     418                        esc_url( wp_nonce_url( admin_url( 'options.php?dismiss=new_admin_email' ), 'dismiss-' . get_current_blog_id() . '-new_admin_email' ) ),
     419                        __( 'Cancel' )
     420                );
     421        ?></p>
     422        </div>
     423        <?php endif;
     424}
     425
     426/**
     427 * Settings field callback to print additional content for the 'WPLANG' control.
     428 *
     429 * @since 4.8
     430 */
     431function settings_field_wplang_after() {
     432        // Add note about deprecated WPLANG constant.
     433        if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && get_locale() !== WPLANG ) {
     434                if ( is_multisite() && current_user_can( 'manage_network_options' )
     435                        || ! is_multisite() && current_user_can( 'manage_options' ) ) {
     436                        ?>
     437                        <p class="description">
     438                                <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>' ); ?>
     439                        </p>
     440                        <?php
     441                }
     442                _deprecated_argument( 'define()', '4.0.0', sprintf( __( 'The %s constant in your %s file is no longer needed.' ), 'WPLANG', 'wp-config.php' ) );
     443        }
     444}
     445
     446/**
     447 * Settings field callback to print additional content for the 'time_format' control.
     448 *
     449 * @since 4.8
     450 */
     451function settings_field_time_format_after() {
     452        ?>
     453        <p class="date-time-doc"><a href="https://codex.wordpress.org/Formatting_Date_and_Time"><?php _e( 'Documentation on date and time formatting' ); ?></a>.</p>
     454        <?php
     455}
  • src/wp-admin/includes/options.php

    Property changes on: src/wp-admin/includes/options-general.php
    ___________________________________________________________________
    Added: svn:executable
    ## -0,0 +1 ##
    +*
    \ No newline at end of property
     
    5151
    5252                $("input[name='date_format']").click(function(){
    5353                        if ( "date_format_custom_radio" != $(this).attr("id") )
    54                                 $( "input[name='date_format_custom']" ).val( $( this ).val() ).siblings( '.example' ).text( $( this ).parent( 'label' ).children( '.format-i18n' ).text() );
     54                                $( "input[name='date_format_custom']" ).val( $( this ).val() ).parent().find( '.example' ).text( $( this ).parent().find( '.format-i18n' ).text() );
    5555                });
    5656                $("input[name='date_format_custom']").focus(function(){
    5757                        $( '#date_format_custom_radio' ).prop( 'checked', true );
     
    5959
    6060                $("input[name='time_format']").click(function(){
    6161                        if ( "time_format_custom_radio" != $(this).attr("id") )
    62                                 $( "input[name='time_format_custom']" ).val( $( this ).val() ).siblings( '.example' ).text( $( this ).parent( 'label' ).children( '.format-i18n' ).text() );
     62                                $( "input[name='time_format_custom']" ).val( $( this ).val() ).parent().find( '.example' ).text( $( this ).parent().find( '.format-i18n' ).text() );
    6363                });
    6464                $("input[name='time_format_custom']").focus(function(){
    6565                        $( '#time_format_custom_radio' ).prop( 'checked', true );
  • src/wp-admin/options-general.php

     
    1212/** WordPress Translation Install API */
    1313require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
    1414
     15/** WordPress Options implementation for General Settings */
     16require_once( ABSPATH . 'wp-admin/includes/options-general.php' );
     17
     18add_settings_fields_options_general();
     19
    1520if ( ! current_user_can( 'manage_options' ) )
    1621        wp_die( __( 'Sorry, you are not allowed to manage options for this site.' ) );
    1722
     
    5560<form method="post" action="options.php" novalidate="novalidate">
    5661<?php settings_fields('general'); ?>
    5762
    58 <table class="form-table">
    59 <tr>
    60 <th scope="row"><label for="blogname"><?php _e('Site Title') ?></label></th>
    61 <td><input name="blogname" type="text" id="blogname" value="<?php form_option('blogname'); ?>" class="regular-text" /></td>
    62 </tr>
    63 <tr>
    64 <th scope="row"><label for="blogdescription"><?php _e('Tagline') ?></label></th>
    65 <td><input name="blogdescription" type="text" id="blogdescription" aria-describedby="tagline-description" value="<?php form_option('blogdescription'); ?>" class="regular-text" />
    66 <p class="description" id="tagline-description"><?php _e( 'In a few words, explain what this site is about.' ) ?></p></td>
    67 </tr>
    68 <?php if ( !is_multisite() ) { ?>
    69 <tr>
    70 <th scope="row"><label for="siteurl"><?php _e('WordPress Address (URL)') ?></label></th>
    71 <td><input name="siteurl" type="url" id="siteurl" value="<?php form_option( 'siteurl' ); ?>"<?php disabled( defined( 'WP_SITEURL' ) ); ?> class="regular-text code<?php if ( defined( 'WP_SITEURL' ) ) echo ' disabled' ?>" /></td>
    72 </tr>
    73 <tr>
    74 <th scope="row"><label for="home"><?php _e('Site Address (URL)') ?></label></th>
    75 <td><input name="home" type="url" id="home" aria-describedby="home-description" value="<?php form_option( 'home' ); ?>"<?php disabled( defined( 'WP_HOME' ) ); ?> class="regular-text code<?php if ( defined( 'WP_HOME' ) ) echo ' disabled' ?>" />
    76 <?php if ( ! defined( 'WP_HOME' ) ) : ?>
    77 <p class="description" id="home-description"><?php _e( 'Enter the address here if you <a href="https://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">want your site home page to be different from your WordPress installation directory.</a>' ); ?></p></td>
    78 <?php endif; ?>
    79 </tr>
    80 <tr>
    81 <th scope="row"><label for="admin_email"><?php _e('Email Address') ?> </label></th>
    82 <td><input name="admin_email" type="email" id="admin_email" aria-describedby="admin-email-description" value="<?php form_option( 'admin_email' ); ?>" class="regular-text ltr" />
    83 <p class="description" id="admin-email-description"><?php _e( 'This address is used for admin purposes, like new user notification.' ) ?></p></td>
    84 </tr>
    85 <tr>
    86 <th scope="row"><?php _e('Membership') ?></th>
    87 <td> <fieldset><legend class="screen-reader-text"><span><?php _e('Membership') ?></span></legend><label for="users_can_register">
    88 <input name="users_can_register" type="checkbox" id="users_can_register" value="1" <?php checked('1', get_option('users_can_register')); ?> />
    89 <?php _e('Anyone can register') ?></label>
    90 </fieldset></td>
    91 </tr>
    92 <tr>
    93 <th scope="row"><label for="default_role"><?php _e('New User Default Role') ?></label></th>
    94 <td>
    95 <select name="default_role" id="default_role"><?php wp_dropdown_roles( get_option('default_role') ); ?></select>
    96 </td>
    97 </tr>
    98 <?php } else { ?>
    99 <tr>
    100 <th scope="row"><label for="new_admin_email"><?php _e('Email Address') ?> </label></th>
    101 <td><input name="new_admin_email" type="email" id="new_admin_email" aria-describedby="new-admin-email-description" value="<?php form_option( 'admin_email' ); ?>" class="regular-text ltr" />
    102 <p class="description" id="new-admin-email-description"><?php _e( 'This address is used for admin purposes. If you change this we will send you an email at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ) ?></p>
    103 <?php
    104 $new_admin_email = get_option( 'new_admin_email' );
    105 if ( $new_admin_email && $new_admin_email != get_option('admin_email') ) : ?>
    106 <div class="updated inline">
    107 <p><?php
    108         printf(
    109                 /* translators: %s: new admin email */
    110                 __( 'There is a pending change of the admin email to %s.' ),
    111                 '<code>' . esc_html( $new_admin_email ) . '</code>'
    112         );
    113         printf(
    114                 ' <a href="%1$s">%2$s</a>',
    115                 esc_url( wp_nonce_url( admin_url( 'options.php?dismiss=new_admin_email' ), 'dismiss-' . get_current_blog_id() . '-new_admin_email' ) ),
    116                 __( 'Cancel' )
    117         );
    118 ?></p>
     63<div class="settings-fields">
     64<?php do_settings_fields( 'general', 'default' ); ?>
    11965</div>
    120 <?php endif; ?>
    121 </td>
    122 </tr>
    123 <?php }
    124 
    125 $languages = get_available_languages();
    126 $translations = wp_get_available_translations();
    127 if ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG && ! in_array( WPLANG, $languages ) ) {
    128         $languages[] = WPLANG;
    129 }
    130 if ( ! empty( $languages ) || ! empty( $translations ) ) {
    131         ?>
    132         <tr>
    133                 <th width="33%" scope="row"><label for="WPLANG"><?php _e( 'Site Language' ); ?></label></th>
    134                 <td>
    135                         <?php
    136                         $locale = get_locale();
    137                         if ( ! in_array( $locale, $languages ) ) {
    138                                 $locale = '';
    139                         }
    140 
    141                         wp_dropdown_languages( array(
    142                                 'name'         => 'WPLANG',
    143                                 'id'           => 'WPLANG',
    144                                 'selected'     => $locale,
    145                                 'languages'    => $languages,
    146                                 'translations' => $translations,
    147                                 'show_available_translations' => ( ! is_multisite() || is_super_admin() ) && wp_can_install_language_pack(),
    148                         ) );
    149 
    150                         // Add note about deprecated WPLANG constant.
    151                         if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && $locale !== WPLANG ) {
    152                                 if ( is_multisite() && current_user_can( 'manage_network_options' )
    153                                         || ! is_multisite() && current_user_can( 'manage_options' ) ) {
    154                                         ?>
    155                                         <p class="description">
    156                                                 <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>' ); ?>
    157                                         </p>
    158                                         <?php
    159                                 }
    160                                 _deprecated_argument( 'define()', '4.0.0', sprintf( __( 'The %s constant in your %s file is no longer needed.' ), 'WPLANG', 'wp-config.php' ) );
    161                         }
    162                         ?>
    163                 </td>
    164         </tr>
    165         <?php
    166 }
    167 ?>
    168 <tr>
    169 <?php
    170 $current_offset = get_option('gmt_offset');
    171 $tzstring = get_option('timezone_string');
    172 
    173 $check_zone_info = true;
    174 
    175 // Remove old Etc mappings. Fallback to gmt_offset.
    176 if ( false !== strpos($tzstring,'Etc/GMT') )
    177         $tzstring = '';
    178 
    179 if ( empty($tzstring) ) { // Create a UTC+- zone if no timezone string exists
    180         $check_zone_info = false;
    181         if ( 0 == $current_offset )
    182                 $tzstring = 'UTC+0';
    183         elseif ($current_offset < 0)
    184                 $tzstring = 'UTC' . $current_offset;
    185         else
    186                 $tzstring = 'UTC+' . $current_offset;
    187 }
    188 
    189 ?>
    190 <th scope="row"><label for="timezone_string"><?php _e('Timezone') ?></label></th>
    191 <td>
    192 
    193 <select id="timezone_string" name="timezone_string" aria-describedby="timezone-description">
    194         <?php echo wp_timezone_choice( $tzstring, get_user_locale() ); ?>
    195 </select>
    196 
    197 <p class="description" id="timezone-description"><?php _e( 'Choose either a city in the same timezone as you or a UTC timezone offset.' ); ?></p>
    198 
    199 <p class="timezone-info">
    200         <span id="utc-time"><?php
    201                 /* translators: 1: UTC abbreviation, 2: UTC time */
    202                 printf( __( 'Universal time (%1$s) is %2$s.' ),
    203                         '<abbr>' . __( 'UTC' ) . '</abbr>',
    204                         '<code>' . date_i18n( $timezone_format, false, true ) . '</code>'
    205                 );
    206         ?></span>
    207 <?php if ( get_option( 'timezone_string' ) || ! empty( $current_offset ) ) : ?>
    208         <span id="local-time"><?php
    209                 /* translators: %s: local time */
    210                 printf( __( 'Local time is %s.' ),
    211                         '<code>' . date_i18n( $timezone_format ) . '</code>'
    212                 );
    213         ?></span>
    214 <?php endif; ?>
    215 </p>
    216 
    217 <?php if ( $check_zone_info && $tzstring ) : ?>
    218 <p class="timezone-info">
    219 <span>
    220         <?php
    221         // Set TZ so localtime works.
    222         date_default_timezone_set($tzstring);
    223         $now = localtime(time(), true);
    224         if ( $now['tm_isdst'] )
    225                 _e('This timezone is currently in daylight saving time.');
    226         else
    227                 _e('This timezone is currently in standard time.');
    228         ?>
    229         <br />
    230         <?php
    231         $allowed_zones = timezone_identifiers_list();
    232 
    233         if ( in_array( $tzstring, $allowed_zones) ) {
    234                 $found = false;
    235                 $date_time_zone_selected = new DateTimeZone($tzstring);
    236                 $tz_offset = timezone_offset_get($date_time_zone_selected, date_create());
    237                 $right_now = time();
    238                 foreach ( timezone_transitions_get($date_time_zone_selected) as $tr) {
    239                         if ( $tr['ts'] > $right_now ) {
    240                             $found = true;
    241                                 break;
    242                         }
    243                 }
    244 
    245                 if ( $found ) {
    246                         echo ' ';
    247                         $message = $tr['isdst'] ?
    248                                 /* translators: %s: date and time  */
    249                                 __( 'Daylight saving time begins on: %s.')  :
    250                                 /* translators: %s: date and time  */
    251                                 __( 'Standard time begins on: %s.' );
    252                         // Add the difference between the current offset and the new offset to ts to get the correct transition time from date_i18n().
    253                         printf( $message,
    254                                 '<code>' . date_i18n(
    255                                         __( 'F j, Y' ) . ' ' . __( 'g:i a' ),
    256                                         $tr['ts'] + ( $tz_offset - $tr['offset'] )
    257                                 ) . '</code>'
    258                         );
    259                 } else {
    260                         _e( 'This timezone does not observe daylight saving time.' );
    261                 }
    262         }
    263         // Set back to UTC.
    264         date_default_timezone_set('UTC');
    265         ?>
    266         </span>
    267 </p>
    268 <?php endif; ?>
    269 </td>
    270 
    271 </tr>
    272 <tr>
    273 <th scope="row"><?php _e('Date Format') ?></th>
    274 <td>
    275         <fieldset><legend class="screen-reader-text"><span><?php _e('Date Format') ?></span></legend>
    276 <?php
    277         /**
    278         * Filters the default date formats.
    279         *
    280         * @since 2.7.0
    281         * @since 4.0.0 Added ISO date standard YYYY-MM-DD format.
    282         *
    283         * @param array $default_date_formats Array of default date formats.
    284         */
    285         $date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) );
    286 
    287         $custom = true;
    288 
    289         foreach ( $date_formats as $format ) {
    290                 echo "\t<label><input type='radio' name='date_format' value='" . esc_attr( $format ) . "'";
    291                 if ( get_option('date_format') === $format ) { // checked() uses "==" rather than "==="
    292                         echo " checked='checked'";
    293                         $custom = false;
    294                 }
    295                 echo ' /> <span class="date-time-text format-i18n">' . date_i18n( $format ) . '</span><code>' . esc_html( $format ) . "</code></label><br />\n";
    296         }
    297 
    298         echo '<label><input type="radio" name="date_format" id="date_format_custom_radio" value="\c\u\s\t\o\m"';
    299         checked( $custom );
    300         echo '/> <span class="date-time-text date-time-custom-text">' . __( 'Custom:' ) . '<span class="screen-reader-text"> ' . __( 'enter a custom date format in the following field' ) . '</span></label>' .
    301                 '<label for="date_format_custom" class="screen-reader-text">' . __( 'Custom date format:' ) . '</label>' .
    302                 '<input type="text" name="date_format_custom" id="date_format_custom" value="' . esc_attr( get_option( 'date_format' ) ) . '" class="small-text" /></span>' .
    303                 '<span class="screen-reader-text">' . __( 'example:' ) . ' </span> <span class="example">' . date_i18n( get_option( 'date_format' ) ) . '</span>' .
    304                 "<span class='spinner'></span>\n";
    305 ?>
    306         </fieldset>
    307 </td>
    308 </tr>
    309 <tr>
    310 <th scope="row"><?php _e('Time Format') ?></th>
    311 <td>
    312         <fieldset><legend class="screen-reader-text"><span><?php _e('Time Format') ?></span></legend>
    313 <?php
    314         /**
    315         * Filters the default time formats.
    316         *
    317         * @since 2.7.0
    318         *
    319         * @param array $default_time_formats Array of default time formats.
    320         */
    321         $time_formats = array_unique( apply_filters( 'time_formats', array( __( 'g:i a' ), 'g:i A', 'H:i' ) ) );
    322 
    323         $custom = true;
    324 
    325         foreach ( $time_formats as $format ) {
    326                 echo "\t<label><input type='radio' name='time_format' value='" . esc_attr( $format ) . "'";
    327                 if ( get_option('time_format') === $format ) { // checked() uses "==" rather than "==="
    328                         echo " checked='checked'";
    329                         $custom = false;
    330                 }
    331                 echo ' /> <span class="date-time-text format-i18n">' . date_i18n( $format ) . '</span><code>' . esc_html( $format ) . "</code></label><br />\n";
    332         }
    333 
    334         echo '<label><input type="radio" name="time_format" id="time_format_custom_radio" value="\c\u\s\t\o\m"';
    335         checked( $custom );
    336         echo '/> <span class="date-time-text date-time-custom-text">' . __( 'Custom:' ) . '<span class="screen-reader-text"> ' . __( 'enter a custom time format in the following field' ) . '</span></label>' .
    337                 '<label for="time_format_custom" class="screen-reader-text">' . __( 'Custom time format:' ) . '</label>' .
    338                 '<input type="text" name="time_format_custom" id="time_format_custom" value="' . esc_attr( get_option( 'time_format' ) ) . '" class="small-text" /></span>' .
    339                 '<span class="screen-reader-text">' . __( 'example:' ) . ' </span> <span class="example">' . date_i18n( get_option( 'time_format' ) ) . '</span>' .
    340                 "<span class='spinner'></span>\n";
    341 
    342         echo "\t<p class='date-time-doc'>" . __('<a href="https://codex.wordpress.org/Formatting_Date_and_Time">Documentation on date and time formatting</a>.') . "</p>\n";
    343 ?>
    344         </fieldset>
    345 </td>
    346 </tr>
    347 <tr>
    348 <th scope="row"><label for="start_of_week"><?php _e('Week Starts On') ?></label></th>
    349 <td><select name="start_of_week" id="start_of_week">
    350 <?php
    351 /**
    352  * @global WP_Locale $wp_locale
    353  */
    354 global $wp_locale;
    355 
    356 for ($day_index = 0; $day_index <= 6; $day_index++) :
    357         $selected = (get_option('start_of_week') == $day_index) ? 'selected="selected"' : '';
    358         echo "\n\t<option value='" . esc_attr($day_index) . "' $selected>" . $wp_locale->get_weekday($day_index) . '</option>';
    359 endfor;
    360 ?>
    361 </select></td>
    362 </tr>
    363 <?php do_settings_fields('general', 'default'); ?>
    364 </table>
    36566
    36667<?php do_settings_sections('general'); ?>
    36768