基于用户角色的 Woocommerce 运输方法

Woocommerce Shipping method based on user role

我想根据用户角色启用或禁用送货方式。 我已经测试了各种不同的代码和方法,none 目前为止有效。

当前代码:(来源:

add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 30, 2 );
function hide_shipping_method_based_on_user_role( $rates, $package ) {

    $shipping_id = 'shipmondo:3';

    foreach( $rates as $rate_key => $rate ){
        if( $rate->method_id === $shipping_id ){
            if( current_user_can( 'b2b' ) || ! is_user_logged_in()){
                unset($rates[$rate_key]);
                break;
            }
        }
    }
    return $rates;
}

(也测试了原始代码段,没有更改,接受用户角色) 对我不起作用。我也用 'local_pickup' 测试过它,它有时确实有效,但似乎对浏览器缓存和会话非常敏感。我还需要的是 3 种方法,它们以相同的名称调用,但用子编号分隔它们:shipmondo:3、shipmondo:4 等(在“值”下的浏览器检查中找到)有还有一个叫做 ID 的东西,它看起来像: 'shipping_method_0_shipmondo3' 不知道我是否可以使用它,但是当代码没有正确更新时,很难弄清楚。该片段来自 2018 年,因此它可能已经过时了,但我发现的较新片段基于相同的原理,并且看起来并没有太大不同。

此外,为什么需要“|| !is_user_logged_in()”?我只需要为批发用户禁用 3 种方法中的 2 种,不需要影响任何其他角色,也不需要来宾。已经为此奋斗了好几天。

此外,关于强制 Wordpress 和 Woocommerce 进行更新而不是在缓存中游荡有什么建议吗?

提前致谢。

您混淆了送货方式“Method Id”和送货方式“Rate Id”。您的代码也可以简化。请尝试以下操作:

add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 100, 2 );
function hide_specific_shipping_method_based_on_user_role( $rates, $package ) {
    // Here define the shipping rate ID to hide
    $targeted_rate_id    = 'shipmondo:3'; // The shipping rate ID to hide
    $targeted_user_roles = array('b2b');  // The user roles to target (array)

    $current_user  = wp_get_current_user();
    $matched_roles = array_intersect($targeted_user_roles, $current_user->roles);

    if( ! empty($matched_roles) && isset($rates[$targeted_rate_id]) ) {
        unset($rates[$targeted_rate_id]);
    }
    return $rates;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。

不要忘记清空您的购物车,以清除运输缓存数据。