You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:17:43