+
+/**
+ * Register default settings available in WordPress.
+ *
+ * The settings registered here are primarily useful for the REST API, so this
+ * does not encompass all settings available in WordPress.
+ *
+ * @since 4.7.0
+ */
+function register_initial_settings() {
+ register_setting( 'general', 'blogname', array(
+ 'show_in_rest' => array(
+ 'name' => 'title',
+ ),
+ 'type' => 'string',
+ 'description' => __( 'Site title.' ),
+ ) );
+
+ register_setting( 'general', 'blogdescription', array(
+ 'show_in_rest' => array(
+ 'name' => 'description',
+ ),
+ 'type' => 'string',
+ 'description' => __( 'Site tagline.' ),
+ ) );
+
+ if ( ! is_multisite() ) {
+ register_setting( 'general', 'siteurl', array(
+ 'show_in_rest' => array(
+ 'name' => 'url',
+ 'schema' => array(
+ 'format' => 'uri',
+ ),
+ ),
+ 'type' => 'string',
+ 'description' => __( 'Site URL.' ),
+ ) );
+ }
+
+ if ( ! is_multisite() ) {
+ register_setting( 'general', 'admin_email', array(
+ 'show_in_rest' => array(
+ 'name' => 'email',
+ 'schema' => array(
+ 'format' => 'email',
+ ),
+ ),
+ 'type' => 'string',
+ 'description' => __( 'This address is used for admin purposes, like new user notification.' ),
+ ) );
+ }
+
+ register_setting( 'general', 'timezone_string', array(
+ 'show_in_rest' => array(
+ 'name' => 'timezone',
+ ),
+ 'type' => 'string',
+ 'description' => __( 'A city in the same timezone as you.' ),
+ ) );
+
+ register_setting( 'general', 'date_format', array(
+ 'show_in_rest' => true,
+ 'type' => 'string',
+ 'description' => __( 'A date format for all date strings.' ),
+ ) );
+
+ register_setting( 'general', 'time_format', array(
+ 'show_in_rest' => true,
+ 'type' => 'string',
+ 'description' => __( 'A time format for all time strings.' ),
+ ) );
+
+ register_setting( 'general', 'start_of_week', array(
+ 'show_in_rest' => true,
+ 'type' => 'integer',
+ 'description' => __( 'A day number of the week that the week should start on.' ),
+ ) );
+
+ register_setting( 'general', 'WPLANG', array(
+ 'show_in_rest' => array(
+ 'name' => 'language',
+ ),
+ 'type' => 'string',
+ 'description' => __( 'WordPress locale code.' ),
+ 'default' => 'en_US',
+ ) );
+
+ register_setting( 'writing', 'use_smilies', array(
+ 'show_in_rest' => true,
+ 'type' => 'boolean',
+ 'description' => __( 'Convert emoticons like :-) and :-P to graphics on display.' ),
+ 'default' => true,
+ ) );
+
+ register_setting( 'writing', 'default_category', array(
+ 'show_in_rest' => true,
+ 'type' => 'integer',
+ 'description' => __( 'Default post category.' ),
+ ) );
+
+ register_setting( 'writing', 'default_post_format', array(
+ 'show_in_rest' => true,
+ 'type' => 'string',
+ 'description' => __( 'Default post format.' ),
+ ) );
+
+ register_setting( 'reading', 'posts_per_page', array(
+ 'show_in_rest' => true,
+ 'type' => 'integer',
+ 'description' => __( 'Blog pages show at most.' ),
+ 'default' => 10,
+ ) );
+
+ register_setting( 'discussion', 'default_ping_status', array(
+ 'show_in_rest' => array(
+ 'schema' => array(
+ 'enum' => array( 'open', 'closed' ),
+ ),
+ ),
+ 'type' => 'string',
+ 'description' => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new articles.' ),
+ ) );
+
+ register_setting( 'discussion', 'default_comment_status', array(
+ 'show_in_rest' => array(
+ 'schema' => array(
+ 'enum' => array( 'open', 'closed' ),
+ ),
+ ),
+ 'type' => 'string',
+ 'description' => __( 'Allow people to post comments on new articles.' ),
+ ) );
+
+}
+
+/**
+ * Register a setting and its data.
+ *
+ * @since 2.7.0
+ * @since 4.7.0 `$args` can be passed to set flags on the setting, similar to `register_meta()`.
+ *
+ * @global array $new_whitelist_options
+ * @global array $wp_registered_settings
+ *
+ * @param string $option_group A settings group name. Should correspond to a whitelisted option key name.
+ * Default whitelisted option key names include "general," "discussion," and "reading," among others.
+ * @param string $option_name The name of an option to sanitize and save.
+ * @param array $args {
+ * Data used to describe the setting when registered.
+ *
+ * @type string $type The type of data associated with this setting.
+ * @type string $description A description of the data attached to this setting.
+ * @type callable $sanitize_callback A callback function that sanitizes the option's value.
+ * @type bool $show_in_rest Whether data associated with this setting should be included in the REST API.
+ * @type mixed $default Default value when calling `get_option()`.
+ * }
+ */
+function register_setting( $option_group, $option_name, $args = array() ) {
+ global $new_whitelist_options, $wp_registered_settings;
+
+ $defaults = array(
+ 'type' => 'string',
+ 'group' => $option_group,
+ 'description' => '',
+ 'sanitize_callback' => null,
+ 'show_in_rest' => false,
+ );
+
+ // Back-compat: old sanitize callback is added.
+ if ( is_callable( $args ) ) {
+ $args = array(
+ 'sanitize_callback' => $args,
+ );
+ }
+
+ /**
+ * Filters the registration arguments when registering a setting.
+ *
+ * @since 4.7.0
+ *
+ * @param array $args Array of setting registration arguments.
+ * @param array $defaults Array of default arguments.
+ * @param string $option_group Setting group.
+ * @param string $option_name Setting name.
+ */
+ $args = apply_filters( 'register_setting_args', $args, $defaults, $option_group, $option_name );
+ $args = wp_parse_args( $args, $defaults );
+
+ if ( ! is_array( $wp_registered_settings ) ) {
+ $wp_registered_settings = array();
+ }
+
+ if ( 'misc' == $option_group ) {
+ _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) );
+ $option_group = 'general';
+ }
+
+ if ( 'privacy' == $option_group ) {
+ _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) );
+ $option_group = 'reading';
+ }
+
+ $new_whitelist_options[ $option_group ][] = $option_name;
+ if ( ! empty( $args['sanitize_callback'] ) ) {
+ add_filter( "sanitize_option_{$option_name}", $args['sanitize_callback'] );
+ }
+ if ( array_key_exists( 'default', $args ) ) {
+ add_filter( "default_option_{$option_name}", 'filter_default_option', 10, 3 );
+ }
+
+ $wp_registered_settings[ $option_name ] = $args;
+}
+
+/**
+ * Unregister a setting.
+ *
+ * @since 2.7.0
+ * @since 4.7.0 `$sanitize_callback` was deprecated. The callback from `register_setting()` is now used instead.
+ *
+ * @global array $new_whitelist_options
+ *
+ * @param string $option_group The settings group name used during registration.
+ * @param string $option_name The name of the option to unregister.
+ * @param callable $deprecated Deprecated.
+ */
+function unregister_setting( $option_group, $option_name, $deprecated = '' ) {
+ global $new_whitelist_options, $wp_registered_settings;
+
+ if ( 'misc' == $option_group ) {
+ _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'misc' ) );
+ $option_group = 'general';
+ }
+
+ if ( 'privacy' == $option_group ) {
+ _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( 'The "%s" options group has been removed. Use another settings group.' ), 'privacy' ) );
+ $option_group = 'reading';
+ }
+
+ $pos = array_search( $option_name, (array) $new_whitelist_options[ $option_group ] );
+ if ( $pos !== false ) {
+ unset( $new_whitelist_options[ $option_group ][ $pos ] );
+ }
+ if ( '' !== $deprecated ) {
+ _deprecated_argument( __FUNCTION__, '4.7.0', __( '$sanitize_callback is deprecated. The callback from register_setting() is used instead.' ) );
+ remove_filter( "sanitize_option_{$option_name}", $deprecated );
+ }
+
+ if ( isset( $wp_registered_settings[ $option_name ] ) ) {
+ // Remove the sanitize callback if one was set during registration.
+ if ( ! empty( $wp_registered_settings[ $option_name ]['sanitize_callback'] ) ) {
+ remove_filter( "sanitize_option_{$option_name}", $wp_registered_settings[ $option_name ]['sanitize_callback'] );
+ }
+
+ unset( $wp_registered_settings[ $option_name ] );
+ }
+}
+
+/**
+ * Retrieves an array of registered settings.
+ *
+ * @since 4.7.0
+ *
+ * @return array List of registered settings, keyed by option name.
+ */
+function get_registered_settings() {
+ global $wp_registered_settings;
+
+ if ( ! is_array( $wp_registered_settings ) ) {
+ return array();
+ }
+
+ return $wp_registered_settings;
+}
+
+/**
+ * Filter the default value for the option.
+ *
+ * For settings which register a default setting in `register_setting()`, this
+ * function is added as a filter to `default_option_{$option}`.
+ *
+ * @since 4.7.0
+ *
+ * @param mixed $default Existing default value to return.
+ * @param string $option Option name.
+ * @param bool $passed_default Was `get_option()` passed a default value?
+ * @return mixed Filtered default value.
+ */
+function filter_default_option( $default, $option, $passed_default ) {
+ if ( $passed_default ) {
+ return $default;
+ }
+
+ $registered = get_registered_settings();
+ if ( empty( $registered[ $option ] ) ) {
+ return $default;
+ }
+
+ return $registered[ $option ]['default'];
+}