我正在开发我的第一个Wordpress插件。我一直在关注创建设置页面的一些指南。
我有以下页面,它正确显示数据库中的字段的值。当我转到页面,编辑字段并按“保存更改”时,更改不会保存到数据库中。如果我直接在数据库中更改值,那么值确实会在输入字段中正确显示,但我仍然无法更新页面中的值。
你能看到我做过的任何明显的错误或者我错过的东西吗?
<?php
add_action('admin_menu', 'SetupPage');
function SetupPage()
{
add_action('admin_init', 'RegisterSettings');
// Setup administration menu item
if (function_exists('add_options_page'))
{
add_menu_page(__("TestPage"), __("TestPage"), "manage_options", __FILE__, 'PageContent', plugins_url('/images/icon.png', __FILE__));
}
}
function RegisterSettings()
{
// Add options to database if they don't already exist
add_option("test_option1", "", "", "yes");
add_option("test_option2", "", "", "yes");
add_option("test_option3", "", "", "yes");
// Register settings that this form is allowed to update
register_setting('test_settings', 'test_option1');
register_setting('test_settings', 'test_option2');
register_setting('test_settings', 'test_option3');
}
?>
<?php
function PageContent()
{
if (!current_user_can('manage_options'))
wp_die(__("You don't have access to this page"));
?>
<div class="wrap">
<h2><?_e("Test settings")?></h2>
<form method="post">
<?php settings_fields('test_settings'); ?>
<table class="form-table">
<tr valign="top">
<th scope="row">test_option1</th>
<td><input type="text" name="test_option1" value="<?php echo get_option('test_option1'); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">test_option2</th>
<td><input type="text" name="test_option2" value="<?php echo get_option('test_option2'); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">test_option3</th>
<td><input type="text" name="test_option3" value="<?php echo get_option('test_option3'); ?>" /></td>
</tr>
</table>
<p class="submit">
<input type="submit" class="button-primary" value="<?php _e('Save changes') ?>" />
</p>
</form>
</div>
<?php
}
?>
在我看来你需要在表格标签中添加action="options.php"
。否则看来是对的。毫无疑问你看过this codex page,因为你的代码非常相似,但这是我看到的唯一区别。
还值得注意的是,如果您遇到此问题,请检查您是否尝试回显设置字段。
所以对我来说,我有这个:
echo '
<div class="wrap">
<h1>Theme Settings <img src="' . get_stylesheet_directory_uri('stylesheet_directory') . '/images/site-icon.png" width="32" height="32" /></h1>
<form method="post" action="options.php">
' . settings_fields( 'custom-settings-group' ) . '
' . do_settings_sections( 'custom-settings-group' ) . '
<table class="form-table">
<tr valign="top">
<th scope="row">Brisbane Hours</th>
<td><textarea rows="4" cols="40" name="brisbane_hours">' . esc_attr( get_option('brisbane_hours') ) . '</textarea></td>
</tr>
<tr valign="top">
<th scope="row">Adelaide Hours</th>
<td><input type="text" value="' . esc_attr( get_option('adelaide_hours') ) . '"/></td>
</tr>
</table>
' . submit_button() . '
</form>
</div>
';
这意味着这两个领域得到了回应:
settings_fields( 'custom-settings-group' )
do_settings_sections( 'custom-settings-group' )
改为这个为我修好了。
<?php settings_fields( 'snowys-custom-settings-group' ); ?>
<?php do_settings_sections( 'snowys-custom-settings-group' ); ?>
我检查了代码并从我身边进行了测试,我做了一些更改,看到了完整的工作代码
<?php
/**
* Plugin Name: Testing Plugin
*/
add_action('admin_menu', 'SetupPage');
add_action('admin_init', 'RegisterSettings');
function SetupPage() {
add_menu_page(__("TestPage"), __("TestPage"), "manage_options", __FILE__, 'PageContent', plugins_url('/images/icon.png', __FILE__));
}
function RegisterSettings() {
// Add options to database if they don't already exist
add_option("test_option1", "", "", "yes");
add_option("test_option2", "", "", "yes");
add_option("test_option3", "", "", "yes");
// Register settings that this form is allowed to update
register_setting('test_settings', 'test_option1');
register_setting('test_settings', 'test_option2');
register_setting('test_settings', 'test_option3');
}
?>
<?php
function PageContent() {
if (!current_user_can('manage_options'))
wp_die(__("You don't have access to this page"));
?>
<div class="wrap">
<h2><? _e("Test settings") ?></h2>
<form method="post" action="options.php">
<?php settings_fields('test_settings'); ?>
<table class="form-table">
<tr valign="top">
<th scope="row">test_option1</th>
<td><input type="text" name="test_option1" value="<?php echo get_option('test_option1'); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">test_option2</th>
<td><input type="text" name="test_option2" value="<?php echo get_option('test_option2'); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">test_option3</th>
<td><input type="text" name="test_option3" value="<?php echo get_option('test_option3'); ?>" /></td>
</tr>
</table>
<p class="submit">
<input type="submit" class="button-primary" value="<?php _e('Save changes') ?>" />
</p>
</form>
</div>
<?php
}
?>
希望它可能有助于某人:)
您使用的是哪种浏览器?这可能听起来很奇怪,但是使用Chrome,我发现了一些不能正确保存设置的插件。
这不是一个很好的技术答案,但如果该插件仅供您自己使用,并且您可以在Firefox和IE中使用其管理功能,则可能更容易满足“足够好”。
你有多站点吗?如果是这样,该设置将在本地wp _ * _ options单站点表的wp_options表instread中创建。你必须使用
add_blog_option( get_current_blog_id(), "option_name", "" );
当您在现有博客上强制使用多站点并且现在尝试管理选项时,通常会发生这种情况。