Не могу сохранить настройки

Я создал страницу параметров темы с помощью API настроек, все работает нормально, но я не могу сохранить параметры. Я пытался выяснить, где я что-то пропустил, но потерпел неудачу. Есть идеи, что может вызвать эту проблему?

Вот код моей страницы настроек

<?php/** * This functions registers default options values for Evolutionary theme  * settings */function ev_theme_settings_defaults() {    $options = array(        'color_scheme' => 'blue',        'copyright' => '',        'nav_hide_home' => false,        'nav_hide_sec' => false,        'nav_show_lvl' => false,        'featured_show' => false,        'featured_pause' => false,        'featured_speed' => 5,        'ad1_link' => '',        'ad1_image' => '',        'ad2_link' => '',        'ad2_image' => '',        'ad3_link' => '',        'ad3_image' => '',        'ad4_link' => '',        'ad4_image' => ''    );    return $options;    //Change to apply_filters( 'ev_theme_settings_defaults', $options );}/** * Create helper function for theme colors */function ev_get_valid_color_schemes(){    $color_schemes = array(        'blue' => __( 'Blue', 'evolutionary' ),        'green' => __( 'Green', 'evolutionary' ),        'red' => __( 'Red', 'evolutionary' ),        'black' => __( 'Black', 'evolutionary')    );    return $color_schemes;    } /** * Setup initial theme options */function ev_options_init() {    //Set options equal to defaults    global $ev_options;    $ev_options = ev_theme_settings_defaults();    if ( false === $ev_options ) {        $ev_options = ev_theme_settings_defaults();    }    update_option( 'theme_evolutionary_options', $ev_options );}add_action( 'after_setup_theme', 'ev_options_init', 9 );/** * Add theme options page to admin menu */function ev_menu_options() {    add_theme_page( __( 'Theme Options', 'evolutionary' ), __( 'Theme Options', 'evolutionary' ), 'edit_theme_options', 'evolutionary-settings', 'ev_admin_options_page' );}add_action( 'admin_menu', 'ev_menu_options' );/** * Register theme options */function ev_register_options() {    register_setting( 'theme_evolutionary_options', 'theme_evolutionary_options', 'ev_options_validate' );/** * Defining settings sections and fields * fist setting creates sections for general options */add_settings_section( 'ev_settings_general_options', __( 'General Options', 'evolutionary' ), 'ev_settings_general_options', 'evolutionary' );//Creates section for navigation optionsadd_settings_section( 'ev_settings_nav_options', __( 'Navigation', 'evolutionary' ), 'ev_settings_nav_options', 'evolutionary' );//Section for featured post optionsadd_settings_section( 'ev_settings_featured_options', __( 'Featured Posts', 'evolutionary' ), 'ev_settings_featured_options', 'evolutionary' );//Section for Advertising optionsadd_settings_section( 'ev_settings_ad_options', __( 'Advertising', 'evolutionary' ), 'ev_settings_ad_options', 'evolutionary' );/** * Created empty callbacks for setions */function ev_settings_general_options() {    //Put callback code here}function ev_settings_nav_options() {    //callback}function ev_settings_featured_options() {    //callback}function ev_settings_ad_options() {    //callback}/** * Registered fields */add_settings_field( 'ev_settings_copyright_field', __( 'Copyright Name', 'evolutionary' ), 'ev_settings_copyright_field', 'evolutionary', 'ev_settings_general_options' );add_settings_field( 'ev_settings_colors_field', __( 'Theme Color', 'evolutionary' ), 'ev_settings_colors_field', 'evolutionary', 'ev_settings_general_options' );/** * Fields Callbacks */function ev_settings_copyright_field() {    $ev_options = get_option( 'theme_evolutionary_options' );    //var_dump( $ev_options );    ?>    <input name="theme_evolutionary_options[copyright]" type="text" class="regular-text" value="<?php esc_attr_e( $ev_options['copyright'] ); ?>"  /><?php }//Callback for colorschemefunction ev_settings_colors_field() {    $ev_options = get_option( 'theme_evolutionary_options' );    $color_schemes = ev_get_valid_color_schemes();    echo '<select name="theme_evolutionary_options[color_scheme]">';    foreach( $color_schemes as $value => $caption ) :?>        <option value="<?php echo $value; ?>" <?php selected( $value, $ev_options['color_scheme'] ); ?>><?php echo $caption; ?></option><?php     endforeach;    echo '</select>';}} //ev_register_optionsadd_action( 'admin_init', 'ev_register_options' );    /** * Creating options page HTML output */function ev_admin_options_page() { ?>    <div class="wrap">       <?php if ( isset( $_GET['settings-updated'] ) ) {                echo "<div class='updated'><p>Theme settings updated successfully.</p></div>";        } ?>        <?php screen_icon(); ?>        <h2><?php _e( 'Theme Options', 'evolutionary' ); ?></h2>        <form action="options.php" method="post">        <?php         settings_fields( 'theme_evolutionary_options' );        do_settings_sections( 'evolutionary' );        ?>            <input name="submit" type="submit" class="button-primary" value="<?php _e( 'Save Settings', 'evolutionary' ) ?>" />            <input name="reset" type="submit" class="button-secondary" value="<?php _e( 'Reset Settings', 'evolutionary' ) ?>" />        </form>    </div><?php }function ev_options_validate( $input ) {    $ev_options = get_option( 'theme_evolutionary_options' );    $valid_input = $ev_options;    $ev_options['color_scheme'] = array_key_exists( $ev_options['color_scheme'], ev_get_valid_color_schemes() ) ? $ev_options['color_scheme'] : 'blue';    $ev_options['copytright'] = wp_kses_data( $ev_options['copyright'] );    return $valid_input;}

Ответы и комментарии:

«все работает, но я не могу сохранить параметры». Единственное место, где я вижу, что вы пытаетесь сохранить параметры, это когда вы устанавливаете начальные значения по умолчанию. Вы используете update_option () для сохранения значений по умолчанию ... так что вы не можете сохранить параметры, или вы пытаетесь их сохранить где-то еще?
Создан 15-03-2011 02:37 EAMann♦

@EAMann Я пытался добавить add_options, но результат был тот же
Создан 15-03-2011 03:47 Mamaduka

Смотрите ответ TheDeadMedic. Вы никогда ничего не разъясняли в ответ на мой вопрос ... Я спрашивал, где именно ваша проблема. Вы дали нам огромный блок кода с неоднозначным «он не экономит», не сказав нам, где он не был сохранен.
Создан 15-03-2011 04:26 EAMann♦

@EAMann Ой, прости за это. Я не могу сохранить новые значения для параметров на странице параметров. Да, я думаю, что я должен следовать пресс-кодам.
Создан 15-03-2011 06:04 Mamaduka

ev_options_init () бессмысленно. При каждом запросе он обновляет theme_evolutionary_options с результатом ev_theme_settings_defaults (), таким образом всегда переопределяя любые пользовательские настройки, сохраненные через API.
Создан 16-03-2011 06:41 TheDeadMedic

Мы говорим по кругу. Конечно, как написано, ev_options_init () бессмысленно. Но суть в том, что функция написана неправильно.
Создан 16-03-2011 07:28 Chip Bennett

Я исправил, но результат тот же, думаю, я совершил ужасную ошибку при написании кода. Нет проблем, я перепишу опции темы, следуя руководству PressCoder (это работает для). С кодом Чипа все в порядке, я загружаю тему Oenology, и она отлично работает. Я просто хотел знать, чего мне не хватает и что я делаю неправильно. Спасибо за помощь
Создан 17-03-2011 08:16 Mamaduka

Хорошо, я посмотрел на это еще немного, и я обнаружил еще одну проблему с вашим кодом - снова в вашей функции проверки. Вы сравниваете с $ ev_options вместо $ input.
Создан 18-03-2011 06:00 Chip Bennett

Спасибо, Чип, это была проблема с функцией проверки. Есть ли хорошие отзывы о проверке настроек?
Создан 18-03-2011 07:19 Mamaduka

Спасибо за ответ, я проверил весь учебник, прежде чем начать играть с настройками API. Я следовал учебнику Чипа Беннетта (goo.gl/UkeRl) при создании опций моей темы, и он использует тот же метод для добавления опций по умолчанию, я тоже попробовал add_option, но результат тот же
Создан 15-03-2011 03:06 Mamaduka

Не поймите меня неправильно, Чип отлично поработал, но он не придерживается лучших практик. Во-первых, он сохраняет параметры вручную, что побеждает объект API настроек, и он делает это при каждом запросе! Следуйте указаниям Otto или Press Coder.
Создан 15-03-2011 04:10 TheDeadMedic

@TheDeadMedic Спасибо за совет, сейчас попробую с примером кода для прессы
Создан 15-03-2011 06:20 Mamaduka

На самом деле, насколько я знаю, я не сохраняю настройки вручную; скорее я просто добавляю значения по умолчанию. Если настройки уже существуют, то проверка по умолчанию ничего не делает. Я бы не хотел запускать проверку по умолчанию для каждой инициализации, но, к сожалению, у тем нет хуков активации / деактивации. Таким образом, я не могу точно следовать модели плагинов Отто. Если у вас есть альтернативные предложения, я бы хотел их услышать, потому что я стараюсь следовать лучшим практикам. Мой пример очень полезен для обучения, и я с радостью предложу любые улучшения. Отредактировано, чтобы добавить: это мой первый
Создан 15-03-2011 08:07 Chip Bennett

Рад видеть вас здесь и надеемся, что вы найдете сайт интересным и полезным! По теме активации темы - ее можно эмулировать до некоторой степени, возник вопрос по этому поводу - Theme Activate Hook.
Создан 15-03-2011 08:56 Rarst

Спасибо, Чип. Я изменил код, но результаты остались прежними, он просто не сохраняет изменения и использует только значения по умолчанию. Я думаю, что что-то упустил, но не мог понять это :(
Создан 15-03-2011 09:46 Mamaduka

Это потому, что он вообще не слушает $ _POST. После первого сохранения параметров по умолчанию значение false === $ ev_options никогда не будет оцениваться как true, поэтому параметры постоянно обновляются со значениями по умолчанию.
Создан 16-03-2011 12:48 TheDeadMedic

Нет это не правда. если значение if (false === $ ev_options) равно FALSE, то функция ничего не делает. Он просто записывает существующие значения обратно в базу данных. Только если if (false === $ ev_options) оценивается как TRUE, значения по умолчанию записываются.
Создан 16-03-2011 03:14 Chip Bennett

Да, я запутался здесь. Идет так много кода, что я не могу сказать, что вы защищаете. Другими словами, мы сейчас на одной стороне страницы;)
Создан 16-03-2011 09:54 TheDeadMedic

Думал, что мы доберемся в конце концов;)
Создан 17-03-2011 02:32 Chip Bennett

