如何阻止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);
关键说明
添加请求场景判断
通过检查POST参数中的register(普通注册表单标识)或woocommerce_register(AJAX注册动作),确保只有用户主动提交注册表单时才执行自定义逻辑,页面刷新时因无提交请求会直接跳过。修正钩子返回值
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
相关产品推荐
相关产品推荐

