API настроек - ввод всегда обновляется после проверки


Я слежу за книгой Wordpress и пытаюсь создать плагин, и у меня есть страница опций.

На этой странице у меня есть два текстовых поля (значения которых хранятся в одном массиве). Я пытаюсь добавить пользовательскую проверку (например, если она пуста). Проверка задается в третьем аргументе функции register_setting.

Однако в книге нет примеров какой-либо возможной проверки (просто использование функций Wordpress для очистки ввод).

Чтобы получить сообщения об ошибках, показывающие, что я перешел по этой ссылке: https://codex.wordpress.org/Function_Reference/add_settings_error

Итак, в функции проверки я сделал что-то вроде этого:

if( $input['field_1'] == '' ) {

    $type = 'error';
    $message = __( 'Error message for field 1.' );

    add_settings_error(
        'uniq1',
        esc_attr( 'settings_updated' ),
        $message,
        $type
    ); 

} else {
    $input['field_1'] = sanitize_text_field( $input['field_1'];
}

if( $input['field_2'] == '' ) {

    $type = 'error';
    $message = __( 'Error message for field 2.' );

    add_settings_error(
        'uniq2',
        esc_attr( 'settings_updated' ),
        $message,
        $type
    ); 

} else {
     $input['field_2'] = sanitize_text_field( $input['field_2']
}

return $input;

На чем я застрял, так это на том, как НЕ обновлять это значение, если оно попадает в состояние ошибки. То, что у меня есть в настоящее время, например, с пустым значением, отобразит правильное сообщение об ошибке, но все равно обновит значение до пустого.

Есть ли какой-нибудь способ пройти через старые значения этой функции, чтобы я мог установить значение на старое, если оно соответствует условию ошибки, например:

if( $input['field_1'] != '' ) {

    $type = 'error';
    $message = __( 'Error message for field 1.' );

    add_settings_error(
        'uniq1',
        esc_attr( 'settings_updated' ),
        $message,
        $type
    ); 

    $input['field_1'] = "OLD VALUE";

} else {
    $input['field_1'] = sanitize_text_field( $input['field_1'];
}

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

Author: thairish, 2016-07-27

2 answers

Похоже, что ваш аргумент проверки является отрицательным.

if ($foo != "") { //means if foo not equal to empty space
  // do something when not empty
  // here you are setting an error
} else {
  // do something when empty
  // here you are trying to do your normal operation
}

Вы устанавливаете ошибку, когда у вас есть данные, а затем пытаетесь обработать данные, когда у вас их нет.

Попробуйте изменить свой != на ==

Или измените порядок, в котором вы обрабатываете данные в if

 1
Author: stoi2m1, 2016-07-27 19:58:30

Ладно, разобрался. В функции, которая выполняет проверку, я мог бы получить исходные значения, которые были сохранены в базе данных, из функции get_option.

//The option name which is set in the second argument in the register_setting function
get_option( 'option_name' ); 

После этого я мог бы установить входное значение на старое значение, если было выполнено условие ошибки.

$old_options = get_option( 'option_name' );

if( condition ) {

    //$input being the argument name for the validation function
    $input['option_name'] = $old_options['option_name'];

}
 0
Author: thairish, 2016-07-27 20:47:13