如何从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
相关产品推荐
相关产品推荐

