WooCommerce Checkout - 验证用户角色和购物车内容
P粉545910687
P粉545910687 2024-04-03 11:58:52
0
1
619

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

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

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

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

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

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

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

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

编辑:

用户角色:Wwp_wholesaler

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

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

P粉545910687
P粉545910687

全部回复(1)
P粉014293738

当检测到 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 文件中(或插件中)。经过测试并可以工作。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!