You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce更新后排除指定用户角色产品附加费代码失效

WooCommerce更新后附加费角色豁免逻辑失效修复

问题排查

原代码存在3个核心问题,在WooCommerce/PHP版本升级后触发失效:

  • 语法错误:匹配到豁免角色时返回未定义变量$fee,PHP低版本下该错误仅为提示级别,会歪打正着终止后续加费逻辑;PHP高版本会抛出警告中断执行流程,导致豁免逻辑完全失效。
  • 用户对象获取不可靠:WooCommerce高版本购物车费用计算支持缓存、REST API结算等场景,直接调用wp_get_current_user()可能拿到空对象或者错误的用户数据,导致角色判断失效。
  • 角色判断不兼容多角色场景:直接访问$user->role属性仅能读取用户的首个角色,若站点给用户配置了多个角色,会出现判断遗漏。

修复代码

直接替换原插件内的add_fees方法代码即可:

public function add_fees( $cart ) {
    // 校验购物车对象有效性,兼容WC高版本校验逻辑,避免后台页面误触发
    if ( ! is_a( $cart, 'WC_Cart' ) || ( is_admin() && ! defined( 'DOING_AJAX' ) ) ) {
        return;
    }

    $fees = $this->get_fees( $cart );
    if ( empty( $fees ) ) {
        return;
    }

    // 正确获取当前用户ID,兼容WC结算缓存场景
    $user_id = get_current_user_id();
    // 未登录用户正常收取附加费
    if ( $user_id === 0 ) {
        foreach ( $fees as $fee ) {
            $cart->add_fee( $fee['name'], $fee['amount'], $fee['taxable'], $fee['tax_class'] );
        }
        return;
    }

    $user = new WP_User( $user_id );
    $exempt_roles = array('b2b_silver_dp','distributore_dp','b2b_gold_dp','b2b_platinum_dp');
    // 读取用户所有角色做交集判断,兼容多角色场景
    if ( ! empty( array_intersect( $exempt_roles, $user->roles ) ) ) {
        // 命中豁免角色直接终止流程,不添加附加费
        return;
    }

    foreach ( $fees as $fee ) {
        $cart->add_fee( $fee['name'], $fee['amount'], $fee['taxable'], $fee['tax_class'] );
    }
}

验证注意事项

  • 替换代码后先到WooCommerce工具页清空购物车会话缓存,避免旧缓存影响结果。
  • 分别使用普通用户、豁免角色用户、未登录访客测试购物车和结算页,确认附加费显示规则符合预期。
  • 确认该方法挂载的钩子是woocommerce_cart_calculate_fees,若原插件挂载的钩子优先级过高,可以调整为20以下的优先级,确保在其他购物车逻辑执行完成后再判断加费。

内容的提问来源于stack exchange,提问作者Emmanuel Caia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:12:35