fields = $fields; add_action('init', [$this, 'registerOptions'], 10); add_action('admin_init', [$this, 'registerSettings']); } /** * Register options */ public function registerOptions(): void { $meta = Meta::forOptions('options'); foreach ($this->fields as $field_name => $field) { if (in_array($field_name, ['common', 'fields'])) { continue; } // Register the option $option_name = BASE . $field_name; // Add default value if not exists if (get_option($option_name) === false) { add_option($option_name, $field['default'] ??''); } // // // Register for REST API // register_setting('jvb_options', $option_name, [ // 'type' => $this->getFieldType($field['type']), // 'description' => $field['description'] ?? '', // 'sanitize_callback' => $meta->getSanitizeCallback($field), // 'show_in_rest' => $field['show_in_rest'] ?? true, // 'default' => $field['default'] ?? '', // ]); } } /** * Register settings for admin */ public function registerSettings(): void { // Register settings page add_settings_section( 'jvb_options_section', __('Site Options', 'jvb'), null, 'jvb_options' ); foreach ($this->fields as $field_name => $field) { if (in_array($field_name, ['common', 'fields'])) { continue; } add_settings_field( BASE . $field_name, $field['label'] ?? $field_name, [$this, 'renderField'], 'jvb_options', 'jvb_options_section', ['field' => $field, 'name' => $field_name] ); } } /** * Render field in admin */ public function renderField(array $args): void { $field = $args['field']; $name = $args['name']; $value = get_option(BASE . $name); echo Form::render($name, $value, $field); } private function getFieldType(string $type): string { return match ($type) { 'text', 'textarea', 'url', 'email' => 'string', 'number' => 'number', 'true_false', 'checkbox' => 'boolean', 'location', 'group', 'repeater' => 'array', default => 'string' }; } }