提问者:小点点

基于用户角色的WooCommerce发货方法


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

当前代码:(来源: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;
}

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

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

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

提前感谢。


共1个答案

匿名用户

您混淆了装运方法“方法Id”和装运方法“费率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活动子主题(或活动主题)的文件中。它应该工作。

别忘了清空购物车,清除缓存数据。