WooCommerce自定义设置插件许可证密钥验证错误提示不显示求助
解决WooCommerce后台许可证密钥错误提示不显示的问题
嘿,我明白你遇到的问题了——明明验证逻辑没问题,错误HTML也出现在检查器里,但页面上就是看不到提示。核心原因在于你在sanitize回调里直接添加admin_notices动作的时机不对:当保存设置时,WooCommerce会触发页面重定向,当前请求里的admin_notices输出会被重定向覆盖,就算HTML存在,用户也看不到刷新后的提示。
下面给你两种靠谱的解决方案:
方案一:使用临时存储(Transient)传递错误信息
这种方法通过临时存储保存错误信息,在页面刷新后读取并显示,确保提示能正常出现:
步骤1:修改验证回调,存储错误信息
function filter_woocommerce_admin_settings_sanitize_option_tlicense( $value, $option, $raw_value ) { // 这里替换成你实际的密钥验证逻辑,比如$is_valid = your_license_validation_function($raw_value); $is_valid = false; // 示例:标记密钥无效 if ( !$is_valid ) { // 存储错误信息,有效期10秒(足够完成页面重定向) set_transient( 'tlicense_invalid_error', 'Wrong license key', 10 ); // 返回之前的有效值,避免保存无效密钥 return get_option( 'tlicense' ); } return $value; }; add_filter( "woocommerce_admin_settings_sanitize_option_tlicense", 'filter_woocommerce_admin_settings_sanitize_option_tlicense', 10, 3 );
步骤2:添加钩子显示错误信息
function display_tlicense_invalid_error() { $error_message = get_transient( 'tlicense_invalid_error' ); if ( $error_message ) { // 输出标准的WordPress错误提示框,确保样式正常 echo '<div id="message" class="notice notice-error is-dismissible"><p>' . esc_html( $error_message ) . '</p></div>'; // 显示后删除临时存储,避免重复提示 delete_transient( 'tlicense_invalid_error' ); } } add_action( 'admin_notices', 'display_tlicense_invalid_error' );
方案二:使用WooCommerce自带的通知系统
WooCommerce有内置的通知机制,直接用wc_add_notice更贴合WooCommerce的生态:
function filter_woocommerce_admin_settings_sanitize_option_tlicense( $value, $option, $raw_value ) { // 替换成你的实际验证逻辑 $is_valid = false; if ( !$is_valid ) { // 添加WooCommerce错误通知,会自动在后台设置页面显示 wc_add_notice( 'Wrong license key', 'error' ); // 返回之前的有效值,不保存无效密钥 return get_option( 'tlicense' ); } return $value; }; add_filter( "woocommerce_admin_settings_sanitize_option_tlicense", 'filter_woocommerce_admin_settings_sanitize_option_tlicense', 10, 3 );
注意点
- 记得返回之前的有效选项值(
get_option('tlicense')),避免把无效密钥保存到数据库里。 - 用
esc_html()转义错误文本,防止XSS安全问题。 - 方案一的临时存储有效期不用太长,10秒足够覆盖页面重定向的时间。
内容的提问来源于stack exchange,提问作者Redman
相关产品推荐
相关产品推荐

