fields = $fields; add_action('init', [$this, 'registerOptions'], 10); add_action('admin_init', [$this, 'registerSettings']); } /** * Register options */ public function registerOptions(): void { $meta = new MetaManager(null, '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'] ?? $meta->getDefaultValue($field['type'])); } // // // 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); // Use MetaForm to render if available if (class_exists('\JVBase\meta\MetaForm')) { $form = new \JVBase\meta\MetaForm(); echo $form->renderField($name, $field, $value); } } 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' }; } private function getSanitizeCallback(array $field): callable { return function($value) use ($field) { $manager = new \JVBase\meta\MetaManager(); return $manager->sanitizeField($value, $field); }; } }