web-dev-qa-db-fra.com

Quelle est la meilleure méthode pour vider une option créée avec l'API Settings?

J'essaie de vider une option créée avec l'API Settings et échoue.

update_option ( 'my_option', '' ); semble ne rien faire, alors que delete_option ( 'my_option' ); détruit toute l'option, ce qui cause d'autres problèmes. Je veux juste vider les valeurs et le réinitialiser.

Je ne sais vraiment pas comment mettre cela en œuvre correctement. Quelqu'un peut-il aider? Prime de 50 points à gagner!

<?php
//Create the menus
add_action( 'admin_menu', 'tccl_menu' );
function tccl_menu() {  
    //add_menu_page: $page_title; $menu_title, $capability, $menu_slug, $function, $icon_url, $position
    add_menu_page( 'Control', 'Control', 'manage_options', 'tccl-main', 'tccl_menu_page_main', plugins_url( '/traffic-control/images/wp-icon.png' ), '2.2' );
    //add_submenu_page: $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function
    add_submenu_page( 'tccl-main', 'Domains', 'Domains', 'manage_options', 'tccl-domains', 'tccl_menu_page_domains' ); 
}

//Menu callback functions for drawing pages
function tccl_menu_page_main() {
    ?>
    <div class="wrap">
    <h2>Control</h2>
    <form action="options.php" method="post">
    <?php settings_fields( 'tccl_settings_main' ); ?>
    <?php do_settings_sections( 'tccl_settings_main' ); ?>
    <input name="Submit" type="submit" value="Save Changes" class="button-primary" />
    </form></div>
    <?php
}
function tccl_menu_page_domains() {
    $tccl_domains = get_option( 'tccl_settings_domains' );
    if ( $_POST['trigger'] ) {
        $p_delete_all = $_POST['delete_all'];
        $p_ids = $_POST['ids']; #Get IDs
        $p_deletes = $_POST['deletes']; #Get deletes
        if ( $p_delete_all ) {
            //unset( $tccl_domains );
            //delete_option( 'tccl_settings_domains' );
            foreach( $tccl_domains as $option ) {
                $option = false;
            }
            $tccl_domains = array ();
            update_option( 'tccl_settings_domains', $tccl_domains );
        } elseif ( is_array( $p_ids) ){
            foreach ( $p_ids as $id ) {
                if ( $p_deletes[$id] ) {
                    //unset( $tccl_domains[$id] );
                }
            }
        }
    }
    ?>
    <div class="wrap">
    <?php screen_icon( 'themes' ); ?>
    <h2>Control</h2>
    <form action="options.php" method="post">
    <?php settings_fields( 'tccl_settings_domains' ); ?>
    <?php do_settings_sections( 'tccl_settings_domains' ); ?>
    <input name="Add" type="submit" value="Add Domains" class="button-primary" />
    </form>
    <form action="" method="post">
    <input type="hidden" name="trigger" value="1">
    <h3>Live Domains</h3>
    <table class="widefat">
    <thead>
        <tr>
            <th><input type="checkbox" name="delete_all" value="1"></th>
            <th>Domain Name</th>
        </tr>
    </thead>
    <tfoot>
        <tr>
            <th><input type="checkbox" name="delete_all" value="1"></th>
            <th>Domain Name</th>
        </tr>
    </tfoot>
    <tbody>
        <?php
            print_r ( $tccl_domains );
            if ( is_array( $tccl_domains ) ) {
                foreach ( $tccl_domains as &$value ) {
                    echo '<tr><td><input class="large-text" type="checkbox"></td><td>'.$value['text_area'].'</td></tr>';
                }
            } else {
                echo '<tr><td colspan="2">No domains entered. Use the form above to add domains to this list.</td></tr>';
            }
        ?>
    </tbody>
    </table>
    <br />
    <input name="Delete" type="submit" value="Delete Domains" class="button-secondary" />
    </form>
    <script>
        jQuery('input[name=delete_all]').click(function () {
            if (jQuery(this).is(':checked')) {
            jQuery('tbody input[type=checkbox]').each(function () {
                jQuery(this).attr('checked', true);
            });
            jQuery('input[name=delete_all]').attr('checked', true);
            } else {
            jQuery('tbody input[type=checkbox]').each(function () {
                jQuery(this).attr('checked', false);
            });
            jQuery('input[name=delete_all]').attr('checked', false);
            }
        });
    </script>
    </div>
    <?php
}

//Settings
add_action( 'admin_init', 'tccl_admin_init' );
function tccl_admin_init() {
    // register_setting: $option_group, $option_name, $sanitize_callback
    register_setting( 'tccl_settings_main', 'tccl_settings_main', 'tccl_settings_main_validate' );
    register_setting( 'tccl_settings_domains', 'tccl_settings_domains', 'tccl_settings_domains_validate' );
    // add_settings_section: $id, $title, $callbak, $page
    add_settings_section( 'tccl_sections_main', 'Main Settings', 'tccl_sections_main_text', 'tccl_settings_main' );
    add_settings_section( 'tccl_sections_domains', 'Add Domains', 'tccl_sections_main_text', 'tccl_settings_domains' );
    // add_settings_field: $id, $title, $callback, $page, $section, $args
    add_settings_field( 'tccl_fields_main_input', 'Enter text here...', 'tccl_fields_main_input', 'tccl_settings_main', 'tccl_sections_main' );
    add_settings_field( 'tccl_fields_domains_input', 'Add domains to the list below. Multiple domains should be seperated by commas.', 'tccl_fields_domains_input', 'tccl_settings_domains', 'tccl_sections_domains' );
}

