array( 'key' => '', 'instance' => '', ), 'options' => array( 'maxColumnsGrid' => 12, 'maxContentColumns' => 8, ), 'queries' => array( array( 'label' => 'Mobile', 'slug' => 'mobile', 'type' => 'max-width', 'value' => '781px', 'query' => '(max-width:781px)', 'icon' => 'smartphone', ), ), ); /** * Settings data schema. * * @since 1.0.0 */ private array $schema = array( 'type' => 'object', 'properties' => array( 'license' => array( 'type' => 'object', 'properties' => array( 'key' => array( 'type' => 'string', ), 'instance' => array( 'type' => 'string', ), ), ), 'options' => array( 'type' => 'object', 'properties' => array( 'maxColumnsGrid' => array( 'type' => 'integer', ), 'maxContentColumns' => array( 'type' => 'integer', ) ), ), 'queries' => array( 'type' => 'array', 'items' => array( 'type' => 'object', 'properties' => array( 'slug' => array( 'type' => 'string', ), 'label' => array( 'type' => 'string', ), 'query' => array( 'type' => 'string', ), 'type' => array( 'type' => 'string', ), 'value' => array( 'type' => 'string', ), 'icon' => array( 'type' => 'string', ), ), ), ), ), ); public function __construct( string $key, TranslationManagerContract $translation, SettingsProvider $provider ) { $this->key = $key; $this->provider = $provider; $this->provider->setDefaults( $this->default ); ( new SettingsPage( $translation ) ); $this->bind(); } /** * Bind the registration of the settings. * * @since 1.0.0 */ private function bind() { add_action( 'init', array( $this, 'register' ) ); add_action( 'rest_api_init', array( $this, 'register' ) ); } /** * Register the settings. * * @since 1.0.0 */ public function register() { $args = array( 'type' => 'object', 'sanitize_callback' => array( $this, 'sanitizeSettings' ), 'default' => json_decode( wp_json_encode( $this->default ), false ), 'show_in_rest' => array( 'schema' => $this->schema, ), ); register_setting( 'options', $this->key, $args ); } /** * Sanitize settings data object. * * @since 1.0.0 * @param array $settings The settings array. * @return array */ public function sanitizeSettings( array $settings ): array { if ( isset( $settings[ 'options'][ 'maxColumnsGrid' ] ) ) { $settings[ 'options'][ 'maxColumnsGrid' ] = absint( $settings[ 'options'][ 'maxColumnsGrid' ] ); } if ( isset( $settings[ 'options'][ 'maxContentColumns' ] ) ) { $settings[ 'options'][ 'maxContentColumns' ] = absint( $settings[ 'options'][ 'maxContentColumns' ] ); } if ( ! empty( $settings[ 'queries'] ) ) { $settings[ 'queries'] = array_map( function( $query ) { return array( 'label' => sanitize_text_field( $query[ 'label' ] ), 'slug' => sanitize_text_field( $query[ 'slug' ] ), 'query' => sanitize_text_field( $query[ 'query' ] ), 'icon' => sanitize_text_field( $query[ 'icon' ] ), 'value' => sanitize_text_field( $query[ 'value' ] ), 'type' => sanitize_text_field( $query[ 'type' ] ), ); }, $settings[ 'queries'] ); } return $settings; } /** * Get the Settings provider instance. * * @since 1.0.0 * @return SettingsProvider */ public function getProvider(): SettingsProvider { return $this->provider; } }