Вопрос или проблема
Добавление меню опций, позволяющего сохранять несколько наборов настроек.
Существует несколько хороших примеров и учебников о том, как добавить меню опций в плагин. (Многие из них кажутся запутанно старыми, но это уже другая история, я предполагаю, что вещи, касающиеся меню опций, которые были актуальны 15 лет назад, все еще применимы.)
Тем не менее, пользователи моего плагина должны иметь возможность создавать и сохранять несколько наборов опций, желательно произвольное количество наборов. Для большинства пользователей одного набора опций будет достаточно. Но определенно будут такие пользователи, которым нужно больше.
В моем плагине будет около 20 опций для настройки (пока что просто жестко закодированных в начале файла плагина). Мне интересно, каков будет лучший подход к “умножению” этого набора из 20 опций, чтобы пользователи могли иметь второй набор из этих же 20 опций, который они могли бы настраивать, третий набор и так далее. Не нужно дублировать значения, просто позволить добавлять новый набор значений по мере необходимости. Например, будет кнопка “Создать новый набор опций” или что-то подобное, и, вероятно, лучший способ – представить пользователю новую вкладку/страницу опций для них. Желательно, чтобы для каждого набора была настройка, позволяющая пометить его как активный или неактивный, чтобы мой плагин обрабатывал только активные наборы. Надеюсь, все это имеет смысл.
Мне интересно, может ли кто-то указать мне правильное направление и, возможно, дать советы или идеи по решению этой проблемы? Решение должно быть бесплатным, я уже подумывал о том, чтобы начать эксперименты только с API настроек WordPress или Redux, но я думаю, что важно выбрать метод, который особенно подходит для этой необходимости “динамического добавления новых подменю” на лету, если это вообще возможно.
Мне очень хотелось бы избежать предопределения и, таким образом, ограничения количества возможных наборов опций, но если мне придется пойти по этому пути, я, вероятно, предопределю это на что-то вроде 10 наборов максимум. Вопрос все еще остается, какая техника будет хорошим выбором для обработки этих наборов опций, в отличие от обычного одного набора.
(Я почти новичок в WordPress и PHP, также не очень хорош в ООП, так что предпочел бы этого избежать. Времени тоже немного, этот плагин является лишь побочным продуктом более крупного проекта некоммерческой организации, над которым я работаю.)
Ответ или решение
Для создания плагина WordPress с возможностью управления несколькими наборами опций, я предлагаю использовать API настроек WordPress (WordPress Settings API) в сочетании с функциональностью для динамического добавления новых наборов опций. Данный подход позволит вам избежать предустановленных значений и даст пользователям возможность создавать произвольное количество наборов опций.
Шаг 1: Подготовка плагина
Сначала создайте структуру вашего плагина. В каталоге вашего плагина создайте основной файл, например, my-plugin.php
, и добавьте следующий код:
<?php
/*
Plugin Name: Мой Плагин Опций
Description: Плагин для управления несколькими наборами опций.
Version: 1.0
*/
add_action('admin_menu', 'my_plugin_menu');
function my_plugin_menu() {
add_menu_page('Опции плагина', 'Опции плагина', 'manage_options', 'my-plugin-options', 'my_plugin_options_page');
add_submenu_page('my-plugin-options', 'Настройки', 'Настройки', 'manage_options', 'my-plugin-settings', 'my_plugin_settings_page');
}
function my_plugin_options_page() {
if (isset($_POST['save_options'])) {
$current_set = $_POST['current_set'];
update_option('my_plugin_options_' . $current_set, $_POST['options']);
}
$option_sets = get_option('my_plugin_option_sets', []);
?>
<div class="wrap">
<h1>Управление наборами опций</h1>
<form method="post">
<select name="current_set">
<?php foreach ($option_sets as $set) : ?>
<option value="<?php echo esc_attr($set); ?>"><?php echo esc_html($set); ?></option>
<?php endforeach; ?>
</select>
<button type="submit" name="load">Загрузить набор</button>
</form>
<form method="post">
<h2>Настройки опций</h2>
<!-- Здесь вы можете добавить ваши 20 опций для настройки -->
<textarea name="options"><?php echo esc_textarea(get_option('my_plugin_options_' . $_POST['current_set'])); ?></textarea>
<button type="submit" name="save_options">Сохранить</button>
</form>
<form method="post">
<h2>Создать новый набор опций</h2>
<input type="text" name="new_set_name" placeholder="Имя нового набора"/>
<button type="submit" name="create_set">Создать набор</button>
</form>
</div>
<?php
}
function my_plugin_settings_page() {
// Логика для страницы настроек
}
add_action('init', 'handle_option_set_creation');
function handle_option_set_creation() {
if (isset($_POST['create_set'])) {
$new_set_name = sanitize_text_field($_POST['new_set_name']);
$option_sets = get_option('my_plugin_option_sets', []);
if (!in_array($new_set_name, $option_sets)) {
$option_sets[] = $new_set_name;
update_option('my_plugin_option_sets', $option_sets);
}
}
}
?>
Шаг 2: Разработка логики управления наборами опций
В этом примере предусмотрено следующее:
- Основное меню плагина с двумя подменю: управление наборами опций и настройка.
- Возможность создания нового набора опций через простую форму.
- Загрузка и сохранение существующих наборов опций.
- Использование базы данных WordPress для хранения наборов и их опций.
Шаг 3: Обработка сохранённых данных и активация набора опций
Вы можете полностью настроить, какие опции будут доступны для редактирования. Каждую из опций вы можете сохранить в массиве или в строковом формате. Наборы опций будут храниться по ключу, формируемому из имени набора.
Рекомендации
- Безопасность: Убедитесь, что вы используете функции
sanitize_text_field()
и другие валидации для защиты данных от неверного ввода. - Интерфейс: Для улучшения пользовательского интерфейса рассмотрите использование JavaScript/jQuery для динамического добавления полей и облегчения навигации между наборами.
- Документация: Используйте доступные ресурсы WordPress Codex для получения дополнительной информации об API настроек и безопасности.
Этот код послужит хорошей основой для вашего плагина. Вы обязательно сможете расширить его, добавив необходимую функциональность согласно вашим требованиям.