//Sections callback functions
function tccl_sections_main_text() {
    echo '<p>Enter your settings for the main options in the main section...</p>';
}

//Field callback functions
function tccl_fields_main_input() {
    //Get option 'text_string' value from the database
    $options = get_option( 'tccl_settings_main' );
    $text_string = $options['text_string'];
    //Echo the field
    echo "<input id='text_string' name='tccl_settings_main[text_string]' type='text' value='$text_string' />";
}
function tccl_fields_domains_input() {
    //Get option 'text_string' value from the database
    $options = get_option( 'tccl_settings_domains' );
    $text_area = $options['text_area'];
    //Echo the field
    echo "<textarea id='text_area' name='tccl_settings_domains[text_area]'>$text_area</textarea>";
}

//Settings callback functions (validation)
function tccl_settings_main_validate( $input ) {
    $valid['text_string'] = preg_replace( '/[^a-zA-Z]/', '', $input['text_string'] );

    if ( $valid['text_string'] != $input['text_string'] ) {
        //add_setting_error: $title, $id, $error_message, $class
        add_settings_error( 'tccl_fields_main_input', 'tccl_texterror', 'Incorrect value entered!', 'error' );
    }   

    return $valid;
}
function tccl_settings_domains_validate( $input ) {
    $options = get_option( 'tccl_settings_domains' );
    $options[] = $input;
    return $options;
}
?>
6
jnthnclrk

Si vous avez écrit votre code correctement, alors delete_option serait la bonne manière. La question n'est pas comment effacer l'option; la question est de savoir comment structurer votre code de manière à ce que le cas "l'option n'existe pas" soit un cas valide.

Penses-y. La première fois que vous démarrez ce code, cette option n'existera pas du tout, n'est-ce pas? Votre code devrait être parfaitement capable de gérer ce cas, car c'est la première chose que l'utilisateur verra.

get_option () accepte une valeur par défaut si l'option n'existe pas. Alors utilisez ça. Si vous aviez un tableau vide pour la valeur par défaut, par exemple, vous auriez un code comme celui-ci:

$options = get_option('whatever',array());

En supposant que vous utilisiez l'API de paramètres, vous devriez alors utiliser la fonction isset dans les instructions if pour prendre en compte le cas du champ manquant. Quelque chose comme ça:

if (!isset($options['name'])) {
//... the option isn't set to something 
} else {
//... the option is set to something
}

Et gérer chaque cas d'utilisation réelle de l'option de l'option en conséquence.

7
Otto

Voulez-vous désélectionner une seule option ou voulez-vous désélectionner chaque option du tableau ?

Si c'est l'ancien:

$tccl_domains = get_option( 'tccl_settings_domains' );

$tccl_domains['option_to_unset'] = false;

update_option( 'tccl_settings_domains', $tccl_domains );

Si c'est le dernier:

$tccl_domains = get_option( 'tccl_settings_domains' );

foreach( $tccl_domains as $option ) {
    $option = false;
}
update_option( 'tccl_settings_domains', $tccl_domains );
4
Chip Bennett

tout d'abord, comprenez que chaque fois que vous appelez update_option() et delete_option() - vous n'êtes pas sûr de delete_option() - la fonction de validation est appelée. Et la façon dont tccl_settings_domains_validate() valide, est ce qui a amené la fonction update_option() à ajouter plus d'options:

 function tccl_settings_domains_validate( $input ) {
   $options = get_option( 'tccl_settings_domains' );
   $options[] = $input;
   return $options;
 }

le but de cette fonction est de prendre tout ce qui se trouve à l'intérieur de * tccl_settings_domains * et de l'attribuer à $options:

$options = get_option('tccl_settings_domains');

puis ajoutez/Poussez tout ce qui est dans $input dans le tableau $options. Lorsque la fonction renvoie $options (qui "enregistre" l'option), ce qui est enregistré est le contenu du champ d'options plus la valeur de $input. Ainsi, le tableau devient plus grand.

Alors, essayez ceci pour commencer:

function tccl_settings_domains_validate( $input ) {
    if( isset( $input['action'] ) && $input['action'] == 'add-domain' ){
        //add new value to $options array
        options = get_option( 'tccl_settings_domains' );
        $options[] = $input;
        return $options;
    }
    //return whatever value is passed.
    return $input;
}

puis, dans le formulaire Ajouter un domaine (celui qui se trouve sur options.php), ajoutez cette entrée masquée <input name="tccl_settings_domains[action]" type="hidden" value="add-domain" />

C’est la solution la plus simple à laquelle je puisse penser qui implique un minimum de changement dans votre code.

laissez-moi savoir si cela fonctionne pour vous =)

0
Ryann