wordpress 基于用户角色和小计金额的WooCommerce运输方法

vc6uscn9  于 2023-06-21  发布在  WordPress
关注(0)|答案(1)|浏览(139)

我需要添加两个不同的运费,这取决于用户的角色,使购买。我的角色是“wholesale_customer”,不应支付运费。但是,如果购物车的小计等于或小于€90,则必须阻止购买,并在结账时添加消息。(请记住,您必须达到90欧元的金额)
另一个选项是所有其他WordPress角色,如果他们的购物车小计为40欧元或更少,则需要支付5欧元的运费。
我已经在WooCommerce中配置了航运,我已经创建了两种免费送货方式,最低订单金额为40欧元,另一种为90欧元。
问题是,具有“wholesale_customer”角色的用户,当他达到€40的金额时,也被启用该免费送货方法,这不应该发生,因为对于此用户角色(“wholesale_customer”),如果购买超过€90的最低金额,则送货是免费的。
我以以下方式在WooCommerce中配置了发货,创建了2种发货方法:- 一个有“最低数量要求”在€90

  • 另一个有“最低数量要求”在€40
  • 其中一个运费为0欧元。

我已经尝试添加以下功能来添加以获得我所需要的,但所有的运输方法始终启用,所以零售运输方法的“最低€40免费送货”,也被激活的用户与角色批发_客户'这不应该发生,作为用户与此角色将受益于不是他们的好处.
我展示了一些代码,我已经尝试做我正在寻找的,因为我做了大量的测试。只有我没有办法添加我在演示文稿中提到的角色'wholesale_customer'的文本显示WooCommerce设置的图像

function custom_shipping_methods_visibility( $available_methods ) {
     
        $subtotal = WC()->cart->subtotal;
        
        $user = wp_get_current_user();
        $user_roles = $user->roles;
        
        // Check user role and cart subtotal to show/hide shipping methods
        if ( in_array( 'wholesale_customer', $user_roles ) && $subtotal <= 70 ) {
            unset( $available_methods['flat_rate:13'] );
        } elseif ( $subtotal <= 30 ) {
            unset( $available_methods['flat_rate:9'] );
        }
        
        return $available_methods;
    }
    add_filter( 'woocommerce_package_rates', 'custom_shipping_methods_visibility', 10, 1 );

////////////////////

// Adds a custom function to filter shipping methods based on cart role and subtotal
    function custom_shipping_methods( $available_methods ) {
        // Get cart subtotal
        $subtotal = WC()->cart->subtotal;
        
        // Gets the role of the current user
        $user = wp_get_current_user();
        $user_roles = $user->roles;
        
        //Check user role and cart subtotal to adjust shipping methods
        if ( in_array( 'wholesale_customer', $user_roles ) && $subtotal < 70 ) {
            foreach ( $available_methods as $method_id => $method ) {
                // Hide the shipping methods if the user is a wholesaler and the subtotal is less than €70
                unset( $available_methods[ $method_id ] );
            }
            
            // Show a warning message
            wc_add_notice( 'Debes alcanzar un mínimo de 70€ en tu carrito para realizar el pedido.', 'error' );
        }
        
        return $available_methods;
    }
    add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 1 );

配置-1

配置-2:

配置-3:

配置-4:

vltsax25

vltsax251#

首先,为了防止“wholesale_customer”用户在购物车小计小于€90时下订单,以下代码将:

  • 在购物车和结账页面上显示相关提醒通知,
  • 在结账验证过程中显示错误通知,避免任何购买。
// Conditional function: Is user a Wholesale Customer
function is_a_wholesale_customer() {
    if ( ! is_user_logged_in() ) return false;

    return (bool) in_array( 'wholesale_customer', wp_get_current_user()->roles );
}

// Conditional function: Is user a (normal) Customer
function is_a_normal_customer() {
    if ( ! is_user_logged_in() ) return false;

    return (bool) in_array( 'customer', wp_get_current_user()->roles );
}

// Conditional function: Is "wholesale_customer" allowed to order
function is_wholesale_customer_allowed_to_order() {
    // Check "wholesale_customer" user role and required subtotal
    return is_a_wholesale_customer() && WC()->cart->subtotal < 90 ? false : true;
}

// The notice text (for "wholesale_customer")
function wholesale_customer_text_error_notice(){
    return __('Please remember that you must reach an amount of €90', 'woocommerce');
}

// Notice reminder based on required subtotal (for "wholesale_customer")
add_action( 'woocommerce_before_cart', 'check_cart_subtotal_wholesale_customer' ); // cart
add_action( 'woocommerce_before_checkout_form', 'check_cart_subtotal_wholesale_customer' ); // checkout
function check_cart_subtotal_wholesale_customer() {
    if ( ! is_wholesale_customer_allowed_to_order() ) {
        wc_print_notice( wholesale_customer_text_error_notice() );
    }
}
// Checkout validation based on required subtotal (for "wholesale_customer")
add_action( 'woocommerce_checkout_process', 'wholesale_customer_checkout_validation' );
function wholesale_customer_checkout_validation() {
    if ( ! is_wholesale_customer_allowed_to_order() ) {
        wc_add_notice( wholesale_customer_text_error_notice(), 'error' ); // Displays an error notice
    }
}

对于运输方式,您的设置是正确的。
以下代码将根据您的用户角色(“wholesale_customer”和“customer”)和免费送货的最低购物车小计金额显示/隐藏送货方法。
对于“wholesale_customer”,所有运输方式将被禁用,直到购物车小计达到€90。
当免费送货将是可用的,所有其他运输方式将被隐藏。
对于您的2免费送货方式中的每一种,您都需要获得正确的运费ID。
如果购物车小计高于€90,请在您的结账页面送货部分,检查显示的每个免费送货选项的单选按钮(请参阅下面的屏幕截图):

现在您可以在下面的代码中设置您的两个免费送货方法速率ID:

// showing / Hidding shipping methods
add_filter( 'woocommerce_package_rates', 'filter_shipping_package_rates', 10, 2 );
function filter_shipping_package_rates( $rates, $package ) {
    // Settings
    $free_rate_ids  = array( 
        'wholesale_customer' => 'free_shipping:9', // Here set the free shipping rate ID for wholesale user
        'customer'           => 'free_shipping:11', // Here set the free shipping rate ID for customer user
    );

    $error_data['all_rates'] = array_keys($rates);
    
    // "Wholesale" user role
    if ( is_a_wholesale_customer() ) {
        $key = 'wholesale_customer';
        // show only "Wholesale" free shipping when available
        if( isset($rates[$free_rate_ids[$key]]) ) {
            return array( $free_rate_ids[$key] => $rates[$free_rate_ids[$key]] );
        } 
        // Hide all shipping methods (no free shipping available)
        else {
            return array();
        }
    } 
    // "Customer" user role
    elseif ( is_a_normal_customer() ) {
        $key = 'customer';
        // show only "Normal" free shipping when available
        if( isset($rates[$free_rate_ids[$key]]) ) {
            return array( $free_rate_ids[$key] => $rates[$free_rate_ids[$key]] );
        } 
    } 
    return $rates;
}

代码放在活动子主题(或活动主题)的functions.php文件中。测试和作品。
保存代码后,要刷新运输方式缓存数据,请不要忘记清空购物车 (或在Woocommerce运输设置中禁用,保存和启用,保存当前运输区域的相关运输方式)

相关问题