@Mamaduka:
Вот почему ваши настройки не обновляются. Ваша функция проверки неверна. Для остроумия:
function ev_options_validate ($ input) {
    $ ev_options = get_option ('theme_evolutionary_options');
    $ valid_input = $ ev_options;

    $ ev_options ['color_scheme'] = array_key_exists ($ ev_options ['color_scheme'], ev_get_valid_color_schemes ())? $ ev_options ['color_scheme']: 'blue';
    $ ev_options ['copytright'] = wp_kses_data ($ ev_options ['copyright']);

    вернуть $ valid_input;
}

Вы обновляете $ ev_options, но возвращаете $ valid_input. Вам нужно обновить $ valid_input, а не $ ev_options.
Попробуйте это вместо этого:
function ev_options_validate ($ input) {
    $ ev_options = get_option ('theme_evolutionary_options');
    $ valid_input = $ ev_options;

    $ valid_input ['color_scheme'] = array_key_exists ($ ev_options ['color_scheme'], ev_get_valid_color_schemes ())? $ ev_options ['color_scheme']: 'blue';
    $ valid_input ['copytright'] = wp_kses_data ($ ev_options ['copyright']);

    вернуть $ valid_input;
}

Посмотри, исправит ли это твою проблему?
ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ:
Ваша следующая проблема в функции проверки заключается в том, что вы сравниваете $ ev_options с / против самого себя, когда вам нужно сравнить $ input с $ valid_input.
Вместо этого:
function ev_options_validate ($ input) {
    $ ev_options = get_option ('theme_evolutionary_options');
    $ valid_input = $ ev_options;

    $ valid_input ['color_scheme'] = array_key_exists ($ ev_options ['color_scheme'], ev_get_valid_color_schemes ())? $ ev_options ['color_scheme']: 'blue';
    $ valid_input ['copytright'] = wp_kses_data ($ ev_options ['copyright']);

    вернуть $ valid_input;
}

