Files
2026-04-28 15:13:50 +02:00

104 lines
2.5 KiB
PHP

<?php
/**
* Manages an Array of values that can be saved in the WP options table.
*/
class WJECF_Options
{
private $options; // [ 'key' => 'value' ]
private $defaults = []; // [ 'key' => 'value' ]
private $option_name;
/**
* @param string $option_name
* @param array $defaults Default values
* @param bool $auto_reload_on_save If true, the options shall be reloaded after save
*/
public function __construct($option_name, $defaults = [], $auto_reload_on_save = true)
{
$this->option_name = $option_name;
$this->defaults = $defaults;
if ($auto_reload_on_save) {
// reload options directly after save
add_action('update_option_'.$option_name, [$this, 'invalidate'], 1, 0);
}
}
/**
* Forces reloading of the options; invalidates the current values.
*/
public function invalidate()
{
$this->options = null;
}
/**
* The option_name used in the WP options table.
*
* @return string
*/
public function get_option_name()
{
return $this->option_name;
}
/**
* Get option [ $key ]. If $key is not given, return all options.
*
* @param string $key
* @param mixed $default The default value to return (only if $key is given)
*
* @return mixed The value of the option
*/
public function get($key = null, $default = null)
{
if (!isset($this->options)) {
$this->load_options();
}
// Return all options
if (is_null($key)) {
return $this->options;
}
// Return option[$key]
return $this->options[$key] ?? $default;
}
/**
* Set option [ $key ].
*
* @param string $key
* @param mixed $value
*/
public function set($key, $value)
{
if (!isset($this->options)) {
$this->load_options();
}
$this->options[$key] = $value;
}
/**
* Save options to the database.
*/
public function save()
{
update_option($this->option_name, $this->options, false);
}
/**
* Loads the options from the database.
*/
protected function load_options()
{
$options = get_option($this->option_name);
if (!is_array($options) || empty($options)) {
$this->options = $this->defaults;
} else {
$this->options = array_merge($this->defaults, $options);
}
}
}