web-dev-qa-db-ja.com

Settings APIで作成したオプションを空にするための最善の方法は何ですか?

Settings APIで作成したオプションを空にしようとしましたが失敗します。

update_option ( 'my_option', '' );は何もしないように見えますが、delete_option ( 'my_option' );はオプション全体を破壊し、他の問題を引き起こします。値を空にしてリセットするだけです。

私はこれを正しく実装する方法を本当にわかりません。誰も手伝ってくれる?つかむための50ポイントのボーナス!

<?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

あなたがあなたのコードを正しく書いたなら、delete_optionは正しい方法でしょう。問題はその選択肢をどうやって解決するかではありません。問題は、「オプションが存在しない」場合が有効な場合であるように、コードをどのように構成するかです。

それについて考えてください。このコードを初めて起動したときには、そのオプションはまったく存在しないでしょう。あなたのコードはそのケースを完全に処理する能力があるべきです、なぜならそれはユーザーがこれまでに見ることになるだろうからです。

オプションが存在しない場合、get_option()はデフォルト値を受け入れます。それを使ってください。たとえば、デフォルトの配列が空の場合、次のようなコードになります。

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

Settings APIを使用していると仮定すると、フィールドがない場合を考慮するためにifステートメントでisset関数を使用する必要があります。このようなもの:

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

そして実際のそれぞれの使用方法に合わせてオプションを使用してください。

7
Otto

1つのオプションの設定を解除しますか、または配列内のすべてのオプションの設定を解除しますか

前者の場合

$tccl_domains = get_option( 'tccl_settings_domains' );

$tccl_domains['option_to_unset'] = false;

update_option( 'tccl_settings_domains', $tccl_domains );

後者の場合

$tccl_domains = get_option( 'tccl_settings_domains' );

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

まず最初に、update_option()delete_option()を呼び出すたびに - delete_option()について確信が持てない - 検証関数が呼び出されることを理解してください。そしてtccl_settings_domains_validate()が検証する方法は、update_option()関数がさらにオプションを追加する原因となっているものです。

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

この関数がしていることは、* tccl_settings_domains *の中にあるものをすべて取り、それを$optionsに割り当てることです。

$options = get_option('tccl_settings_domains');

それから$inputにあるものを$options配列に追加/プッシュします。関数が$options(これは基本的にオプションを「保存する」)を返すとき、保存されるのはoptionsフィールドの内容と$inputの値です。したがって、配列は大きくなります。

それでは、これを試してみてください。

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

それから、Add Domainフォーム(options.phpに行くもの)で、この隠し入力<input name="tccl_settings_domains[action]" type="hidden" value="add-domain" />を追加してください。

これは私が考えることができる最も直接的な解決策であり、あなたのコードの変更を最小限にすることを含みます。

それがあなたのために働くかどうか私に知らせてください=)

0
Ryann