WordPress.org

Make WordPress Core

Ticket #15691: 15691.2.diff

File 15691.2.diff, 22.8 KB (added by flixos90, 3 years ago)

new take on the issue based on original patch

  • src/wp-admin/admin-header.php

     
    257257 */
    258258do_action( 'all_admin_notices' );
    259259
    260 if ( $parent_file == 'options-general.php' )
     260if ( $parent_file == 'options-general.php' || $parent_file = 'settings.php' )
    261261        require(ABSPATH . 'wp-admin/options-head.php');
  • src/wp-admin/includes/admin-filters.php

     
    6161
    6262// Plugin hooks.
    6363add_filter( 'whitelist_options', 'option_update_filter' );
     64add_filter( 'whitelist_network_options', 'network_option_update_filter' );
    6465
    6566// Plugin Install hooks.
    6667add_action( 'install_plugins_featured',               'install_dashboard' );
  • src/wp-admin/includes/misc.php

     
    691691}
    692692
    693693/**
     694 * Process settings submitted by the Settings API.
    694695 *
     696 * @since 4.5.0
     697 *
     698 * @global array $whitelist_options A whitelist of permitted settings fields
     699 *
     700 * @param string $option_page The id of the panel that submitted the settings
     701 * @param string $context     A context for the function. Either 'site' or 'network'.
     702 */
     703function process_settings( $option_page, $context = 'site' ) {
     704        global $whitelist_options;
     705
     706        $unregistered = false;
     707        switch ( $context ) {
     708                case 'network':
     709                        /** This action is documented in wp-admin/network/edit.php */
     710                        do_action( 'wpmuadminedit' );
     711
     712                        if ( 'general' == $option_page ) {
     713                                check_admin_referer( 'siteoptions' );
     714                        } else {
     715                                check_admin_referer( $option_page . '-network-options' );
     716                        }
     717                        break;
     718                case 'site':
     719                default:
     720                        $context = 'site'; // fix $context variable
     721
     722                        if ( 'options' == $option_page && ! isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed.
     723                                $unregistered = true;
     724                                check_admin_referer( 'update-options' );
     725                        } else {
     726                                check_admin_referer( $option_page . '-options' );
     727                        }
     728        }
     729
     730        if ( !isset( $whitelist_options[ $option_page ] ) )
     731                wp_die( __( '<strong>ERROR</strong>: options page not found.' ) );
     732
     733        if ( 'site' === $context && 'options' == $option_page ) {
     734                if ( is_multisite() && ! is_super_admin() )
     735                        wp_die( __( 'You do not have sufficient permissions to modify unregistered settings for this site.' ) );
     736                $options = explode( ',', wp_unslash( $_POST[ 'page_options' ] ) );
     737        } else {
     738                $options = $whitelist_options[ $option_page ];
     739        }
     740
     741        if ( $options ) {
     742                // Handle translation install.
     743                if ( ! empty( $_POST['WPLANG'] ) ) { // @todo: Skip if already installed
     744                        if ( 'site' === $context && ( ! is_multisite() || is_super_admin() ) || 'network' === $context ) {
     745                                require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
     746
     747                                if ( wp_can_install_language_pack() ) {
     748                                        $language = wp_download_language_pack( $_POST['WPLANG'] );
     749                                        if ( $language ) {
     750                                                $_POST['WPLANG'] = $language;
     751                                        }
     752                                }
     753                        }
     754                }
     755
     756                /**
     757                 * Fires before options of a specific context and page are updated.
     758                 *
     759                 * @since 4.5.0
     760                 *
     761                 * @param array white list options for the current settings page
     762                 */
     763                do_action( "pre_process_{$context}_settings_{$option_page}", $options );
     764
     765                foreach ( $options as $option ) {
     766                        if ( $unregistered ) {
     767                                _deprecated_argument( 'options.php', '2.7',
     768                                        sprintf(
     769                                                /* translators: %s: the option/setting */
     770                                                __( 'The %s setting is unregistered. Unregistered settings are deprecated. See https://codex.wordpress.org/Settings_API' ),
     771                                                '<code>' . $option . '</code>'
     772                                        )
     773                                );
     774                        }
     775
     776                        $option = trim( $option );
     777                        $value = null;
     778                        if ( isset( $_POST[ $option ] ) ) {
     779                                $value = $_POST[ $option ];
     780                                if ( ! is_array( $value ) )
     781                                        $value = trim( $value );
     782                                $value = wp_unslash( $value );
     783                        }
     784                        switch ( $context ) {
     785                                case 'network':
     786                                        update_site_option( $option, $value );
     787                                        break;
     788                                case 'site':
     789                                default:
     790                                        update_option( $option, $value );
     791                        }
     792                }
     793
     794                /**
     795                 * Fires after options of a specific context and page are updated.
     796                 *
     797                 * @since 4.5.0
     798                 *
     799                 * @param array white list options for the current settings page
     800                 */
     801                do_action( "processed_{$context}_settings_{$option_page}", $options );
     802        }
     803
     804        if ( 'network' === $context ) {
     805                /**
     806                 * Fires after the network options are updated.
     807                 *
     808                 * @since MU
     809                 */
     810                do_action( 'update_wpmu_options' );
     811        }
     812
     813        /**
     814         * Handle settings errors and return to options page
     815         */
     816        // If no settings errors were registered add a general 'updated' message.
     817        if ( !count( get_settings_errors() ) )
     818                add_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');
     819
     820        if ( 'network' === $context ) {
     821                set_site_transient( 'settings_errors', get_settings_errors(), 30 );
     822        } else {
     823                set_transient( 'settings_errors', get_settings_errors(), 30 );
     824        }
     825
     826        /**
     827         * Redirect back to the settings page that was submitted
     828         */
     829        $goback = add_query_arg( 'settings-updated', 'true',  wp_get_referer() );
     830        wp_redirect( $goback );
     831        exit;
     832}
     833
     834/**
     835 *
    695836 * @global array $_wp_admin_css_colors
    696837 */
    697838function wp_color_scheme_settings() {
  • src/wp-admin/includes/plugin.php

     
    17611761 * Register a setting and its sanitization callback
    17621762 *
    17631763 * @since 2.7.0
     1764 * @since 4.5.0 Added $context parameter.
    17641765 *
    17651766 * @global array $new_whitelist_options
     1767 * @global array $new_network_whitelist_options
    17661768 *
    17671769 * @param string $option_group A settings group name. Should correspond to a whitelisted option key name.
    17681770 *      Default whitelisted option key names include "general," "discussion," and "reading," among others.
    17691771 * @param string $option_name The name of an option to sanitize and save.
    17701772 * @param callable $sanitize_callback A callback function that sanitizes the option's value.
     1773 * @param string $context A context for the function. Either 'site' or 'network'.
    17711774 */
    1772 function register_setting( $option_group, $option_name, $sanitize_callback = '' ) {
    1773         global $new_whitelist_options;
     1775function register_setting( $option_group, $option_name, $sanitize_callback = '', $context = 'site' ) {
     1776        global $new_whitelist_options, $new_network_whitelist_options;
    17741777
    1775         if ( 'misc' == $option_group ) {
    1776                 _deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) );
    1777                 $option_group = 'general';
    1778         }
     1778        if ( 'network' === $context ) {
     1779                $new_network_whitelist_options[ $option_group ][] = $option_name;
     1780        } else {
     1781                if ( 'misc' == $option_group ) {
     1782                        _deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) );
     1783                        $option_group = 'general';
     1784                }
    17791785
    1780         if ( 'privacy' == $option_group ) {
    1781                 _deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) );
    1782                 $option_group = 'reading';
     1786                if ( 'privacy' == $option_group ) {
     1787                        _deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) );
     1788                        $option_group = 'reading';
     1789                }
     1790
     1791                $new_whitelist_options[ $option_group ][] = $option_name;
    17831792        }
    17841793
    1785         $new_whitelist_options[ $option_group ][] = $option_name;
    17861794        if ( $sanitize_callback != '' )
    17871795                add_filter( "sanitize_option_{$option_name}", $sanitize_callback );
    17881796}
     
    17911799 * Unregister a setting
    17921800 *
    17931801 * @since 2.7.0
     1802 * @since 4.5.0 Added $context parameter.
    17941803 *
    17951804 * @global array $new_whitelist_options
     1805 * @global array $new_network_whitelist_options
    17961806 *
    17971807 * @param string   $option_group
    17981808 * @param string   $option_name
    17991809 * @param callable $sanitize_callback
     1810 * @param string   $context
    18001811 */
    1801 function unregister_setting( $option_group, $option_name, $sanitize_callback = '' ) {
    1802         global $new_whitelist_options;
     1812function unregister_setting( $option_group, $option_name, $sanitize_callback = '', $context = 'site' ) {
     1813        global $new_whitelist_options, $new_network_whitelist_options;
    18031814
    1804         if ( 'misc' == $option_group ) {
    1805                 _deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) );
    1806                 $option_group = 'general';
    1807         }
     1815        if ( 'network' === $context ) {
     1816                $pos = array_search( $option_name, (array) $new_network_whitelist_options[ $option_group ] );
     1817                if ( $pos !== false )
     1818                        unset( $new_network_whitelist_options[ $option_group ][ $pos ] );
     1819        } else {
     1820                if ( 'misc' == $option_group ) {
     1821                        _deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) );
     1822                        $option_group = 'general';
     1823                }
    18081824
    1809         if ( 'privacy' == $option_group ) {
    1810                 _deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) );
    1811                 $option_group = 'reading';
     1825                if ( 'privacy' == $option_group ) {
     1826                        _deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) );
     1827                        $option_group = 'reading';
     1828                }
     1829
     1830                $pos = array_search( $option_name, (array) $new_whitelist_options[ $option_group ] );
     1831                if ( $pos !== false )
     1832                        unset( $new_whitelist_options[ $option_group ][ $pos ] );
    18121833        }
    18131834
    1814         $pos = array_search( $option_name, (array) $new_whitelist_options[ $option_group ] );
    1815         if ( $pos !== false )
    1816                 unset( $new_whitelist_options[ $option_group ][ $pos ] );
    18171835        if ( $sanitize_callback != '' )
    18181836                remove_filter( "sanitize_option_{$option_name}", $sanitize_callback );
    18191837}
     
    18381856}
    18391857
    18401858/**
     1859 * Refreshes the value of the network options whitelist available via the 'whitelist_network_options' filter.
     1860 *
     1861 * @since 4.5.0
     1862 *
     1863 * @global array $new_network_whitelist_options
     1864 *
     1865 * @param array $options
     1866 * @return array
     1867 */
     1868function network_option_update_filter( $options ) {
     1869        global $new_network_whitelist_options;
     1870
     1871        if ( is_array( $new_network_whitelist_options ) )
     1872                $options = add_option_whitelist( $new_network_whitelist_options, $options );
     1873
     1874        return $options;
     1875}
     1876
     1877/**
    18411878 * Adds an array of options to the options whitelist.
    18421879 *
    18431880 * @since 2.7.0
     
    19041941 * Output nonce, action, and option_page fields for a settings page.
    19051942 *
    19061943 * @since 2.7.0
     1944 * @since 4.5.0 Added $context parameter.
    19071945 *
    19081946 * @param string $option_group A settings group name. This should match the group name used in register_setting().
     1947 * @param string $context A context for the function. Either 'site' or 'network'.
    19091948 */
    1910 function settings_fields($option_group) {
     1949function settings_fields( $option_group, $context = 'site' ) {
    19111950        echo "<input type='hidden' name='option_page' value='" . esc_attr($option_group) . "' />";
    19121951        echo '<input type="hidden" name="action" value="update" />';
    1913         wp_nonce_field("$option_group-options");
     1952        if ( 'site' === $context ) {
     1953                wp_nonce_field( "$option_group-options" );
     1954        } else {
     1955                wp_nonce_field( "$option_group-$context-options" );
     1956        }
    19141957}
    19151958
    19161959/**
  • src/wp-admin/includes/template.php

     
    13841384 * hasn't submitted data (i.e. when they first load an options page, or in admin_notices action hook)
    13851385 *
    13861386 * @since 3.0.0
     1387 * @since 4.5.0 Added $context parameter.
    13871388 *
    13881389 * @global array $wp_settings_errors Storage array of errors registered during this pageload
    13891390 *
    13901391 * @param string $setting Optional slug title of a specific setting who's errors you want.
    13911392 * @param boolean $sanitize Whether to re-sanitize the setting value before returning errors.
     1393 * @param string $context A context for the function. Either 'site' or 'network'.
    13921394 * @return array Array of settings errors
    13931395 */
    1394 function get_settings_errors( $setting = '', $sanitize = false ) {
     1396function get_settings_errors( $setting = '', $sanitize = false, $context = 'site' ) {
    13951397        global $wp_settings_errors;
    13961398
    13971399        /*
     
    14031405                sanitize_option( $setting, get_option( $setting ) );
    14041406
    14051407        // If settings were passed back from options.php then use them.
    1406         if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && get_transient( 'settings_errors' ) ) {
    1407                 $wp_settings_errors = array_merge( (array) $wp_settings_errors, get_transient( 'settings_errors' ) );
    1408                 delete_transient( 'settings_errors' );
     1408        if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] ) {
     1409                if ( 'network' === $context && get_site_transient( 'settings_errors' ) ) {
     1410                        $wp_settings_errors = array_merge( (array) $wp_settings_errors, get_site_transient( 'settings_errors' ) );
     1411                        delete_site_transient( 'settings_errors' );
     1412                } elseif ( 'site' === $context && get_transient( 'settings_errors' ) ) {
     1413                        $wp_settings_errors = array_merge( (array) $wp_settings_errors, get_transient( 'settings_errors' ) );
     1414                        delete_transient( 'settings_errors' );
     1415                }
    14091416        }
    14101417
    14111418        // Check global in case errors have been added on this pageload.
     
    14461453 * missing settings when the user arrives at the settings page.
    14471454 *
    14481455 * @since 3.0.0
     1456 * @since 4.5.0 Added $context parameter.
    14491457 *
    14501458 * @param string $setting        Optional slug title of a specific setting who's errors you want.
    14511459 * @param bool   $sanitize       Whether to re-sanitize the setting value before returning errors.
    14521460 * @param bool   $hide_on_update If set to true errors will not be shown if the settings page has already been submitted.
     1461 * @param string $context        A context for the function. Either 'site' or 'network'.
    14531462 */
    1454 function settings_errors( $setting = '', $sanitize = false, $hide_on_update = false ) {
     1463function settings_errors( $setting = '', $sanitize = false, $hide_on_update = false, $context = 'site' ) {
    14551464
    14561465        if ( $hide_on_update && ! empty( $_GET['settings-updated'] ) )
    14571466                return;
    14581467
    1459         $settings_errors = get_settings_errors( $setting, $sanitize );
     1468        $settings_errors = get_settings_errors( $setting, $sanitize, $context );
    14601469
    14611470        if ( empty( $settings_errors ) )
    14621471                return;
  • src/wp-admin/network/settings.php

     
    2222$title = __( 'Network Settings' );
    2323$parent_file = 'settings.php';
    2424
     25wp_reset_vars(array('action', 'option_page'));
     26
     27$whitelist_options = array(
     28        'general' => array(
     29                'registrationnotification', 'registration', 'add_new_users', 'menu_items',
     30                'upload_space_check_disabled', 'blog_upload_space', 'upload_filetypes', 'site_name',
     31                'first_post', 'first_page', 'first_comment', 'first_comment_url', 'first_comment_author',
     32                'welcome_email', 'welcome_user_email', 'fileupload_maxk', 'global_terms_enabled',
     33                'illegal_names', 'limited_email_domains', 'banned_email_domains', 'WPLANG', 'admin_email',
     34        ),
     35);
     36
     37/**
     38 * Filter the network options white list.
     39 *
     40 * @since 4.5.0
     41 *
     42 * @param array White list network options.
     43 */
     44$whitelist_options = apply_filters( 'whitelist_network_options', $whitelist_options );
     45
     46if ( 'update' == $action ) {
     47        function fix_empty_vars() {
     48                $checked_options = array( 'menu_items' => array(), 'registrationnotification' => 'no', 'upload_space_check_disabled' => 1, 'add_new_users' => 0 );
     49                foreach ( $checked_options as $option_name => $option_unchecked_value ) {
     50                        if ( ! isset( $_POST[$option_name] ) )
     51                                $_POST[$option_name] = $option_unchecked_value;
     52                }
     53        }
     54        add_action( 'pre_process_network_settings_general', 'fix_empty_vars' );
     55
     56        function fix_wplang_var() {
     57                // Handle translation install.
     58                if ( ! empty( $_POST['WPLANG'] ) && wp_can_install_language_pack() ) {  // @todo: Skip if already installed
     59                        $language = wp_download_language_pack( $_POST['WPLANG'] );
     60                        if ( $language ) {
     61                                $_POST['WPLANG'] = $language;
     62                        }
     63                }
     64        }
     65        add_action( 'pre_process_network_settings_general', 'fix_wplang_var' );
     66
     67        process_settings( $option_page, 'network' );
     68}
     69
    2570add_action( 'admin_head', 'network_settings_add_js' );
    2671
    2772get_current_screen()->add_help_tab( array(
     
    4489        '<p>' . __('<a href="https://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
    4590);
    4691
    47 if ( $_POST ) {
    48         /** This action is documented in wp-admin/network/edit.php */
    49         do_action( 'wpmuadminedit' );
    50 
    51         check_admin_referer( 'siteoptions' );
    52 
    53         $checked_options = array( 'menu_items' => array(), 'registrationnotification' => 'no', 'upload_space_check_disabled' => 1, 'add_new_users' => 0 );
    54         foreach ( $checked_options as $option_name => $option_unchecked_value ) {
    55                 if ( ! isset( $_POST[$option_name] ) )
    56                         $_POST[$option_name] = $option_unchecked_value;
    57         }
    58 
    59         $options = array(
    60                 'registrationnotification', 'registration', 'add_new_users', 'menu_items',
    61                 'upload_space_check_disabled', 'blog_upload_space', 'upload_filetypes', 'site_name',
    62                 'first_post', 'first_page', 'first_comment', 'first_comment_url', 'first_comment_author',
    63                 'welcome_email', 'welcome_user_email', 'fileupload_maxk', 'global_terms_enabled',
    64                 'illegal_names', 'limited_email_domains', 'banned_email_domains', 'WPLANG', 'admin_email',
    65         );
    66 
    67         // Handle translation install.
    68         if ( ! empty( $_POST['WPLANG'] ) && wp_can_install_language_pack() ) {  // @todo: Skip if already installed
    69                 $language = wp_download_language_pack( $_POST['WPLANG'] );
    70                 if ( $language ) {
    71                         $_POST['WPLANG'] = $language;
    72                 }
    73         }
    74 
    75         foreach ( $options as $option_name ) {
    76                 if ( ! isset($_POST[$option_name]) )
    77                         continue;
    78                 $value = wp_unslash( $_POST[$option_name] );
    79                 update_site_option( $option_name, $value );
    80         }
    81 
    82         /**
    83          * Fires after the network options are updated.
    84          *
    85          * @since MU
    86          */
    87         do_action( 'update_wpmu_options' );
    88 
    89         wp_redirect( add_query_arg( 'updated', 'true', network_admin_url( 'settings.php' ) ) );
    90         exit();
    91 }
    92 
    9392include( ABSPATH . 'wp-admin/admin-header.php' );
    9493
    95 if ( isset( $_GET['updated'] ) ) {
    96         ?><div id="message" class="updated notice is-dismissible"><p><?php _e( 'Options saved.' ) ?></p></div><?php
    97 }
    9894?>
    9995
    10096<div class="wrap">
    10197        <h1><?php echo esc_html( $title ); ?></h1>
    10298        <form method="post" action="settings.php" novalidate="novalidate">
    10399                <?php wp_nonce_field( 'siteoptions' ); ?>
     100                <input type="hidden" name="action" value="update" />
     101        <input type="hidden" name="option_page" value="general" />
    104102                <h2><?php _e( 'Operational Settings' ); ?></h2>
    105103                <table class="form-table">
    106104                        <tr>
  • src/wp-admin/options-head.php

     
    1515        add_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');
    1616}
    1717
    18 settings_errors();
     18if ( is_network_admin() ) {
     19        settings_errors( '', false, false, 'network' );
     20} else {
     21        settings_errors();
     22}
  • src/wp-admin/options.php

     
    147147 * If $_GET['action'] == 'update' we are saving settings sent from a settings page
    148148 */
    149149if ( 'update' == $action ) {
    150         if ( 'options' == $option_page && !isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed.
    151                 $unregistered = true;
    152                 check_admin_referer( 'update-options' );
    153         } else {
    154                 $unregistered = false;
    155                 check_admin_referer( $option_page . '-options' );
    156         }
    157 
    158         if ( !isset( $whitelist_options[ $option_page ] ) )
    159                 wp_die( __( '<strong>ERROR</strong>: options page not found.' ) );
    160 
    161         if ( 'options' == $option_page ) {
    162                 if ( is_multisite() && ! is_super_admin() )
    163                         wp_die( __( 'You do not have sufficient permissions to modify unregistered settings for this site.' ) );
    164                 $options = explode( ',', wp_unslash( $_POST[ 'page_options' ] ) );
    165         } else {
    166                 $options = $whitelist_options[ $option_page ];
    167         }
    168 
    169         if ( 'general' == $option_page ) {
    170                 // Handle custom date/time formats.
     150        function fix_datetime_vars() {
    171151                if ( !empty($_POST['date_format']) && isset($_POST['date_format_custom']) && '\c\u\s\t\o\m' == wp_unslash( $_POST['date_format'] ) )
    172152                        $_POST['date_format'] = $_POST['date_format_custom'];
    173153                if ( !empty($_POST['time_format']) && isset($_POST['time_format_custom']) && '\c\u\s\t\o\m' == wp_unslash( $_POST['time_format'] ) )
     
    178158                        $_POST['gmt_offset'] = preg_replace('/UTC\+?/', '', $_POST['gmt_offset']);
    179159                        $_POST['timezone_string'] = '';
    180160                }
     161        }
     162        add_action( 'pre_process_site_settings_general', 'fix_datetime_vars' );
    181163
     164        function fix_wplang_var() {
    182165                // Handle translation install.
    183166                if ( ! empty( $_POST['WPLANG'] ) && ( ! is_multisite() || is_super_admin() ) ) { // @todo: Skip if already installed
    184167                        require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
     
    191174                        }
    192175                }
    193176        }
     177        add_action( 'pre_process_site_settings_general', 'fix_wplang_var' );
    194178
    195         if ( $options ) {
    196                 foreach ( $options as $option ) {
    197                         if ( $unregistered ) {
    198                                 _deprecated_argument( 'options.php', '2.7',
    199                                         sprintf(
    200                                                 /* translators: %s: the option/setting */
    201                                                 __( 'The %s setting is unregistered. Unregistered settings are deprecated. See https://codex.wordpress.org/Settings_API' ),
    202                                                 '<code>' . $option . '</code>'
    203                                         )
    204                                 );
    205                         }
    206 
    207                         $option = trim( $option );
    208                         $value = null;
    209                         if ( isset( $_POST[ $option ] ) ) {
    210                                 $value = $_POST[ $option ];
    211                                 if ( ! is_array( $value ) )
    212                                         $value = trim( $value );
    213                                 $value = wp_unslash( $value );
    214                         }
    215                         update_option( $option, $value );
    216                 }
    217 
     179        function maybe_switch_language() {
    218180                // Switch translation in case WPLANG was changed.
    219181                $language = get_option( 'WPLANG' );
    220182                if ( $language ) {
     
    223185                        unload_textdomain( 'default' );
    224186                }
    225187        }
     188        add_action( 'processed_site_settings_general', 'maybe_switch_language' );
    226189
    227         /**
    228          * Handle settings errors and return to options page
    229          */
    230         // If no settings errors were registered add a general 'updated' message.
    231         if ( !count( get_settings_errors() ) )
    232                 add_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');
    233         set_transient('settings_errors', get_settings_errors(), 30);
    234 
    235         /**
    236          * Redirect back to the settings page that was submitted
    237          */
    238         $goback = add_query_arg( 'settings-updated', 'true',  wp_get_referer() );
    239         wp_redirect( $goback );
    240         exit;
     190        process_settings( $option_page, 'site' );
    241191}
    242192
    243193include( ABSPATH . 'wp-admin/admin-header.php' ); ?>