bioxd
  • 0
Новичок

Страницы подменю удаляют настройки из массива опций при сохранении

  • 0

Я пишу тему и добавляю меню с несколькими страницами подменю. Он работает нормально, за исключением того, что я пытаюсь использовать только один массив для сохранения всех настроек в базе данных, и это вызывает некоторые проблемы.

Проблема заключается в том, что когда каждая страница подменю сохраняется, она сохраняет только значения с этой страницы в массив и удаляет все остальные значения с других страниц, которые были сохранены ранее, поэтому массив в конечном итоге содержит только значения с одной страницы в один момент времени. время.

Вот функции, в которых я создаю страницы и регистрирую настройку.

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
}

Я, вероятно, упускаю что-то очевидное здесь, любая помощь будет оценена по достоинству.

Share
  1. Да, вы что-то упускаете. В вашей функции 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;
    }
    
    • 0
  2. «Исчезновение из массива параметров» звучит так, как будто оно может быть спрятано в массиве «notoptions». Проверьте это с помощью чего-то вроде:

      $notoptions = wp_cache_get( 'notoptions', 'options' );
    

    Чем хуже, тем хуже, может быть, прислушаться к add_option крючку и посмотреть, что происходит.

      do_action( 'add_option', $name, $value );
    
    • 0

Оставить ответ

You must login to add an answer.