【问题标题】:Woocommerce Shipping method based on user role基于用户角色的 Woocommerce Shipping 方法
【发布时间】:2021-06-14 16:35:07
【问题描述】:

我想根据用户角色启用或禁用运输方式。 我已经测试了各种不同的代码和方法,到目前为止都没有奏效。

当前代码:(来源:stacklink

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;
}

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

另外,为什么需要“||!is_user_logged_in()”?我只需要为批发用户禁用 3 种方法中的 2 种,不需要影响任何其他角色,也不需要影响客人。这几天一直在和这个作斗争。

另外,关于强制 Wordpress 和 Woocommerce 更新,而不是在缓存中游来游去的任何建议?

提前致谢。

【问题讨论】:

    标签: php wordpress woocommerce user-roles shipping-method


    【解决方案1】:

    您混淆了运输方式“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 文件中。它应该可以工作。

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

    【讨论】:

    • 嗯,这个 sn-p 关闭所有运输方式...??顺便说一句,您可能想在“未设置”行中添加一个分号;)但至少它正在做某事。谢谢!
    • 奇怪。我会做一些进一步的测试。对我来说,用户角色 b2b 没有可用的送货方式,而所有其他人都有 3 个。
    • 我不知道为什么,但这段代码对我不起作用。当我设置此代码时,所有用户的所有运输方式都消失了。所以它打破了运输方式(对我来说)。
    • @Pandusen 更新了代码:这次它会起作用(先清空你的购物车)。
    • 谢谢。这样可行!我更改了它,为 b2b 隐藏 2 种方法,并为其他所有人隐藏 1 种,以便 b2b 有自己的运输方式。它工作得很好,看起来像石头一样坚固。所以看起来大部分的古怪来自“current_user_can”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2020-10-18
    • 2021-07-11
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多