Страница настроек Wordpress не сохраняет настройки в базу данных - PullRequest
4 голосов
/ 01 февраля 2011

Я разрабатываю свой первый плагин для 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
}
?>

Ответы [ 5 ]

3 голосов
/ 01 февраля 2011

Похоже, вам нужно добавить action="options.php" в тег формы. В противном случае это кажется правильным. Без сомнения, вы смотрели на эту страницу кодекса , поскольку ваш код очень похож, но это единственное отличие, которое я вижу.

2 голосов
/ 01 марта 2018

Стоит также отметить, что если у вас возникла эта проблема, проверьте, не пытаетесь ли вы отобразить поля настроек.

Так что для меня это было:

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 голос
/ 10 декабря 2014

Я проверил код и протестировал со своей стороны, и я сделал некоторые изменения, чтобы увидеть полный рабочий код

<?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 голосов
/ 10 декабря 2014

У вас есть мультисайтовый набор? В этом случае настройка будет создана в таблице wp_options instread локальной таблицы параметров wp _ * _. Вы должны использовать

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

Это обычно происходит, когда вы установили мультисайт в существующем блоге и теперь пытаетесь управлять параметрами.

0 голосов
/ 01 февраля 2011

Какой браузер вы используете? Это может показаться странным, но с помощью Chrome я нашел пару плагинов, которые не сохраняют настройки должным образом.

Не очень хороший технический ответ, но если плагин предназначен только для вашего собственного использования, и вы можете заставить его функции администратора работать в Firefox и IE, может быть проще выбрать «достаточно хороший».

...