在典型的 WooCommerce 设置中,如果您通过设置禁用了访客结账,那么所有客户在结账时都必须登录现有账户或注册新账户。这将确保每个订单都与一个用户账户绑定–这对商店管理来说很好,但对用户体验来说并不总是理想的。
问题出在哪里?未登录的回头客将不得不记住他们的凭据或手动重设密码,以便再次下单。如果他们跳过登录,试图用电子邮件结账,就会收到可怕的 “您的电子邮件地址已经注册了一个账户 ”的错误信息,订单将无法通过。
幸好,有一种方法可以绕过这一切。只需一个简单的 PHP 代码段,您就可以让用户以客人身份结账,前提是他们的账单电子邮件与现有客户匹配。WooCommerce 会将订单分配给他们的账户–无需登录!

PHP 代码段: 让现有客户以访客身份结账并将订单分配给客户
请注意:很明显,您的商店必须禁用访客结账,否则该代码段将毫无意义:

该代码段会检查结账时输入的账单电子邮件是否与现有的 WooCommerce 客户匹配。如果匹配,它就会悄悄告诉 WordPress,仅在该请求中将该客户视为 “已登录”–而无需实际登录或设置 cookie。
这样,WooCommerce 就不会尝试创建新账户(通常会出现 “电子邮件已存在 ”的错误),从而使结账顺利进行。
订单会自动分配给现有的客户账户。无需登录表单,无需重设密码,只需为回头客提供更顺畅的体验!
add_action( 'woocommerce_checkout_process', 'bbloomer_faux_login_for_existing_email' ); function bbloomer_faux_login_for_existing_email() { if ( is_user_logged_in() ) return; if ( empty( $_POST['billing_email'] ) ) return; $email = sanitize_email( $_POST['billing_email'] ); if ( email_exists( $email ) ) { $user = get_user_by( 'email', $email ); if ( $user ) { wp_set_current_user( $user->ID ); } } }
该代码段使用 woocommerce_checkout_process 操作钩子WooCommerce 结账流程。
它首先检查用户是否已登录–如果是,则什么也不做。然后,它从结账表单中抓取账单电子邮件并进行消毒。如果该电子邮件与 WordPress 现有用户匹配,它就会使用 wp_set_current_user() 为当前请求临时设置用户上下文。
这样,WooCommerce 就会认为顾客只是在结账期间登录,因此订单就会分配给正确的账户,而不会显示错误或要求输入密码。顾客在购买后将保持注销状态。
在哪里添加自定义代码?
您应将自定义 PHP 代码放在子主题的 functions.php 中,将自定义 CSS 代码放在 style.css 中。
除非您另有报告,否则这些代码仍然有效。要排除冲突,请暂时切换到 Storefront 主题,禁用除 WooCommerce 以外的所有插件,然后再次测试该代码段.