<?php
|
namespace JVBase\registry;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
use JVBase\meta\Form;
|
use JVBase\meta\Meta;
|
|
class OptionsRegistry
|
{
|
private array $fields;
|
|
public function __construct(array $fields)
|
{
|
$this->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'
|
};
|
}
|
}
|