Woocommerce:覆盖现有电子邮件所需的登录。将订单添加到用户帐户

Woocommerce:覆盖现有电子邮件所需的登录。将订单添加到用户帐户,woocommerce,checkout,code-snippets,Woocommerce,Checkout,Code Snippets,电子商务设置: 来宾结账已禁用 启用签出期间创建帐户(用户和passowrd自动生成) 如果用户已注册。但没有登录。 使用签出错误 “已使用您的电子邮件地址注册了一个帐户。请登录。” 如何将此重写为 完成订单,并将订单绑定到现有帐户。 提示用户下次登录以加快签出速度 找不到任何可以执行此操作的代码段或模块 还没有。乐意报答 这个没有钩子。您可能需要修改WC core(plugins/woocommerce/includes/class WC checkout.php)行#935中的proce

电子商务设置:

  • 来宾结账已禁用
  • 启用签出期间创建帐户(用户和passowrd自动生成)
如果用户已注册。但没有登录。 使用签出错误 “已使用您的电子邮件地址注册了一个帐户。请登录。”

如何将此重写为 完成订单,并将订单绑定到现有帐户。 提示用户下次登录以加快签出速度

找不到任何可以执行此操作的代码段或模块


还没有。乐意报答

这个没有钩子。您可能需要修改WC core(plugins/woocommerce/includes/class WC checkout.php)行#935中的process_customer函数-请记住,不鼓励编辑core(更新后,您的更改将丢失)

如果您已启用“允许客户在签出时登录”,则会出现“从签出页面登录”选项

protected function process_customer( $data ) {
        $customer_id = apply_filters( 'woocommerce_checkout_customer_id', get_current_user_id() );

        if ( ! is_user_logged_in() && ( $this->is_registration_required() || ! empty( $data['createaccount'] ) ) ) {
            $username    = ! empty( $data['account_username'] ) ? $data['account_username'] : '';
            $password    = ! empty( $data['account_password'] ) ? $data['account_password'] : '';

                        if(email_exists($data['billing_email'])){
                        $creds = array();
                        $creds['user_login'] = $user_login;
                        $creds['user_password'] = $user_password;
                        $creds['remember'] = true;

                        $user = wp_signon($creds, false);

                        $customer_id = $user->ID;

                        wp_set_current_user($customer_id, $user_login);
                        wp_set_auth_cookie($customer_id, true, false);
                        do_action('wp_login', $user_login);
                        }else{
                        $customer_id = wc_create_new_customer( $data['billing_email'], $username, $password );
                        }

            if ( is_wp_error( $customer_id ) ) {
                throw new Exception( $customer_id->get_error_message() );
            }

            wp_set_current_user( $customer_id );
            wc_set_customer_auth_cookie( $customer_id );

            // As we are now logged in, checkout will need to refresh to show logged in data.
            WC()->session->set( 'reload_checkout', true );

            // Also, recalculate cart totals to reveal any role-based discounts that were unavailable before registering.
            WC()->cart->calculate_totals();
        }

        // On multisite, ensure user exists on current site, if not add them before allowing login.
        if ( $customer_id && is_multisite() && is_user_logged_in() && ! is_user_member_of_blog() ) {
            add_user_to_blog( get_current_blog_id(), $customer_id, 'customer' );
        }

        // Add customer info from other fields.
        if ( $customer_id && apply_filters( 'woocommerce_checkout_update_customer_data', true, $this ) ) {
            $customer = new WC_Customer( $customer_id );

            if ( ! empty( $data['billing_first_name'] ) ) {
                $customer->set_first_name( $data['billing_first_name'] );
            }

            if ( ! empty( $data['billing_last_name'] ) ) {
                $customer->set_last_name( $data['billing_last_name'] );
            }

            // If the display name is an email, update to the user's full name.
            if ( is_email( $customer->get_display_name() ) ) {
                $customer->set_display_name( $data['billing_first_name'] . ' ' . $data['billing_last_name'] );
            }

            foreach ( $data as $key => $value ) {
                // Use setters where available.
                if ( is_callable( array( $customer, "set_{$key}" ) ) ) {
                    $customer->{"set_{$key}"}( $value );

                    // Store custom fields prefixed with wither shipping_ or billing_.
                } elseif ( 0 === stripos( $key, 'billing_' ) || 0 === stripos( $key, 'shipping_' ) ) {
                    $customer->update_meta_data( $key, $value );
                }
            }

            /**
             * Action hook to adjust customer before save.
             *
             * @since 3.0.0
             */
            do_action( 'woocommerce_checkout_update_customer', $customer, $data );

            $customer->save();
        }

        do_action( 'woocommerce_checkout_update_user_meta', $customer_id, $data );
    }