問題描述
我正在嘗試清空使用 「設置」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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。