停止在“保存更改”自定义选项页面上提交的标题表单

时间:2018-07-27 作者:Guillermo Teixeira

使用Wordpress的设置API,我想尝试在验证/清理失败时取消提交选项。

注册设置:

register_setting( \'mysettingspage\', \'custom_options\', \'input_validation\' );
我的验证功能:

function input_validation( $input ){

settings_errors(\'custom_options\');

$options = get_option( \'custom_options\' );

// Create our array for storing the validated options
$output = array();

// Loop through each of the incoming options
foreach( $input as $key => $value ) {

        // Check to see if the current option has a value. If so, process it.
        if( isset( $input[$key] ) ) {

            // Strip all HTML and PHP tags and properly handle quoted strings
            $output[$key] = strip_tags( stripslashes( $input[ $key ] ) );

        } // end if

        //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();
            } 

        } // end if


    } // end foreach

    // Return the array processing any additional functions filtered by this action
    return $output;
}
问题是,即使没有保存任何选项,wordpress仍然会显示一条消息“Settings saved”(设置已保存),并将选项的空数组保存在数据库中。

有没有办法改变这种行为?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

如何在出错时停止保存表单数据实际上是“设置已保存”消息不一定意味着数据库中的选项/值已实际更新;因为如果旧值和新值相同,意味着没有更改,那么旧值将不会在数据库中重新保存或覆盖。但是,您仍然可以看到“保存的设置”消息,指示表单(数据)已成功提交和处理,没有错误。

因此,当表单数据包含空值或无效值时,应返回旧选项,而不是空值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验证。

结束

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。