失去理智:需要帮助删除基于 WordPress 用户角色的运费

问题描述 投票:0回答:1

我已经搜索了这个网站和其他网站,试图找到可以放入我的functions.php文件中的代码,以便某些用户/客人在结账时看不到“本地取货”选项。我的商店有 3 个用户角色:管理员、local_pickup_customer 和 customer。当客人或客户退房时,我希望取消设置本地取件。在尝试了无数代码之后,我决定并编辑了下面的代码,因为它对我来说似乎是最合乎逻辑的。我不喜欢寻找客户和客人来删除本地取货(这对于客人而言似乎更棘手),而是喜欢在用户角色不是管理员或 local_pickup_customer 时删除本地取货。

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    = 'local_pickup:2'; // The shipping rate ID to hide
    $targeted_user_roles = array('administrator', 'local_pickup_customer');  // 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;
}

我已经为此工作了几个小时,我快要疯了。我确保我有正确的rate_id(运行一些调试代码来获取它)。当我进行任何更改时,我确保清除浏览器和购物车缓存。对于客户或客人来说,本地取货选项不会消失。我做错了什么?

screenshot of rate_id

php wordpress user-roles
1个回答
0
投票

我建议循环遍历费率并使用更具体的匹配(使用

method_id
)来确定是否
unset
。如果需要,您可以使用此方法有效地取消设置多个。比如:

add_filter( 'woocommerce_package_rates', 'hide_local_pickup_for_users', 10, 2 );
function hide_local_pickup_for_users( $rates, $package ) {
    $targeted_rate_id    = 'local_pickup';
    $targeted_user_roles = array('administrator', 'local_pickup_customer');

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

    if ( empty($matched_roles) ) {
        foreach( $rates as $rate_key => $rate ) {
            if ( $rate->method_id === $targeted_rate_id ) {
                unset($rates[$rate_key]);
            }
        }
    }

    return $rates;
}

我还将优先级设置为 10 而不是 100,如我的示例所示。

© www.soinside.com 2019 - 2024. All rights reserved.