WooCommerce更新后WC()->cart->add_to_cart()不显示购物车自定义文本
问题根因
WooCommerce 6.0+版本对WC()->cart->add_to_cart()方法的第4个参数$variation新增了严格校验:仅键名以attribute_开头、且已提前在产品后台注册过的属性才会被自动识别、存储并展示在购物车页面,你代码中Ingredientes retirados这类自定义非属性键值现在不会被默认处理,这就是更新后文本不显示的原因。
修复步骤
1. 调整add_to_cart传参逻辑
将非属性的自定义配置数据放到方法的第5个参数$cart_item_data中传输,这个参数专门用于存储自定义购物车项目数据,不受属性规则限制:
// 先拆分属性和自定义数据 $attribute_variation = []; $custom_cart_data = []; if ($product_id2 != 0) { $attribute_variation = []; // 这里仅放实际注册过的变体属性,没有就留空 $custom_cart_data = [ 'Base Pizza 1' => $base_pizza_principal, 'Ingredientes retirados Pizza 1' => $ingredientes_retirados_pizza_principal, 'Ingredientes adicionados Pizza 1' => $ingredientes_adicionados_pizza_principal, 'Dueto com a pizza:' => $descricao, 'Base Pizza 2' => $base_pizza_secundaria, 'Ingredientes retirados Pizza 2' => $ingredientes_retirados_pizza_secundaria, 'Ingredientes adicionados Pizza 2' => $ingredientes_adicionados_pizza_secundaria, ]; } else { $attribute_variation = [ 'attribute_Base' => $string_base_p1, ]; $custom_cart_data = [ 'Ingredientes retirados' => $ingredientes_retirados_pizza1, 'Ingredientes adicionados' => $ingredientes_adicionados_pizza1, ]; } // 调用add_to_cart时传入第5个参数 if( WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $attribute_variation, $custom_cart_data )) { // 原有逻辑保持不变 if ($qtt_ingredientes_extra > 0) { WC()->cart->add_to_cart( $id_ingrediente_Extra, $qtt_ingredientes_extra); } global $woocommerce; $cart_url = wc_get_cart_url(); $output = array('success' => 1, 'msg' =>'Added the product to your cart ', 'cart_url' => $cart_url ); } else { $output = array('success' => 0, 'msg' => 'Something went wrong, please try again'); }
2. 挂载钩子保存自定义数据到购物车项目
将这段代码加到主题functions.php或自定义插件中,确保自定义数据持久化存储在购物车会话中:
add_filter('woocommerce_add_cart_item_data', function ($cart_item_data, $product_id, $variation_id) { // 把你传的自定义字段都存进cart_item,避免丢失 $custom_fields = [ 'Base Pizza 1', 'Ingredientes retirados Pizza 1', 'Ingredientes adicionados Pizza 1', 'Dueto com a pizza:', 'Base Pizza 2', 'Ingredientes retirados Pizza 2', 'Ingredientes adicionados Pizza 2', 'Ingredientes retirados', 'Ingredientes adicionados' ]; foreach ($custom_fields as $field) { if (isset($cart_item_data[$field])) { $cart_item_data[$field] = sanitize_text_field($cart_item_data[$field]); } } return $cart_item_data; }, 10, 3);
3. 挂载钩子在购物车页面渲染自定义数据
同样加到主题functions.php或自定义插件中,实现自定义文本的前端展示:
add_filter('woocommerce_get_item_data', function ($item_data, $cart_item) { // 数组键为字段名,值为前端展示的标签,可根据需要修改 $custom_fields = [ 'Base Pizza 1' => '饼底1', 'Ingredientes retirados Pizza 1' => '披萨1移除配料', 'Ingredientes adicionados Pizza 1' => '披萨1添加配料', 'Dueto com a pizza:' => '搭配披萨', 'Base Pizza 2' => '饼底2', 'Ingredientes retirados Pizza 2' => '披萨2移除配料', 'Ingredientes adicionados Pizza 2' => '披萨2添加配料', 'Ingredientes retirados' => '移除配料', 'Ingredientes adicionados' => '添加配料' ]; foreach ($custom_fields as $field_key => $field_label) { if (!empty($cart_item[$field_key])) { $item_data[] = [ 'key' => $field_label, 'value' => wp_kses_post($cart_item[$field_key]) ]; } } return $item_data; }, 10, 2);
内容的提问来源于stack exchange,提问作者António Sousa
相关产品推荐
相关产品推荐

