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'];
}
Или, если я подхожу к этому неправильно, если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен.
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
Ладно, разобрался. В функции, которая выполняет проверку, я мог бы получить исходные значения, которые были сохранены в базе данных, из функции 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'];
}