首页  >  问答  >  正文

WooCommerce Checkout - 验证用户角色和购物车内容

我在 WooCommerce 的结帐流程方面面临挑战。

我使用“B2B for WooCommerce”插件来区分常规产品和 B2B 产品。场景如下:

1 - 未注册的访问者将“常规”类别中的产品(默认情况下可供未注册的访问者使用)添加到其购物车。

2 - 在结帐页面上,访问者决定注册为 B2B 客户(通过结帐页面上的表单选择字段)。

3 - 注册和结账过程同时发生在这个页面上。

如果用户注册为 B2B 客户并且购物车中有“常规”产品,我希望阻止下订单。 由于这两个操作(注册和结账)同时发生,典型的 WooCommerce 挂钩无法按预期工作。

如何在结账过程中验证正在注册的用户角色和购物车内容,并在满足条件时阻止订单?或者也许有更好、更简单的方法来做到这一点?

我尝试了重置购物车并重新加载页面的功能。

编辑:

用户角色:Wwp_wholesaler

我创建了两个 WooCommerce 产品类别:普通和批发。 所有访客都可以看到“普通”。 在注册该角色后,“Wwp_wholesaler”就可以看到“批发”。

选择字段的名称属性为:“afreg_select_user_role”。 选项的值属性为“customer”(对于普通客户)和“wwp_wholesaler”(对于批发商)。

P粉545910687P粉545910687222 天前735

全部回复(1)我来回复

  • P粉014293738

    P粉0142937382024-04-04 00:01:07

    当检测到 B2B 客户的购物车中有常规商品时,以下代码将提前停止结账流程。在这种情况下,常规商品将从购物车中删除,并抛出错误消息,从而避免下订单。

    注意:提供的用户角色别名是错误的,因为用户角色别名没有大写。

    代码:

    add_action( 'woocommerce_checkout_create_order', 'process_checkout_creating_order',  10, 2  );
    function process_checkout_creating_order( $order, $data ) {
        global $current_user;
    
        $targeted_field = 'afreg_select_user_role'; // Checkout field key to target
        $targeted_role  = 'wwp_wholesaler'; // User role slug (for B to B)
        $targeted_term  = 'Normal'; // Category term for Regular items
    
        // Targeting B to B user role only
        if( ( isset($data[$targeted_field]) && $data[$targeted_field] === $targeted_role ) 
        || in_array( $targeted_role, $current_user->roles ) ) {
            $cart = WC()->cart; //  Cart live object
            $item_keys_found = array(); // Initializing
    
            // Loop through cart items to search for "regular" items
            foreach ( $cart->get_cart() as $item_key => $item ) {
                if ( has_term( $targeted_term, 'product_cat', $item['product_id']) ) {
                    $item_keys_found[] = $item_key;
                }
            }
            // If regular items are found
            if ( count($item_keys_found) > 0 ) {
                // Loop through regular item keys (and remove each)
                foreach ( $item_keys_found as $item_key ) {
                    $cart->remove_cart_item( $item_key );
                }
                // Throw an error message, avoiding saving and processing the order
                throw new Exception( 
                    sprintf( __('You are not allowed to purchase "Regular" items.'.
                    ' %d "Regular" %s been removed from cart. %s', 'woocommerce'),
                        count($item_keys_found),
                        _n('item has', 'items have', count($item_keys_found), 'woocommerce'),
                        sprintf( '%s', get_permalink(wc_get_page_id('shop')), __('Continue shopping', 'woocommerce') )
                ) );
            }
        }
    }
    

    代码位于子主题的functions.php 文件中(或插件中)。经过测试并可以工作。

    回复
    0
  • 取消回复