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

如何阻止woocommerce_registration_error_email_exists钩子在页面刷新时触发

解决WooCommerce woocommerce_registration_error_email_exists 钩子重复触发问题

你的代码存在两个核心问题:一是未判断触发场景是否为用户主动提交注册请求,二是返回值不符合钩子的预期规范,这导致钩子在页面刷新时被意外触发。以下是修复方案:

修正后的代码(适配普通表单+AJAX注册场景)

function registration_errors($error) {
    // 判断是否为注册提交请求:覆盖普通表单提交和AJAX注册两种情况
    $is_registration_submit = (isset($_POST['register']) && isset($_POST['email'])) 
        || (isset($_POST['action']) && $_POST['action'] === 'woocommerce_register');

    if ($is_registration_submit) {
        error_log('calls again');
        WC()->session->set('registration_error_message', 'An account is already registered with your email address. Please log in.');
    }

    // 必须返回原错误对象,否则会破坏WooCommerce的注册错误处理流程
    return $error;
}
add_filter('woocommerce_registration_error_email_exists', 'registration_errors', 10, 1);

关键说明

  1. 添加请求场景判断
    通过检查POST参数中的register(普通注册表单标识)或woocommerce_register(AJAX注册动作),确保只有用户主动提交注册表单时才执行自定义逻辑,页面刷新时因无提交请求会直接跳过。

  2. 修正钩子返回值
    woocommerce_registration_error_email_exists的作用是过滤邮箱已存在的错误对象,原代码返回home_url()会完全破坏WooCommerce的错误处理机制。必须返回传入的$error参数(WP_Error实例),才能保证注册流程的正常运行。

额外建议:如需跳转首页的正确方式

如果你的需求是在邮箱已存在时跳转到首页,建议改用woocommerce_registration_errors钩子(该钩子仅在注册验证阶段触发),代码示例:

function handle_registration_email_exists_redirect($errors, $username, $email) {
    if (isset($errors->errors['email_exists'])) {
        WC()->session->set('registration_error_message', 'An account is already registered with your email address. Please log in.');
        wp_redirect(home_url());
        exit;
    }
    return $errors;
}
add_filter('woocommerce_registration_errors', 'handle_registration_email_exists_redirect', 10, 3);

内容的提问来源于stack exchange,提问作者samie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:43