namespace, '/settings', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), 'permission_callback' => array( $this, 'permission_manage' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_items' ), 'permission_callback' => array( $this, 'permission_manage' ), 'args' => $this->get_update_args(), ), ) ); } /** * Returns every setting. * * @param WP_REST_Request $request Request object. * @return WP_REST_Response */ public function get_items( $request ) { unset( $request ); return rest_ensure_response( $this->prepare( Settings::all() ) ); } /** * Saves the settings present in the request body. * * @param WP_REST_Request $request Request object. * @return WP_REST_Response */ public function update_items( $request ) { $input = array(); foreach ( array_keys( Settings::schema() ) as $key ) { if ( $request->has_param( $key ) ) { $input[ $key ] = $request->get_param( $key ); } } return rest_ensure_response( $this->prepare( Settings::update( $input ) ) ); } /** * Lets add-ons add what the settings screen needs on top of the stored values. * * @param array $settings Stored settings. * @return array */ private function prepare( array $settings ) { /** * Filters the settings sent to the settings screen. * * @since 1.0.0 * * @param array $settings Stored settings. */ return apply_filters( 'spacebay_settings_response', $settings ); } /** * Builds REST argument definitions from the settings schema. * * @return array */ private function get_update_args() { $args = array(); foreach ( Settings::schema() as $key => $field ) { $arg = array( 'required' => false, 'type' => 'string', ); if ( 'bool' === $field['type'] ) { $arg['type'] = 'boolean'; } elseif ( 'int' === $field['type'] ) { $arg['type'] = 'integer'; $arg['minimum'] = $field['min']; $arg['maximum'] = $field['max']; } elseif ( 'enum' === $field['type'] ) { $arg['enum'] = $field['options']; } elseif ( 'image' === $field['type'] ) { $arg['type'] = 'integer'; $arg['minimum'] = 0; } elseif ( 'array' === $field['type'] || in_array( $field['type'], array( 'levels', 'badges' ), true ) ) { $arg['type'] = 'array'; $arg['maxItems'] = 60; $arg['items'] = array( 'type' => 'object' ); } elseif ( 'color' === $field['type'] ) { $arg['pattern'] = '^#([A-Fa-f0-9]{3}){1,2}$'; } $args[ $key ] = $arg; } return $args; } }