Страницы подменю удаляют настройки из массива параметров при сохранении
Я пишу тему и добавляю меню с несколькими страницами подменю. Это работает нормально, за исключением того, что я пытаюсь использовать только один массив для сохранения всех настроек в базе данных, и это вызывает некоторые проблемы.
Проблема в том, что при сохранении каждой страницы подменю сохраняются только значения с этой страницы в массив и удаляются все остальные значения с других страниц, которые были сохранены ранее, поэтому массив в конечном итоге содержит только значения с одной страницы в время.
Вот функции, с помощью которых я создаю страницы и регистрирую настройки.
add_action('admin_menu', 'theme_add_admin');
add_action('admin_init', 'register_theme_settings');
function theme_add_admin() {
add_menu_page( 'Theme Settings', 'Theme Settings', 'update_themes', 'themesettings', 'settings_messages_page');
add_submenu_page( 'themesettings', 'messages', 'Titles and Messages', 'update_themes', 'themesettings');
add_submenu_page( 'themesettings', 'layout', 'Layout', 'update_themes', 'settings_layout', 'settings_layout_page');
add_settings_messages();
add_settings_layout();
}
function register_theme_settings() {
register_setting( THEMENAME . '_settingsgroup', THEMENAME . '_settings', 'validate_options' );
}
В add_settings_messages() и add_settings_layout я добавляю разделы и поля:
function add_settings_layout() {
add_settings_section('layout_styles', 'Archive Layout', 'settings_layout_styles_fn', __FILE__);
add_settings_field('layout_index', 'Home Page Post Style', 'layout_home_fn', __FILE__, 'layout_styles');
add_settings_field('layout_paged', 'Paged Archives Post Style', 'layout_paged_fn', __FILE__, 'layout_styles');
}
А вот функция отображения страницы:
function settings_layout_page() {
?>
<div class="wrap">
<div class="icon32" id="icon-options-general"><br></div>
<h2>Layout</h2>
<form action="options.php" method="post">
<?php settings_fields(THEMENAME . '_settingsgroup'); ?>
<?php do_settings_sections('settings_layout'); ?>
<p class="submit">
<input name="Submit" type="submit" class="button-primary" value="<?php esc_attr_e('Save Changes'); ?>" />
</p>
</form>
</div>
<?php
}
Я, вероятно, упускаю здесь что-то очевидное, любая помощь будет признательна.
2 answers
Да, вы что-то упускаете, в вашей функции validate_options вам нужно:
- получите массив всех существующих опций.
- обновляйте только те параметры , которые обрабатываются на странице подменю.
- верните этот массив.
Итак, что-то вроде:
function validate_options($input){
//do regular validation stuff
//...
//...
//get all options
$options = get_option(THEMENAME . '_settings');
//update only the neede options
foreach ($input as $key => $value){
$options[$key] = $value;
}
//return all options
return $options;
}
"Исчезновение из массива опций" звучит так, как будто оно может быть спрятано в массиве "notoptions". Проверьте это с помощью чего-то вроде:
$notoptions = wp_cache_get( 'notoptions', 'options' );
Хуже становится хуже, может быть, прислушайтесь к add_option
крючку и посмотрите, что происходит.
do_action( 'add_option', $name, $value );