Wordpress设置页面未将设置保存到数据库

问题描述 投票:4回答:5

我正在开发我的第一个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
}
?>
wordpress-plugin wordpress
5个回答
3
投票

在我看来你需要在表格标签中添加action="options.php"。否则看来是对的。毫无疑问你看过this codex page,因为你的代码非常相似,但这是我看到的唯一区别。


2
投票

还值得注意的是,如果您遇到此问题,请检查您是否尝试回显设置字段。

所以对我来说,我有这个:

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' ); ?>

1
投票

我检查了代码并从我身边进行了测试,我做了一些更改,看到了完整的工作代码

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

希望它可能有助于某人:)


0
投票

您使用的是哪种浏览器?这可能听起来很奇怪,但是使用Chrome,我发现了一些不能正确保存设置的插件。

这不是一个很好的技术答案,但如果该插件仅供您自己使用,并且您可以在Firefox和IE中使用其管理功能,则可能更容易满足“足够好”。


0
投票

你有多站点吗?如果是这样,该设置将在本地wp _ * _ options单站点表的wp_options表instread中创建。你必须使用

add_blog_option( get_current_blog_id(), "option_name", "" );

当您在现有博客上强制使用多站点并且现在尝试管理选项时,通常会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.