問題描述

我正在嘗試清空使用 「設置」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;
}
?>

最佳解決方案

如果您正確編寫代碼,那麼 delete_option 將是正確的方法。問題不是如何清除選項; 問題是如何構建您的代碼,使 「選項不存在」 的情況是有效的情況。

想想吧第一次啓動這個代碼,那個選項根本就不會存在,對吧?您的代碼應該完全有能力處理這種情況,因為這是用户第一次看到。

如果該選項不存在,則 get_option() 接受默認值。所以使用。例如,如果你有一個空數組,那麼你可以使用這樣的代碼:

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

假設您正在使用設置 API,則應使用 if 語句中的 isset 函數來解釋 missing-field 的情況。這樣的東西

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

並且相應地處理每個實際使用該選項的情況。

次佳解決方案

你想取消只設置一個選項,還是想取消設置數組中的每個選項?

如果是前者:

$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 );

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。