WooCommerce结账验证:B2B注册用户与购物车内容校验问题
解决方案:在结账提交前校验角色选择与购物车内容
问题核心在于常规WooCommerce钩子触发时,新用户角色尚未完成注册,无法通过当前用户角色判断。我们需要直接读取结账页面的角色选择字段值,提前完成校验。
实现逻辑:
- 拦截结账提交动作,获取访客选择的角色值
- 遍历购物车商品,检查是否包含「Normal」品类商品
- 若同时满足「选择B2B角色」+「购物车有Normal商品」,抛出错误阻止订单提交
代码实现(添加到主题functions.php或自定义插件):
add_action('woocommerce_checkout_process', 'check_b2b_role_and_normal_products'); function check_b2b_role_and_normal_products() { // 读取结账页面的角色选择字段值 if (isset($_POST['afreg_select_user_role']) && $_POST['afreg_select_user_role'] === 'wwp_wholesaler') { $has_normal_product = false; // 遍历购物车,检查商品是否属于Normal品类(替换为你的品类slug) foreach (WC()->cart->get_cart() as $cart_item) { $product_id = $cart_item['product_id']; // 此处替换'normal'为你实际的Normal品类slug if (has_term('normal', 'product_cat', $product_id)) { $has_normal_product = true; break; } } // 触发错误提示,阻止订单提交 if ($has_normal_product) { wc_add_notice(__('B2B客户无法购买常规品类商品,请移除购物车中的常规商品后再提交订单。', 'woocommerce'), 'error'); } } }
注意事项:
- 请将代码中的
'normal'替换为你实际的「Normal」商品品类slug(可在WordPress后台「商品-品类」中查看) woocommerce_checkout_process钩子会在订单提交前触发,能有效拦截不符合条件的请求- 无需重置购物车,直接通过错误提示引导用户调整购物车内容即可
内容的提问来源于stack exchange,提问作者helio
相关产品推荐
相关产品推荐

