如何在WordPress插件设置保存前进行条件化验证?
WordPress 插件设置页条件校验与错误提示实现方案
你当前使用的 WordPress Settings API 的 sanitize 回调本身就是自定义校验的最佳挂载点,不需要额外引入其他处理流程,配合原生错误提示机制即可完整实现需求,具体实现步骤如下:
具体实现步骤
- 步骤1:在 sanitize 回调中补充校验逻辑
你现在用来做输入清理的函数,就是注册设置时传入的sanitize_callback对应函数,直接在这个函数里追加校验规则即可,校验不通过时调用add_settings_error()抛出错误,同时不要将非法值存入配置,可选择保留上一次的合法值。
// 函数名替换为你自己注册设置时绑定的sanitize回调函数名 function stwc_settings_sanitize( $input ) { // 先获取数据库中已保存的旧配置,校验不通过时可以 fallback 到旧值 $old_options = get_option( 'stwc_settings_options' ); $sanitary_values = []; // 原有清理逻辑保留 if ( isset( $input['stwc_ft_oosn_notice_1'] ) ) { $sanitary_values['stwc_ft_oosn_notice_1'] = sanitize_text_field( $input['stwc_ft_oosn_notice_1'] ); } // ---------------- 新增自定义校验逻辑 ---------------- // 示例1:判断复选框勾选时,对应文本框不能为空 $is_checked = isset( $input['stwc_ft_oosn_enable'] ) && 'yes' === $input['stwc_ft_oosn_enable']; if ( $is_checked && empty( $sanitary_values['stwc_ft_oosn_notice_1'] ) ) { // 抛出错误:第一个参数为你设置页的slug(即do_settings_sections的参数),第二个为错误ID,第三个为错误提示内容,第四个为错误类型 add_settings_error( 'settings-admin', 'stwc_oosn_notice_empty', '启用缺货通知功能时,通知文本内容不能为空', 'error' ); // 校验不通过, fallback 到旧值,避免空值覆盖原有配置 $sanitary_values['stwc_ft_oosn_notice_1'] = $old_options['stwc_ft_oosn_notice_1'] ?? ''; } // 示例2:校验字段必须为正整数 if ( isset( $input['stwc_ft_oosn_limit'] ) ) { $num = intval( $input['stwc_ft_oosn_limit'] ); if ( $num <= 0 ) { add_settings_error( 'settings-admin', 'stwc_oosn_limit_invalid', '可通知上限必须为大于0的正整数', 'error' ); $sanitary_values['stwc_ft_oosn_limit'] = $old_options['stwc_ft_oosn_limit'] ?? 10; } else { $sanitary_values['stwc_ft_oosn_limit'] = $num; } } return $sanitary_values; }
- 步骤2:确认错误提示正常显示
WordPress 默认会在使用 Settings API 的设置页顶部自动输出add_settings_error()抛出的提示,如果你当前页面没有自动显示,可以在你设置页的表单代码开头手动调用输出函数即可:
<form method="post" action="options.php"> <?php // 手动输出设置错误提示,加在settings_fields之前即可 settings_errors( 'settings-admin' ); settings_fields( 'settings_option_group' ); do_settings_sections( 'settings-admin' ); submit_button(); ?> </form>
- 步骤3:实现错误字段红色边框效果
你可以在输出每个设置字段的回调函数中,判断对应字段是否有抛出错误,给输入框追加错误样式类,再通过后台CSS实现红框效果。
首先是字段输出回调的示例:
// 函数名替换为你输出stwc_ft_oosn_notice_1字段的回调函数名 function stwc_output_notice_1_field() { $options = get_option( 'stwc_settings_options' ); $value = $options['stwc_ft_oosn_notice_1'] ?? ''; // 判断当前字段是否有对应错误 $has_error = ! empty( get_settings_errors( 'stwc_oosn_notice_empty' ) ); $class = $has_error ? 'regular-text stwc-field-error' : 'regular-text'; ?> <input type="text" name="stwc_settings_options[stwc_ft_oosn_notice_1]" class="<?php echo esc_attr( $class ); ?>" value="<?php echo esc_attr( $value ); ?>"> <?php }
然后追加后台CSS,通过admin_enqueue_scripts钩子加载:
function stwc_enqueue_admin_css( $hook ) { // 只在你的设置页加载CSS,$hook的值可以通过后台页面地址的page参数判断,这里示例为settings_page_settings-admin if ( $hook !== 'settings_page_settings-admin' ) { return; } wp_add_inline_style( 'wp-admin', '.stwc-field-error { border-color: #dc3232 !important; box-shadow: 0 0 0 1px #dc3232 !important; }' ); } add_action( 'admin_enqueue_scripts', 'stwc_enqueue_admin_css' );
- 可选补充:前端预校验
你可以额外加一段JS在设置页做前端预校验,用户提交表单时就提示错误,减少后端请求,但注意前端校验仅做体验优化,后端校验必须保留,避免恶意请求绕开前端规则。
内容的提问来源于stack exchange,提问作者Jason 'Slingshot' Miller
相关产品推荐
相关产品推荐

