This package aims to make it easier to create settings pages for WordPress plugins. Typically, you would use the Settings API or write something custom. While the Settings API works, there is still quite a lot to set up. You still need to write the HTML for your options for example. And it gets quite complicated if you want to add tabs and tab-sections. See this comparison.
composer require jeffreyvanrossum/wp-settings
use Jeffreyvr\WPSettings\WPSettings;
$settings = new WPSettings(__('My Plugin Settings'));
$tab = $settings->add_tab(__( 'General', 'textdomain'));
$section = $tab->add_section('MailChimp');
$section->add_option('text', [
'name' => 'mailchimp_api_key',
'label' => __('API Key', 'textdomain')
]);
$settings->make();
$settings = new WPSettings(__('My Plugin Settings'));
By default, the page slug is created by sanitizing the title. You may pass a specific slug as the second parameter of the constructor.
Other methods for this class:
$settings->set_capability('manage_options');
$settings->set_option_name('my_plugin_options');
$settings->set_menu_icon('dashicons-admin-generic');
$settings->set_menu_position(5);
$settings->set_menu_parent_slug('options-general.php');
Tabs are only displayed when there is more then one.
$settings->add_tab(__( 'General', 'textdomain'));
You can call the add_section
method from an instance of Tab
. You can also call it from the WPSettings
instance. It will then be added to the last created Tab
.
$tab->add_section('Section 1');
If you want sections to be displayed as submenu-items, you can do:
$tab->add_section('Section 1', ['as_link' => true]);
Note that this only has an effect when you have more then one as_link
section.
To add an option, you either call the add_option
method from an instance of Section
. You may also call add_option
from the WPSettings
instance. The option will then be added to the last created section.
$section->add_option('text', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
]);
In addition to name
and label
, you can also pass type
. This makes it possible to set the input type to, for example, password or number.
$section->add_option('textarea', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain'),
]);
You may also set the cols
and rows
attributes.
$section->add_option('checkbox', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
]);
$section->add_option('select', [
'name' => 'option_1',
'label' => __( 'Option 1', 'textdomain' ),
'options' => [
'value_1' => 'Label 1',
'value_2' => 'Label 2'
]
]);
$section->add_option('select-multiple', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain'),
'options' => [
'value_1' => 'Label 1',
'value_2' => 'Label 2'
]
] );
$section->add_option('wp-editor', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
] );
$section->add_option('code-editor', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
] );
$section->add_option('color', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
] );
$section->add_option('media', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
] );
For an image specific, you can use:
$section->add_option('image', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
] );
For video specific, you can use:
$section->add_option('video', [
'name' => 'option_1',
'label' => __('Option 1', 'textdomain')
] );
You are able to validate an option. You may pass a callback and a feedback message. You can pass multiple validation rules.
$section->add_option('text', [
'name' => 'mailchimp_api_key',
'label' => __('API Key', 'textdomain'),
'validate' => [
[
'feedback' => __('Your API key is too short.', 'textdomain'),
'callback' => function($value) {
return strlen($value) > 35;
}
]
]
]);
You may pass a sanitization callback.
$section->add_option('text', [
'name' => 'mailchimp_api_key',
'label' => __('API Key', 'textdomain'),
'santitize' => function($value) {
return sanitize_key($value);
}
]);
By default, the options are stored as a one level array:
[
'option_1' => 'value 1',
'option_2' => 'value 2',
]
However, you can add tab and/or section levels in this structure.
$tab = $settings->add_tab(__( 'General', 'textdomain'))
->option_level();
$section = $tab->add_section('Example', ['as_link' => true])
->option_level();
Which would result in:
[
'general' => [
'example' => [
'option_1' => 'value 1',
'option_2' => 'value 2',
]
]
]
To add an custom option type, you can use the wp_settings_option_type_map
filter.
add_filter('wp_settings_option_type_map', function($options){
$options['custom'] = YourCustomOption::class;
return $options;
});
You will need to create a class for your custom option type.
use Jeffreyvr\WPSettings\Options\OptionAbstract;
class YourCustomOption extends OptionAbstract
{
public $view = 'custom-option';
public function render()
{
echo 'Your custom option HTML';
}
}
Once registered, you can then use your option type like so:
$settings->add_option('custom-option', [
'name' => 'your_option_name',
'label' => __('Your label')
]);
MIT. Please see the License File for more information.