[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Options Management Administration Screen. 4 * 5 * If accessed directly in a browser this page shows a list of all saved options 6 * along with editable fields for their values. Serialized data is not supported 7 * and there is no way to remove options via this page. It is not linked to from 8 * anywhere else in the admin. 9 * 10 * This file is also the target of the forms in core and custom options pages 11 * that use the Settings API. In this case it saves the new option values 12 * and returns the user to their page of origin. 13 * 14 * @package WordPress 15 * @subpackage Administration 16 */ 17 18 /** WordPress Administration Bootstrap */ 19 require_once __DIR__ . '/admin.php'; 20 21 $title = __( 'Settings' ); 22 $this_file = 'options.php'; 23 $parent_file = 'options-general.php'; 24 25 wp_reset_vars( array( 'action', 'option_page' ) ); 26 27 $capability = 'manage_options'; 28 29 // This is for back compat and will eventually be removed. 30 if ( empty( $option_page ) ) { 31 $option_page = 'options'; 32 } else { 33 34 /** 35 * Filters the capability required when using the Settings API. 36 * 37 * By default, the options groups for all registered settings require the manage_options capability. 38 * This filter is required to change the capability required for a certain options page. 39 * 40 * @since 3.2.0 41 * 42 * @param string $capability The capability used for the page, which is manage_options by default. 43 */ 44 $capability = apply_filters( "option_page_capability_{$option_page}", $capability ); 45 } 46 47 if ( ! current_user_can( $capability ) ) { 48 wp_die( 49 '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . 50 '<p>' . __( 'Sorry, you are not allowed to manage options for this site.' ) . '</p>', 51 403 52 ); 53 } 54 55 // Handle admin email change requests. 56 if ( ! empty( $_GET['adminhash'] ) ) { 57 $new_admin_details = get_option( 'adminhash' ); 58 $redirect = 'options-general.php?updated=false'; 59 if ( is_array( $new_admin_details ) && hash_equals( $new_admin_details['hash'], $_GET['adminhash'] ) && ! empty( $new_admin_details['newemail'] ) ) { 60 update_option( 'admin_email', $new_admin_details['newemail'] ); 61 delete_option( 'adminhash' ); 62 delete_option( 'new_admin_email' ); 63 $redirect = 'options-general.php?updated=true'; 64 } 65 wp_redirect( admin_url( $redirect ) ); 66 exit; 67 } elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' === $_GET['dismiss'] ) { 68 check_admin_referer( 'dismiss-' . get_current_blog_id() . '-new_admin_email' ); 69 delete_option( 'adminhash' ); 70 delete_option( 'new_admin_email' ); 71 wp_redirect( admin_url( 'options-general.php?updated=true' ) ); 72 exit; 73 } 74 75 if ( is_multisite() && ! current_user_can( 'manage_network_options' ) && 'update' != $action ) { 76 wp_die( 77 '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . 78 '<p>' . __( 'Sorry, you are not allowed to delete these items.' ) . '</p>', 79 403 80 ); 81 } 82 83 $allowed_options = array( 84 'general' => array( 85 'blogname', 86 'blogdescription', 87 'gmt_offset', 88 'date_format', 89 'time_format', 90 'start_of_week', 91 'timezone_string', 92 'WPLANG', 93 'new_admin_email', 94 ), 95 'discussion' => array( 96 'default_pingback_flag', 97 'default_ping_status', 98 'default_comment_status', 99 'comments_notify', 100 'moderation_notify', 101 'comment_moderation', 102 'require_name_email', 103 'comment_previously_approved', 104 'comment_max_links', 105 'moderation_keys', 106 'disallowed_keys', 107 'show_avatars', 108 'avatar_rating', 109 'avatar_default', 110 'close_comments_for_old_posts', 111 'close_comments_days_old', 112 'thread_comments', 113 'thread_comments_depth', 114 'page_comments', 115 'comments_per_page', 116 'default_comments_page', 117 'comment_order', 118 'comment_registration', 119 'show_comments_cookies_opt_in', 120 ), 121 'media' => array( 122 'thumbnail_size_w', 123 'thumbnail_size_h', 124 'thumbnail_crop', 125 'medium_size_w', 126 'medium_size_h', 127 'large_size_w', 128 'large_size_h', 129 'image_default_size', 130 'image_default_align', 131 'image_default_link_type', 132 ), 133 'reading' => array( 134 'posts_per_page', 135 'posts_per_rss', 136 'rss_use_excerpt', 137 'show_on_front', 138 'page_on_front', 139 'page_for_posts', 140 'blog_public', 141 ), 142 'writing' => array( 143 'default_category', 144 'default_email_category', 145 'default_link_category', 146 'default_post_format', 147 ), 148 ); 149 $allowed_options['misc'] = array(); 150 $allowed_options['options'] = array(); 151 $allowed_options['privacy'] = array(); 152 153 $mail_options = array( 'mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass' ); 154 155 if ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true ) ) { 156 $allowed_options['reading'][] = 'blog_charset'; 157 } 158 159 if ( get_site_option( 'initial_db_version' ) < 32453 ) { 160 $allowed_options['writing'][] = 'use_smilies'; 161 $allowed_options['writing'][] = 'use_balanceTags'; 162 } 163 164 if ( ! is_multisite() ) { 165 if ( ! defined( 'WP_SITEURL' ) ) { 166 $allowed_options['general'][] = 'siteurl'; 167 } 168 if ( ! defined( 'WP_HOME' ) ) { 169 $allowed_options['general'][] = 'home'; 170 } 171 172 $allowed_options['general'][] = 'users_can_register'; 173 $allowed_options['general'][] = 'default_role'; 174 175 $allowed_options['writing'] = array_merge( $allowed_options['writing'], $mail_options ); 176 $allowed_options['writing'][] = 'ping_sites'; 177 178 $allowed_options['media'][] = 'uploads_use_yearmonth_folders'; 179 180 /* 181 * If upload_url_path is not the default (empty), 182 * or upload_path is not the default ('wp-content/uploads' or empty), 183 * they can be edited, otherwise they're locked. 184 */ 185 if ( get_option( 'upload_url_path' ) || ( get_option( 'upload_path' ) != 'wp-content/uploads' && get_option( 'upload_path' ) ) ) { 186 $allowed_options['media'][] = 'upload_path'; 187 $allowed_options['media'][] = 'upload_url_path'; 188 } 189 } else { 190 /** 191 * Filters whether the post-by-email functionality is enabled. 192 * 193 * @since 3.0.0 194 * 195 * @param bool $enabled Whether post-by-email configuration is enabled. Default true. 196 */ 197 if ( apply_filters( 'enable_post_by_email_configuration', true ) ) { 198 $allowed_options['writing'] = array_merge( $allowed_options['writing'], $mail_options ); 199 } 200 } 201 202 /** 203 * Filters the allowed options list. 204 * 205 * @since 2.7.0 206 * @deprecated 5.5.0 Use {@see 'allowed_options'} instead. 207 * 208 * @param array $allowed_options The allowed options list. 209 */ 210 $allowed_options = apply_filters_deprecated( 211 'whitelist_options', 212 array( $allowed_options ), 213 '5.5.0', 214 'apply_filters_deprecated', 215 __( 'Please consider writing more inclusive code.' ) 216 ); 217 218 /** 219 * Filters the allowed options list. 220 * 221 * @since 5.5.0 222 * 223 * @param array $allowed_options The allowed options list. 224 */ 225 $allowed_options = apply_filters( 'allowed_options', $allowed_options ); 226 227 if ( 'update' === $action ) { // We are saving settings sent from a settings page. 228 if ( 'options' === $option_page && ! isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed. 229 $unregistered = true; 230 check_admin_referer( 'update-options' ); 231 } else { 232 $unregistered = false; 233 check_admin_referer( $option_page . '-options' ); 234 } 235 236 if ( ! isset( $allowed_options[ $option_page ] ) ) { 237 wp_die( 238 sprintf( 239 /* translators: %s: The options page name. */ 240 __( '<strong>Error</strong>: Options page %s not found in the allowed options list.' ), 241 '<code>' . esc_html( $option_page ) . '</code>' 242 ) 243 ); 244 } 245 246 if ( 'options' === $option_page ) { 247 if ( is_multisite() && ! current_user_can( 'manage_network_options' ) ) { 248 wp_die( __( 'Sorry, you are not allowed to modify unregistered settings for this site.' ) ); 249 } 250 $options = explode( ',', wp_unslash( $_POST['page_options'] ) ); 251 } else { 252 $options = $allowed_options[ $option_page ]; 253 } 254 255 if ( 'general' === $option_page ) { 256 // Handle custom date/time formats. 257 if ( ! empty( $_POST['date_format'] ) && isset( $_POST['date_format_custom'] ) 258 && '\c\u\s\t\o\m' === wp_unslash( $_POST['date_format'] ) 259 ) { 260 $_POST['date_format'] = $_POST['date_format_custom']; 261 } 262 263 if ( ! empty( $_POST['time_format'] ) && isset( $_POST['time_format_custom'] ) 264 && '\c\u\s\t\o\m' === wp_unslash( $_POST['time_format'] ) 265 ) { 266 $_POST['time_format'] = $_POST['time_format_custom']; 267 } 268 269 // Map UTC+- timezones to gmt_offsets and set timezone_string to empty. 270 if ( ! empty( $_POST['timezone_string'] ) && preg_match( '/^UTC[+-]/', $_POST['timezone_string'] ) ) { 271 $_POST['gmt_offset'] = $_POST['timezone_string']; 272 $_POST['gmt_offset'] = preg_replace( '/UTC\+?/', '', $_POST['gmt_offset'] ); 273 $_POST['timezone_string'] = ''; 274 } 275 276 // Handle translation installation. 277 if ( ! empty( $_POST['WPLANG'] ) && current_user_can( 'install_languages' ) ) { 278 require_once ABSPATH . 'wp-admin/includes/translation-install.php'; 279 280 if ( wp_can_install_language_pack() ) { 281 $language = wp_download_language_pack( $_POST['WPLANG'] ); 282 if ( $language ) { 283 $_POST['WPLANG'] = $language; 284 } 285 } 286 } 287 } 288 289 if ( $options ) { 290 $user_language_old = get_user_locale(); 291 292 foreach ( $options as $option ) { 293 if ( $unregistered ) { 294 _deprecated_argument( 295 'options.php', 296 '2.7.0', 297 sprintf( 298 /* translators: %s: The option/setting. */ 299 __( 'The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/' ), 300 '<code>' . esc_html( $option ) . '</code>' 301 ) 302 ); 303 } 304 305 $option = trim( $option ); 306 $value = null; 307 if ( isset( $_POST[ $option ] ) ) { 308 $value = $_POST[ $option ]; 309 if ( ! is_array( $value ) ) { 310 $value = trim( $value ); 311 } 312 $value = wp_unslash( $value ); 313 } 314 update_option( $option, $value ); 315 } 316 317 /* 318 * Switch translation in case WPLANG was changed. 319 * The global $locale is used in get_locale() which is 320 * used as a fallback in get_user_locale(). 321 */ 322 unset( $GLOBALS['locale'] ); 323 $user_language_new = get_user_locale(); 324 if ( $user_language_old !== $user_language_new ) { 325 load_default_textdomain( $user_language_new ); 326 } 327 } 328 329 /* 330 * Handle settings errors and return to options page. 331 */ 332 333 // If no settings errors were registered add a general 'updated' message. 334 if ( ! count( get_settings_errors() ) ) { 335 add_settings_error( 'general', 'settings_updated', __( 'Settings saved.' ), 'success' ); 336 } 337 set_transient( 'settings_errors', get_settings_errors(), 30 ); 338 339 // Redirect back to the settings page that was submitted. 340 $goback = add_query_arg( 'settings-updated', 'true', wp_get_referer() ); 341 wp_redirect( $goback ); 342 exit; 343 } 344 345 require_once ABSPATH . 'wp-admin/admin-header.php'; ?> 346 347 <div class="wrap"> 348 <h1><?php esc_html_e( 'All Settings' ); ?></h1> 349 350 <div class="notice notice-warning"> 351 <p><strong><?php _e( 'Warning:' ); ?></strong> <?php _e( 'This page allows direct access to your site settings. You can break things here. Please be cautious!' ); ?></p> 352 </div> 353 354 <form name="form" action="options.php" method="post" id="all-options"> 355 <?php wp_nonce_field( 'options-options' ); ?> 356 <input type="hidden" name="action" value="update" /> 357 <input type="hidden" name="option_page" value="options" /> 358 <table class="form-table" role="presentation"> 359 <?php 360 $options = $wpdb->get_results( "SELECT * FROM $wpdb->options ORDER BY option_name" ); 361 362 foreach ( (array) $options as $option ) : 363 $disabled = false; 364 365 if ( '' === $option->option_name ) { 366 continue; 367 } 368 369 if ( is_serialized( $option->option_value ) ) { 370 if ( is_serialized_string( $option->option_value ) ) { 371 // This is a serialized string, so we should display it. 372 $value = maybe_unserialize( $option->option_value ); 373 $options_to_update[] = $option->option_name; 374 $class = 'all-options'; 375 } else { 376 $value = 'SERIALIZED DATA'; 377 $disabled = true; 378 $class = 'all-options disabled'; 379 } 380 } else { 381 $value = $option->option_value; 382 $options_to_update[] = $option->option_name; 383 $class = 'all-options'; 384 } 385 386 $name = esc_attr( $option->option_name ); 387 ?> 388 <tr> 389 <th scope="row"><label for="<?php echo $name; ?>"><?php echo esc_html( $option->option_name ); ?></label></th> 390 <td> 391 <?php if ( strpos( $value, "\n" ) !== false ) : ?> 392 <textarea class="<?php echo $class; ?>" name="<?php echo $name; ?>" id="<?php echo $name; ?>" cols="30" rows="5"><?php echo esc_textarea( $value ); ?></textarea> 393 <?php else : ?> 394 <input class="regular-text <?php echo $class; ?>" type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $value ); ?>"<?php disabled( $disabled, true ); ?> /> 395 <?php endif ?></td> 396 </tr> 397 <?php endforeach; ?> 398 </table> 399 400 <input type="hidden" name="page_options" value="<?php echo esc_attr( implode( ',', $options_to_update ) ); ?>" /> 401 402 <?php submit_button( __( 'Save Changes' ), 'primary', 'Update' ); ?> 403 404 </form> 405 </div> 406 407 <?php 408 require_once ABSPATH . 'wp-admin/admin-footer.php';
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Jan 22 01:00:03 2021 | Cross-referenced by PHPXref 0.7.1 |