Попробуй это:
function ev_options_validate ($ input) {
    $ ev_options = get_option ('theme_evolutionary_options');
    $ valid_input = $ ev_options;

    $ valid_input ['color_scheme'] = array_key_exists ($ input ['color_scheme'], ev_get_valid_color_schemes ())? $ input ['color_scheme']: 'blue';
    $ valid_input ['copytright'] = wp_kses_data ($ input ['copyright']);

    вернуть $ valid_input;
}

В частности, измените это:
$ valid_input ['color_scheme'] = array_key_exists ($ ev_options ['color_scheme'], ev_get_valid_color_schemes ())? $ ev_options ['color_scheme']: 'blue';
$ valid_input ['copytright'] = wp_kses_data ($ ev_options ['copyright']);

К этому:
$ valid_input ['color_scheme'] = array_key_exists ($ input ['color_scheme'], ev_get_valid_color_schemes ())? $ input ['color_scheme']: 'blue';
$ valid_input ['copytright'] = wp_kses_data ($ input ['copyright']);

И тогда, я думаю, ваши варианты должны работать.
@TheDeadMedic:
API настроек обрабатывает просмотр любых данных $ POST. Это не проблема.
Что касается обновления настроек по умолчанию при инициализации, вот мой оригинальный пример кода:
function oenology_options_init () {
     // устанавливаем параметры равными значениям по умолчанию
     глобальные $ oenology_options;
     $ oenology_options = get_option ('theme_oenology_options');
     if (false === $ oenology_options) {
          $ oenology_options = oenology_get_default_options ();
     }
     update_option ('theme_oenology_options', $ oenology_options);
}
// Инициализировать параметры темы
add_action ('after_setup_theme', 'oenology_options_init', 9);

