Привет, в настоящее время у меня есть пользовательская форма для каждого продукта на интерфейсе. Здесь клиент может вставить пользовательскую ширину и высоту, так как эта цена изменится
Для этого я пишу следующий код, и он работает
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