Добавить как отдельные элементы корзины для продукта с пользовательскими данными в Woocommerce

Привет, в настоящее время у меня есть пользовательская форма для каждого продукта на интерфейсе. Здесь клиент может вставить пользовательскую ширину и высоту, так как эта цена изменится

Для этого я пишу следующий код, и он работает

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); } } } 

Теперь проблема, с которой я сталкиваюсь, – это

Клиент добавил продукт1 в корзину с width=30 and height=30. поэтому общая цена составляет 30*30=90 [на основе $cart_item['new-width']*$cart_item['new-height'] ], а клиент добавляет тот же продукт1 с width=40 and height=40 . по моей формуле цена станет 40*40=160 . и общая стоимость в кассе должна быть 160+90=250 Но я получаю 90 + 90 = 180

на странице проверки, что мне нужно

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

Но в настоящее время он показывает

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

Пожалуйста помоги

Сначала вам лучше использовать woocommerce_add_cart_item_data вместо этого, чтобы получить разные элементы:

 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; } 

Затем с небольшими изменениями:

 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 ); } } } 

Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

проверено и работает

Примечание: 30 x 30 не 90 а 900 и 40 x 40 не 160 а 1600