搜索

首页  >  问答  >  正文

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粉545910687281 天前814

全部回复(1)我来回复

  • P粉014293738

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

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

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

    代码:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    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( '<a href="%s" class="button">%s</a>', get_permalink(wc_get_page_id('shop')), __('Continue shopping', 'woocommerce') )

                ) );

            }

        }

    }

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

    回复
    0
  • 取消回复