web-dev-qa-db-fra.com

Nouvelle option de thème personnalisé (saisie de texte) donnant une erreur d'index

J'utilise le fichier theme-options.php de ThemeShaper: http://themeshaper.com/2010/06/03/sample-theme-options/

Je peux ajouter avec succès de nouvelles options de liste déroulante, mais lorsque j'ajoute une nouvelle entrée de texte, je reçois cette erreur lorsque je la visualise dans la zone d'administration (j'ai ajouté le THEME_DIRECTORY):

<br /> <b>Notice</b>:  Undefined index:  cpt_sm_dribbble_handle in <b>/[THEME_DIRECTORY]/theme-options.php</b> on line <b>359</b><br />

Lorsque je change la valeur d'entrée en autre chose et que je l'enregistre, cela fonctionne bien et ne donne jamais d'erreur à nouveau. Cependant, je ne veux pas que ce message d'erreur apparaisse aux utilisateurs. Je préférerais que ce soit juste vide car il n’ya pas encore de valeur saisie.

Je suppose que je reçois cette erreur car la base de données ne reconnaît pas cette nouvelle option. Et je pense que j'ai besoin d'une sorte de vérification dans mon code pour dire si cela n'existe pas, définissez la valeur sur null. Bien que je ne sois pas sûr que ce soit vraiment le problème et si oui, comment le résoudre.

Voici le code réduit pour mon fichier d'options et pour une nouvelle option de texte (j'ai noté la ligne qui génère l'erreur):

add_action('admin_init', 'cpt_options_init');
add_action('admin_menu', 'theme_options_add_page');

function cpt_options_init() {
    register_setting('cpt_options', 'cpt_theme_options', 'theme_options_validate');
}

function theme_options_add_page() {
    add_theme_page('Theme Options', 'Theme Options', 'edit_theme_options', 'theme_options', 'theme_options_do_page');
}

function theme_options_do_page() {
    global $sm_select_options;

    if (!isset($_REQUEST['settings-updated']))
        $_REQUEST['settings-updated'] = false;
?>

    <form method="post" action="options.php">
        <?php settings_fields('cpt_options'); ?>
        <?php $options = get_option('cpt_theme_options'); ?>

        <tr valign="top">
            <th scope="row">Dribbble</th>
            <td>
                <label class="description" for="cpt_theme_options[cpt_sm_dribbble_handle]">Dribbble Username</label>
                <input id="cpt_theme_options[cpt_sm_dribbble_handle]" class="regular-text" type="text" name="cpt_theme_options[cpt_sm_dribbble_handle]" value="<?php esc_attr_e($options['cpt_sm_dribbble_handle']); ?>" /> // THIS IS THE LINE THAT IS THROWING THE ERROR (line 359)
            </td>
        </tr>

    </form>

<?php
}

function theme_options_validate($input) {
    global $sm_select_options;

    // Say our text option must be safe text with no HTML tags
    $input['cpt_sm_dribbble_feed'] = wp_filter_nohtml_kses($input['cpt_sm_dribbble_feed']);

    return $input;
}

Des idées sur ce que je fais mal?

Merci pour votre temps.

1
David Yeiser

Enveloppez l'appel dans une condition isset() dans cette ligne:

<input id="cpt_theme_options[cpt_sm_dribbble_handle]" class="regular-text" type="text" name="cpt_theme_options[cpt_sm_dribbble_handle]" value="<?php esc_attr_e($options['cpt_sm_dribbble_handle']); ?>" />

Essayez quelque chose comme ça:

$cpt_sm_dribbble_handle = ( isset( $options['cpt_sm_dribbble_handle']) ? $options['cpt_sm_dribbble_handle']) : '' );

<input id="cpt_theme_options[cpt_sm_dribbble_handle]" class="regular-text" type="text" name="cpt_theme_options[cpt_sm_dribbble_handle]" value="<?php esc_attr_e($cpt_sm_dribbble_handle); ?>" />

EDIT

Remarque: votre autre alternative consiste à définir les options par défaut sur init, afin que cette option soit définie sur une valeur par défaut, par exemple. une chaîne vide.

1
Chip Bennett