А вот код Мамадуки:
function ev_options_init () {
    // Установить параметры равными значениям по умолчанию
    глобальные $ ev_options;
    $ ev_options = ev_theme_settings_defaults ();
    if (false === $ ev_options) {
        $ ev_options = ev_theme_settings_defaults ();
    }
    update_option ('theme_evolutionary_options', $ ev_options);
}

add_action ('after_setup_theme', 'ev_options_init', 9);

Вы видите разницу? Существует критическое изменение от oenology_options_init () к ev_options_init (), к остроумию:
Это:
глобальные $ oenology_options;
$ oenology_options = get_option ('theme_oenology_options');

По сравнению с этим:
глобальные $ ev_options;
$ ev_options = ev_theme_settings_defaults ();

Таким образом, в ev_options_init () функция фактически ничего не делает из-за изменения.
Создан 18-03-2011 06:42

Проблема в том, что они спасаются ... просто вы всегда сохраняете настройки по умолчанию!
$ ev_options = ev_theme_settings_defaults ();
if (false === $ ev_options) {
    $ ev_options = ev_theme_settings_defaults ();
}
update_option ('theme_evolutionary_options', $ ev_options);

И это выполняется при каждой загрузке страницы (это связано с действием after_theme_setup).
Не говоря уже о том, что оператор if не имеет смысла ($ ev_options никогда не будет ложным).
Кажется, вы не совсем поняли API настроек. Все дело в том, что вам не нужно сохранять параметры самостоятельно, WordPress сделает это за вас!
Я уверен, что вы уже проверили API настроек, хотя его немного не хватает. Далее подробно расскажем о том, как использовать API для хранения параметров в виде массива.

Пресс-кодеры: объяснение настроек API
Otto: руководство по настройке API
Создан 15-03-2011 02:28 TheDeadMedic30.7k44169

Я думаю, что вижу проблему, Мамакука.
Вы должны вызывать get_option (), а не функцию по умолчанию, здесь:
    / **
 * Настройка начальных параметров темы
 * /
function ev_options_init () {
    // Установить параметры равными значениям по умолчанию
    глобальные $ ev_options;
    $ ev_options = ev_theme_settings_defaults ();
    if (false === $ ev_options) {
        $ ev_options = ev_theme_settings_defaults ();
    }
    update_option ('theme_evolutionary_options', $ ev_options);
}

add_action ('after_setup_theme', 'ev_options_init', 9);

Это:
глобальные $ ev_options;
$ ev_options = ev_theme_settings_defaults ();

Должно быть вместо этого:
глобальные $ ev_options;
$ ev_options = get_option ('theme_evolutionary_options');

В противном случае вы делаете, как указано в TheDeadMedic: сохранение параметров по умолчанию для каждой инициализации.
Создан 15-03-2011 08:35 Chip Bennett47.5k667141