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

如何从WooCommerce购物车商品中获取产品变体属性别名?

解决方案

要获取商品变体的别名(slug),直接使用WooCommerce产品对象的get_slug()方法即可,替换你代码里的get_formatted_name()。另外可以优化逻辑,找到目标变体后提前终止循环,避免不必要的遍历。

修正后的代码如下:

add_filter('woocommerce_package_rates', 'check_cart_for_swatch_variation', 10, 2);
function check_cart_for_swatch_variation($rates, $package) {
    $cart_has_swatch = false;

    foreach (WC()->cart->get_cart() as $cart_item) {
        // 获取当前商品的变体ID(如果是变体商品)或产品ID
        $target_id = $cart_item['variation_id'] > 0 ? $cart_item['variation_id'] : $cart_item['product_id'];
        $product = wc_get_product($target_id);

        // 获取商品/变体的slug
        $product_slug = $product->get_slug();

        // 检查slug是否为'swatch'
        if ($product_slug === 'swatch') {
            $cart_has_swatch = true;
            break; // 找到目标后跳出循环,提升效率
        }
    }

    // 这里可以根据$cart_has_swatch的值处理配送选项
    if ($cart_has_swatch) {
        // 示例:隐藏指定配送方式
        foreach ($rates as $rate_key => $rate) {
            if ($rate->method_id === 'flat_rate') {
                unset($rates[$rate_key]);
            }
        }
    }

    return $rates;
}

关键说明:

  • get_slug():WooCommerce产品/变体对象的原生方法,直接返回对应的别名(slug),完全匹配你的需求。
  • 提前终止循环:一旦找到slug为'swatch'的商品,立即跳出foreach循环,减少不必要的代码执行。
  • 配送缓存处理:如果修改了配送选项,测试时记得清空WooCommerce配送缓存(可通过更新产品、修改购物车内容触发,或添加代码强制清除)。

如果你实际需求是检查特定产品属性(而非slug),比如验证商品是否包含某个属性值,可改用以下逻辑:

// 替换上述代码中的slug检查部分
$attributes = $product->get_attributes();
// 假设要检查的属性是'pa_swatch',目标属性值为'swatch'
if (isset($attributes['pa_swatch']) && in_array('swatch', $attributes['pa_swatch']->get_options())) {
    $cart_has_swatch = true;
    break;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:46:06