web-dev-qa-db-fra.com

Les pages de sous-menu suppriment les paramètres du tableau d'options lors de leur enregistrement

J'écris un thème et ajoute un menu avec plusieurs pages de sous-menus. Cela fonctionne bien, sauf que j'essaie d'utiliser un seul tableau pour enregistrer tous les paramètres dans la base de données, ce qui pose certains problèmes.

Le problème est que lorsque chaque page de sous-menu est enregistrée, elle enregistre uniquement les valeurs de cette page dans le tableau et supprime toutes les autres valeurs des autres pages stockées auparavant, de sorte que le tableau ne contienne temps.

Voici les fonctions où je crée les pages et enregistre le réglage.

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' );
}

Dans add_settings_messages () et add_settings_layout, j'ajoute les sections et les champs:

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');

}

Et voici la fonction d'affichage de la page:

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
}

Il me manque probablement quelque chose d'évident ici, toute aide serait la bienvenue.

4
BioXD

Oui, il vous manque quelque chose. Sur votre fonction validate_options, vous devez:

  • obtenir un tableau de toutes les options existantes.
  • mettre à jour uniquement les options gérées par votre page de sous-menu.
  • renvoyer ce tableau.

Donc, quelque chose comme:

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;
}
5
Bainternet

"Disappearing from options array" semble pouvoir être rangé dans le tableau "notoptions". Vérifiez cela avec quelque chose comme:

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

Pire encore, écoutez peut-être le crochet add_option et voyez ce qui se passe.

  do_action( 'add_option', $name, $value );
1
editor