web-dev-qa-db-fra.com

Erreur d'option de mise à jour: Remarque: index non défini

J'ai créé un plugin WordPress et ajouté une page d'options.

Il y a un message d'erreur quand la case à cocher est décochée:

Notice: Undefined index: upo_enable

Mais lorsque la case à cocher est cochée, cela fonctionne bien. Voir le GIF ci-dessous:

 my plugin's options page 

Le code de démonstration:

<?php
/*
Plugin Name: update option
Plugin URI: 
Description: Plugin Demo.
Author: Ryan
Version: 1.0
Author URI: 
*/

if ( !function_exists('upo_admin_page') ) :
function upo_admin_page() {
    add_options_page( 
        __( 'Update Option', 'demo' ),
        __( 'Update Option', 'demo' ),
        'manage_options',
        'update-option',
        'upo_option_page'
    );
}
endif;
add_action( 'admin_menu', 'upo_admin_page' );

// Update Options.
if ( !function_exists('upo_options_update') ) :
function upo_options_update() {
    $updated = '<div class="updated settings-error notice is-dismissible"><p><strong>' . __('Settings saved.', 'demo') . '</strong></p></div>'; 
    if (isset($_POST['update_options'])) {
        update_option('upo_enable', $_POST['upo_enable']);
        echo $updated;
    }
}
endif;

if ( !function_exists('upo_option_page') ) :
function upo_option_page() {

?>
<div class="upo-wrap">
    <h2><?php _e('Update Options') ?></h2>
    <?php upo_options_update(); ?>
    <div class="update-option">
        <form method="post" action="<?php echo admin_url( 'options-general.php?page=update-option' ); ?>">
        <?php wp_nonce_field('update_options');?>
        <table class="upo-options-form">
            <tr valign="top">
                <th scope="row"><?php _e('Enable'); ?></th>
                <td><label for="upo_enable">
                <input name="upo_enable" type="checkbox" id="upo_enable" value="true" <?php checked('true', get_option('upo_enable')); ?> /><?php _e('Test Text'); ?></label>
                </td>
            </tr>
        </table>
        <p class="upo-submit">
            <input type="submit" name="update_options" class="button-primary" value="<?php _e('Save Changes','demo'); ?>" />
        </p>
        </form>
    </div>
</div>
<?php
}
endif;

Alors, comment puis-je résoudre ce problème?

Merci!

1
85Ryan

En effet, lorsqu'une case à cocher n'est pas cochée, elle n'est pas envoyée au serveur. C'est pourquoi le tableau POST ne possède pas l'index upo_enable.

Vous pouvez cependant vérifier si la valeur est vide ou non:

$upo_enable = !empty($_POST['upo_enable']) ? true : false;

Or

$upo_enable = !empty($_POST['upo_enable']) ? $_POST['upo_enable'] : false;

Pour en savoir plus: https://www.w3.org/TR/html401/interact/forms.html

cases à cocher

Les cases à cocher (et les boutons radio) sont des boutons d'activation/désactivation que l'utilisateur peut basculer. Un commutateur est "activé" lorsque l'attribut vérifié de l'élément de contrôle est défini. Lorsqu'un formulaire est soumis, seuls les contrôles de case à cocher "sur" peuvent réussir.

2
Drupalizeme