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

如何在WooCommerce中排除特定角色卖家享受运费折扣

如何在WooCommerce运费折扣代码中排除特定角色

要排除seller_2角色的卖家享受运费折扣,我们需要调整原代码的角色判断逻辑,同时修复原代码中提前返回导致的潜在问题。以下是两种常见场景的解决方案:

场景1:仅对「是seller角色且不是seller_2角色」的卖家应用折扣

这种场景下,只要购物车里存在符合条件的卖家(非seller_2的seller),就会给所有运费方式(除了免运费)打折扣,即使购物车里还有其他角色的卖家商品。

修改后的代码:

add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 2 );
function custom_shipping_methods( $rates, $package ) {
    $reduction_cost_percentage = 30; // 折扣百分比
    $should_apply_discount = false;

    // 遍历购物车商品,确认是否有符合条件的卖家
    foreach( WC()->cart->get_cart() as $cart_item ){
        $in_cart_product_id = $cart_item['product_id'];
        $cart_seller_id = get_post_field('post_author', $in_cart_product_id);
        $cart_seller_meta = get_userdata($cart_seller_id);
        $cart_seller_roles = $cart_seller_meta->roles;

        // 跳过seller_2角色的卖家
        if (in_array('seller_2', $cart_seller_roles)) {
            continue;
        }
        // 找到seller角色的卖家,标记需要应用折扣
        if (in_array('seller', $cart_seller_roles)) {
            $should_apply_discount = true;
            break; // 找到一个符合条件的即可停止检查
        }
    }

    // 如果需要应用折扣,批量处理所有运费方式
    if ($should_apply_discount) {
        foreach( $rates as $rate_key => $rate ){
            if( $rate->method_id != 'free_shipping'){
                $rates[$rate_key]->cost = $rates[$rate_key]->cost * ((100-$reduction_cost_percentage) / 100);
            }
        }
    }

    return $rates;
}

场景2:只要购物车里有seller_2角色的卖家,就完全不应用折扣

如果你的需求是只要存在seller_2卖家的商品,整个订单都不享受运费折扣,可以用下面的代码:

add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 2 );
function custom_shipping_methods( $rates, $package ) {
    $reduction_cost_percentage = 30; // 折扣百分比

    // 先检查是否有seller_2角色的卖家,有则直接返回原运费
    foreach( WC()->cart->get_cart() as $cart_item ){
        $in_cart_product_id = $cart_item['product_id'];
        $cart_seller_id = get_post_field('post_author', $in_cart_product_id);
        $cart_seller_meta = get_userdata($cart_seller_id);
        $cart_seller_roles = $cart_seller_meta->roles;

        if (in_array('seller_2', $cart_seller_roles)) {
            return $rates;
        }
    }

    // 确认没有seller_2卖家后,检查是否有seller卖家并应用折扣
    foreach( WC()->cart->get_cart() as $cart_item ){
        $in_cart_product_id = $cart_item['product_id'];
        $cart_seller_id = get_post_field('post_author', $in_cart_product_id);
        $cart_seller_meta = get_userdata($cart_seller_id);
        $cart_seller_roles = $cart_seller_meta->roles;

        if (in_array('seller', $cart_seller_roles)) {
            foreach( $rates as $rate_key => $rate ){
                if( $rate->method_id != 'free_shipping'){
                    $rates[$rate_key]->cost = $rates[$rate_key]->cost * ((100-$reduction_cost_percentage) / 100);
                }
            }
            break;
        }
    }

    return $rates;
}

重要提示

  • 把代码添加到你的WordPress主题functions.php文件,或者自定义插件中
  • 修改代码后,记得清空WooCommerce的运费缓存:进入「WooCommerce > 设置 > 高级 > 系统状态 > 工具」,点击「清空缓存」按钮,否则新的运费规则可能不会立即生效
  • 用in_array检查角色比直接取$cart_seller_roles[0]更可靠,因为WordPress用户可以同时拥有多个角色

内容的提问来源于stack exchange,提问作者Web Design

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:17:50