array( 'key' => '', 'instance' => '', ), 'options' => array( 'maxColumnsGrid' => 12, 'conditionalLogic' => false, 'queriesMode' => 'desktopFirst', ), 'queries' => array( array( 'label' => 'Mobile', 'slug' => 'mobile', 'type' => 'max-width', 'value' => '781px', 'query' => '(max-width:781px)', 'icon' => 'smartphone', 'inherit' => 'all', 'editorWidth' => '', 'base' => false, 'presets' => array(), ), ), ); /** * Settings data schema. * * @since 1.0.0 */ private array $schema = array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'options' => array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'maxColumnsGrid' => array( 'type' => 'integer', ), 'conditionalLogic' => array( 'type' => 'boolean', ), 'queriesMode' => array( 'type' => 'string', ), ), ), 'queries' => array( 'type' => 'array', 'items' => array( 'type' => 'object', 'additionalProperties' => true, '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', ), 'inherit' => array( 'type' => 'string', ), 'editorWidth' => array( 'type' => 'string', ), 'base' => array( 'type' => 'boolean', ), 'presets' => array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'gap' => array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'unlink' => array( 'type' => 'boolean', ), 'v' => array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'column' => array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'v' => array( 'type' => array( 'null', 'string' ), ), 'custom' => array( 'type' => 'boolean', ), ), ), 'row' => array( 'type' => 'object', 'additionalProperties' => true, 'properties' => array( 'v' => array( 'type' => array( 'null', 'string' ), ), 'custom' => array( 'type' => 'boolean', ), ), ), ), ), ), ), ), ), ), ), ), ), ); public function __construct( string $key, TranslationManagerContract $translation, SettingsProvider $provider ) { $this->key = $key; $this->provider = $provider; $this->presetBindings = array( GapPreset::$fieldName => GapPreset::class, ); $this->provider->setDefaults( $this->default ); $this->provider->setPresetBindings( $this->presetBindings ); ( 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'][ 'conditionalLogic' ] ) ) { $settings[ 'options'][ 'conditionalLogic' ] = boolval( $settings[ 'options'][ 'conditionalLogic' ] ); } if ( isset( $settings[ 'options'][ 'queriesMode' ] ) ) { $settings[ 'options'][ 'queriesMode' ] = sanitize_text_field( $settings[ 'options'][ 'queriesMode' ] ); } if ( ! empty( $settings[ 'queries'] ) ) { $settings[ 'queries'] = array_map( function( $query ) { if ( ! isset( $query[ 'presets' ] ) ) { $query[ 'presets' ] = array(); } if ( ! isset( $query[ 'editorWidth' ] ) ) { $query[ 'editorWidth' ] = ''; } if ( ! isset( $query[ 'base' ] ) ) { $query[ 'base' ] = false; } 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' ] ), 'inherit' => sanitize_text_field( $query[ 'inherit' ] ), 'editorWidth' => sanitize_text_field( $query[ 'editorWidth' ] ), 'base' => boolval( $query[ 'base' ] ), 'presets' => $this->sanitizePresets( $query[ 'presets' ] ), ); }, $settings[ 'queries'] ); } return $settings; } /** * Sanitize the query presets. * * @since 1.0.19 * @param array $presets * @return array */ private function sanitizePresets( array $presets ) { foreach ( $presets as $fieldName => $preset ) { if ( array_key_exists( $fieldName, $this->presetBindings ) ) { $presets[ $fieldName ] = call_user_func( array( $this->presetBindings[ $fieldName ], 'sanitize' ), $preset ); } } return $presets; } /** * Get the Settings provider instance. * * @since 1.0.0 * @return SettingsProvider */ public function getProvider(): SettingsProvider { return $this->provider; } }