如何在WooCommerce购物车页获取无变体的自定义属性值?
解决方案
1. 先将自定义属性值保存到购物车项
非变体的自定义属性不会自动同步到购物车项数据中,需要通过钩子将用户在产品页选择的属性值存入购物车项:
add_filter('woocommerce_add_cart_item_data', 'save_custom_attribute_to_cart', 10, 3); function save_custom_attribute_to_cart($cart_item_data, $product_id, $variation_id) { // 替换成你产品页中delivaryDate对应的表单字段name if (isset($_POST['delivaryDate']) && !empty($_POST['delivaryDate'])) { $cart_item_data['delivaryDate'] = sanitize_text_field($_POST['delivaryDate']); // 可选:添加唯一键,确保不同属性值生成独立购物车项 $cart_item_data['unique_attr_key'] = md5(microtime() . rand()); } return $cart_item_data; }
2. 在购物车页获取并格式化属性值
遍历购物车时,同时读取产品自带属性和我们保存的自定义属性,拼接成要求的格式:
foreach (WC()->cart->get_cart() as $cart_item) { $formatted_attrs = []; // 处理产品本身的属性(包括无变体的产品属性) $product_attrs = $cart_item['data']->get_attributes(); foreach ($product_attrs as $attr_slug => $attr_obj) { $attr_name = wc_attribute_label($attr_slug); // 非变体属性取第一个值(如果是多选可调整逻辑) $attr_value = $attr_obj->get_options()[0]; $formatted_attrs[] = "{$attr_name}_{$attr_value}"; } // 处理我们保存的delivaryDate属性 if (isset($cart_item['delivaryDate'])) { $formatted_attrs[] = "delivaryDate_{$cart_item['delivaryDate']}"; } // 输出最终格式的属性字符串 echo implode('_', $formatted_attrs) . '<br>'; }
关键说明
- 确保产品页中delivaryDate的表单字段name与代码中的
$_POST['delivaryDate']一致,否则无法捕获用户选择的值。 - 如果你的delivaryDate是通过WooCommerce后台添加的产品自定义属性(而非前端自定义表单),可以替换成
$cart_item['data']->get_meta('delivaryDate')来直接获取,无需第一步的钩子(但需确认属性已设置为“可见”并在产品页显示)。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

