Agregue como artículos de carrito separados para un producto con datos personalizados en WooCommerce

Hola, actualmente tengo un formulario personalizado en cada producto en la interfaz. Aquí el cliente puede insertar ancho y altura personalizados según este precio cambiará

Para esto escribo el siguiente código, y está funcionando

add_filter( 'woocommerce_add_cart_item', 'add_custom_cart_item_data', 10, 2 ); function add_custom_cart_item_data( $cart_item_data, $cart_item_key ) { if( isset( $_POST['new-width'] ) ) $cart_item_data['new-width'] = $_POST['new-width']; if(isset( $_POST['new-height'] ) ) $cart_item_data['new-height'] = $_POST['new-height']; return $cart_item_data; } add_action( 'woocommerce_before_calculate_totals', 'set_custom_cart_item_price', 10, 1 ); function set_custom_cart_item_price( $wc_cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; foreach ( $wc_cart->get_cart() as $cart_item ){ if( ! empty($cart_item['new-width']) && ! empty($cart_item['new-height']) ){ $new_value=$cart_item['new-width']*$cart_item['new-height']; $cart_item['data']->set_price($new_value); } } } 

Ahora el problema que enfrento es

El cliente agregó el producto1 al carro con width=30 and height=30. entonces el precio total es 30*30=90 [basado en $cart_item['new-width']*$cart_item['new-height'] ] y el cliente agrega el mismo producto1 con width=40 and height=40 . según mi fórmula, el precio será 40*40=160 . y el precio total en el pago debe ser de 160+90=250 Pero lo que obtengo es 90 + 90 = 180

en la página de pago lo que necesito es

 (1)product-1(width=30, height=30) 90 (2)product-1(width=40, height=40) 160 total 250 

Pero actualmente muestra

 (1)product-1(width=30, height=30) 90 qty(2) total 180 

Por favor ayuda

Primero, mejor debería usar woocommerce_add_cart_item_data hook en su lugar, de esta manera para obtener diferentes elementos:

 add_action( 'woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2 ); function save_custom_fields_data_to_cart( $cart_item_data, $product_id ) { $data = array(); // Set the custom data in the cart item if( ! empty( $_POST['new-height'] ) && ! empty( $_POST['new-height'] ) ) { $cart_item_data['custom_data']['new_width'] = $_POST['new-width']; $data['new_width'] = $_POST['new-width']; $cart_item_data['custom_data']['new_height'] = $_POST['new-height']; $data['new_height'] = $_POST['new-height']; // below statement make sure every add to cart action as unique line item $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() ); WC()->session->set( 'custom_data', $data ); } return $cart_item_data; } 

Luego con algunos pequeños cambios:

 add_action( 'woocommerce_before_calculate_totals', 'set_custom_cart_item_price', 10, 1 ); function set_custom_cart_item_price( $wc_cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; foreach ( $wc_cart->get_cart() as $cart_item ){ if( ! empty( $cart_item['custom_data'] ) ){ $new_value = $cart_item['custom_data']['new_width'] * $cart_item['custom_data']['new_height']; $cart_item['data']->set_price( $new_value ); } } } 

El código va en el archivo function.php de su tema hijo activo (o tema) o también en cualquier archivo de complemento.

probado y funciona

Nota: 30 x 30 no es 90 pero es 900 y 40 x 40 no es 160 pero es 1600