如何在出错时停止保存表单数据实际上是“设置已保存”消息不一定意味着数据库中的选项/值已实际更新;因为如果旧值和新值相同,意味着没有更改,那么旧值将不会在数据库中重新保存或覆盖。但是,您仍然可以看到“保存的设置”消息,指示表单(数据)已成功提交和处理,没有错误。
因此,当表单数据包含空值或无效值时,应返回旧选项,而不是空值array
。请看下面,这是您的代码,但经过了一些修改,希望您能够理解我的意思:
function input_validation( $input ){
//settings_errors(\'custom_options\'); // <- this should NOT be here..
$options = get_option( \'custom_options\' ); // <- here\'s the OLD VALUE
// Create our array for storing the validated options
$output = array();
// Loop through each of the incoming options
foreach( $input as $key => $value ) {
... your code here ...
//check if its not empty
if(empty($value)){
add_settings_error(
\'custom_options\',
\'Missing value error\',
__(\'On or more fields can\\\'t be empty.\', \'custom\'),
\'error\'
);
//return array(); // <- here don\'t return empty array
return $options; // <- instead, return the old value
} // end if
} // end foreach
// Return the array processing any additional functions filtered by this action
return $output; // <- even if all form data are VALID, this/$output
// could still be the same as $options (i.e. there
// were no changes made)
}
//settings_errors(\'custom_options\'); // <- this should NOT be here..
&mdash;为什么不呢?
那是因为settings_errors()
该函数在自定义选项页上自动调用(前提是它是使用WordPress创建的Settings API), 因此,无需手动调用函数&mdash;只需添加设置错误,它们就会自动显示出来。
在settings page 基于设置APIsubmitted. 对于中定义的设置,应在验证回调函数期间添加错误register_setting()
.
&mdash;看见https://developer.wordpress.org/reference/functions/settings_errors/
如何在出错时阻止提交表单如果您只想确保表单字段都已填写,请添加(的HTML5属性)required
到字段的HTML。例如:
<input name="custom_options[option_1]" type="text" required>
<select name="custom_options[option_2]" required></select>
<textarea name="custom_options[option_3]" required></textarea>
使用JavaScript验证。下面是一个非常简单的示例:(使用jQuery)
<form method="post" action="options.php" id="my-form">
<input name="custom_options[option_1]" type="text" id="option-1">
<select name="custom_options[option_2]" id="option-2">
<option value="">Select</option>
<option value="1">One</option>
</select>
<textarea name="custom_options[option_3]" id="option-3"></textarea>
<input type="submit">
</form>
<script>
$(\'#my-form\').on(\'submit\', function(){
if ( // check if all fields are filled
$(\'#option-1\', this).val().length < 1 ||
$(\'#option-2\', this).val().length < 1 ||
$(\'#option-3\', this).val().length < 1
) {
alert(\'Please fill in all fields.\');
return false; // cancels the submit
}
});
</script>
尝试演示
here.
因此,基本上input_validation()
函数,已提交表单。为了防止这种情况发生,您可以使用上面提到的客户端验证&mdash;HTML5和jQuery验证。