WordPress : API des paramètres – enregistrez plusieurs onglets à la fois

Publié par Jean-Michel le

Dans la capture d’écran ci-jointe, vous pouvez voir la structure des options de thème avec lesquelles nous travaillons. Il y a 8 onglets et pour chaque onglet, nous avons créé des champs personnalisés en utilisant un code similaire à ce qui peut être vu ci-dessous. C’est ainsi que nous définissons les valeurs par défaut pour chaque champ. (c’est-à-dire par défaut = ‘http://facebook.com/samplefacebooktitle’)

function facebook_callback() {

    $item ='facebook';
    $default ='http://facebook.com/samplefacebooktitle';
    $group = 'general_display_options';
    $input = create_input($item,$default,$group);
    echo $input;
}

puis la fonction create_input :

function create_input($item,$default,$group) {

    $obj = $group.'['.$item.']';
    $options = get_option($group); 
    if ($options[$item] != '') { 
        $value= $options[$item]; 
    } else { 
        $value = $default; 
    }
    return '<input type="text" id="'.$item.'" name="'.$obj.'" value="'. $value .'" />';

}

Cependant, afin d’initialiser les valeurs par défaut, nous devons enregistrer chaque onglet individuellement la première fois que le thème se charge et ce thème doit être personnalisé pour l’internationalisation par de nombreuses entreprises dans d’autres pays. La question est donc de savoir s’il existe un moyen simple de précharger ces valeurs par défaut et de les enregistrer automatiquement avant que les options de thème ne soient enregistrées la première fois. Et si ce n’est pas le cas, est-ce que quelqu’un connaît un moyen d’enregistrer toutes les options de thème à la fois lorsque vous cliquez sur Enregistrer sur un onglet donné ?

——- ÉDITER ———————

Merci à Chip Bennett de m’avoir aidé à faire fonctionner ça ! Le code ci-dessous est un peu compliqué, mais il fonctionne et définit les valeurs par défaut lors de l’activation du thème. Une vérification est également ajoutée pour voir si les valeurs sont  » et si c’est le cas, nous les réinitialisons aux valeurs par défaut créées dans la fonction create_general_defaults(). N’hésitez pas à me faire part des moyens d’optimiser ce code.

<?php

function theme_menu() {
    add_theme_page(
        'My Theme',
        'My Theme',
        'administrator',
        'theme_options',
        'theme_display'
    );

} 
add_action('admin_menu', 'theme_menu');

function theme_display( $active_tab = '') {
?>

    <div class="wrap">
        <!-- add icon to the page -->
        <div id="icon-themes" class="icon32"></div>
        <h2>Theme Options</h2>
        <?php settings_errors(); ?>
        <?php
            if(isset($_GET['tab'])) {
                $active_tab = $_GET['tab'];
            } else if ($active_tab == 'nav_options') { 
                $active_tab = 'nav_options';
            } else {
                $active_tab = 'display_options';
            }
        ?>
        <h2 class="nav-tab-wrapper">
            <a href="?page=theme_options&tab=display_options" class="nav-tab <?php echo $active_tab == 'display_options' ? 'nav-tab-active' : ''; ?>">General</a>
            <a href="?page=theme_options&tab=nav_options" class="nav-tab <?php echo $active_tab == 'nav_options' ? 'nav-tab-active' : ''; ?>">Nav</a>
        </h2>
        <form method="post" action="options.php">
                <?php
                    if( $active_tab == 'display_options' ) {
                        settings_fields( 'theme_display_options' );
                        do_settings_sections( 'theme_display_options' );
                    } else if( $active_tab == 'nav_options' ) {
                        settings_fields( 'theme_nav_options' );
                        do_settings_sections( 'theme_nav_options' );
                    }
                    submit_button();
                ?>
        </form>

    </div>
<?php
}

/* -------------------- * 
 *  register settings
 *  -------------------- */
//global $theme_display_get_options;
// $theme_display_get_options = theme_display_get_options();

function initialize_theme_options() {

    // verify if the options exist
    if(false == get_option('theme_display_options')) {
        add_option('theme_display_options');
    }

    add_settings_section(
        'display_settings_section','General Options','display_options_callback','theme_display_options'
    );

    add_settings_field('facebook_alt','Facebook Alt Tag','facebook_alt_callback','theme_display_options','display_settings_section');

    register_setting('theme_display_options','theme_display_options');

}
add_action('admin_init','initialize_theme_options');


function display_options_callback() {
    echo '<p>Enter the necessary values for the following fields.</p>';
}

function create_general_defaults() {
    global $general_defaults;
    $general_defaults = array(
        'theme_title' => 'My Title Yo',
        'facebook' => 'http://facebook.com',
        'facebook_alt' => 'My default'
    );

    //save these in case something is blank and it will return to its default value
    $general_orig_defaults = apply_filters('my_options_defaults', $general_defaults);
    return $general_orig_defaults;
}
 create_general_defaults();

function get_general_defaults() {
    $option_defaults = create_general_defaults();
    global $the_theme_options;
    $the_theme_options = wp_parse_args( get_option('theme_display_options', array() ), $option_defaults );
    return $the_theme_options;
}
get_general_defaults();

function facebook_alt_callback() {

    global $general_defaults;
    global $orig_defaults;

    $orig_defaults = $general_defaults;
    $item ='facebook_alt';
    $group = 'theme_display_options';
    $form_object = 'text';
    callback_standard($item, $group, $form_object, $orig_defaults);

}

function callback_standard($item, $group, $form_object) {
    global $the_theme_options;
    global $orig_defaults; // defaults set in the 

    $default = $the_theme_options[$item];
    if($default == '') {
        $default = $orig_defaults[$item];
    }

    $obj = $group.'['.$item.']';
    if ($form_object == 'text') {
        echo '<input type="text" id="'.$item.'" name="'.$obj.'" value="'. $default .'" style="width:300px;" />';
    } else if ($form_object == 'textarea') {
        '<textarea id="'.$item.'" name="'.$obj.'" rows="5" style="width:500px" />'. $value .'</textarea>';
    }
}


/*  --------------------------------------------------------
*   Navigation Options
*   --------------------------------------------------------*
*/

// left off for abbreviated example


/*  ----------------------------------------------------
*   Templated settings field output
*   ----------------------------------------------------
*/
function create_input($item,$default,$group) {

    $obj = $group.'['.$item.']';
    $options = get_option($group);
    if ($options[$item] != '') {
        $value= $options[$item];
    } else {

        $value = $default;
    }
    return '<input type="text" id="'.$item.'" name="'.$obj.'" value="'. $value .'" style="width:300px;" />';

}
function create_textarea($item,$default,$group) {

    $obj = $group.'['.$item.']';
    $options = get_option($group);
    if ($options[$item] != '') {
        $value = $options[$item];
    } else {
        $value = $default; 
    }
    $value = stripslashes($value);
    return '<textarea id="'.$item.'" name="'.$obj.'" rows="5" style="width:500px" />'. $value .'</textarea>';

}


?>

Solution n°1 trouvée

Vous devez initialiser les valeurs par défaut lorsque le thème est activé pour la première fois en vous connectant à l’action after_setup_theme.

<?php add_action( 'after_setup_theme', 'function_name' ); ?>

Edit : Chip a souligné que ce crochet est en fait appelé à chaque chargement de page. Assurez-vous que si vous l’accrochez pour vérifier si vous avez déjà défini les valeurs par défaut – ou vous les écraserez continuellement. Mieux encore : utilisez la réponse de Chip ci-dessus.

Solution n°2 trouvée

N’initialisez pas les valeurs par défaut ou ne faites pas de sauvegarde initiale. Utilisez simplement des valeurs par défaut saines.

Par exemple, définissez un tableau de valeurs par défaut :

function wpse92323_get_option_defaults() {
    $defaults = array(
        'slug1' => 'default1',
        'slug2' => 'default2'
    );
    return apply_filters( 'wpse92323_option_defaults', $defaults );
}

Ensuite, écrivez une fonction pour renvoyer une valeur d’option, qui analyse les options stockées par rapport à vos valeurs par défaut :

function wpse92323_get_options() {

    // Get the option defaults
    $option_defaults = wpse92323_get_option_defaults();
    // Globalize the variable that holds the Theme options
    global $wpse92323_options;
    // Parse the stored options with the defaults
    $wpse92323_options = wp_parse_args( get_option( 'theme_wpse92323_options', array() ), $option_defaults );
    // Return the parsed array
    return $wpse92323_options;
}

Ensuite, partout où vous utilisez vos options :

// Get options
global $wpse92323_options;
$wpse92323_options = wpse92323_get_options();

// Echo an option
echo $wpse92323_options['slug1']

Explication de wpse92323_get_options():

  1. wp_parse_args( $args, $defaults ): analysera deux tableaux, $args, et $defaults, avec toutes les clés en $argsremplaçant les mêmes clés dans$defaults
  2. get_option( 'theme_wpse92323_options', array() ): renvoie la valeur d’une option stockée. (Remplacez 'theme_wpse92323_options'par ce que vous appelez dans register_setting().) Le deuxième paramètre est la valeur par défaut ; le passage array()garantit que, si l’option n’a pas encore été définie, un tableau vide est renvoyé. ( Ceci est essentiel pour l’utilisation de wp_parse_args(). )

Donc, ce que fait cette construction :

  1. Obtenir le tableau d’options de thème actuel
  2. S’il n’est pas encore défini, renvoie un tableau vide
  3. Analyser le tableau d’options de thème actuel par rapport aux valeurs par défaut de l’option, laissant les options de thème définies par l’utilisateur prévaloir
  4. Renvoie le tableau fusionné résultant

En utilisant cette méthode, l’utilisateur ou le thème n’a jamais à enregistrer les valeurs d’options du thème dans la base de données pour que le thème fonctionne correctement . Le thème fonctionne correctement, avec des valeurs par défaut définies et saines, « prêtes à l’emploi ».

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *