Я создал скрытый элемент ввода, используя woocommerce_before_add_to_cart_button
hook
function add_gift_wrap_field() { ?>`<input type="hidden" id="price_val" name="added_price" value="100.34">`<?php } add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' );
Сохранение полей против продукта:
function save_gift_wrap_fee( $cart_item_data, $product_id ) { if( isset( $_POST['added_price'] ) ) { $cart_item_data = array(); $cart_item_data[ "gift_wrap_fee" ] = "YES"; $cart_item_data[ "gift_wrap_price" ] = 100; } return $cart_item_data; } add_filter( 'woocommerce_add_cart_item_data', 'save_gift_wrap_fee', 99, 2 );
Теперь я могу повторить $_POST['added_price']
внутри этого woocommerce_before_calculate_totals
.
Код, который я написал, показан ниже:
function calculate_gift_wrap_fee( $cart_object ) { if( !WC()->session->__isset( "reload_checkout" )) { /* Gift wrap price */ $additionalPrice = number_format($_POST['added_price'], 2); $additionalPrice = floatval($additionalPrice); //echo $additionalPrice; exit(); shows the value foreach ( $cart_object->cart_contents as $key => $value ) { if( isset( $value["gift_wrap_fee"] ) ) { /* Woocommerce 3.0 + */ $orgPrice = floatval( $value['data']->get_price() ); $value['data']->set_price( $orgPrice + $additionalPrice ); //not adding the $additionalPrice here. } } } } add_action( 'woocommerce_before_calculate_totals', 'calculate_gift_wrap_fee', 99 );
Что я здесь делаю неправильно?
Вот полное чистое, проверенное и работающее решение на основе вашего кода.
Здесь я включил ваш собственный key
/ value
поля в объект корзины для соответствующего элемента корзины вместо того, чтобы получать значение Post в функции calculate_gift_wrap_fee()
.
Таким образом, невозможно потерять значение настраиваемого поля, и новый расчет цены является надежным.
Я прокомментировал 'gift_wrap_fee'
и 'gift_wrap_price'
поскольку они сейчас не нужны (но вы можете раскомментировать их, если хотите).
Вот этот код:
// The hidden product custom field add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' ); function add_gift_wrap_field() { ?> <input type="hidden" id="price_val" name="added_price" value="100.34"> <?php } // Adding the custom field to as custom data for this cart item in the cart object 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 ) { $bool = false; $data = array(); if( ! empty( $_REQUEST['added_price'] ) ) { $cart_item_data['custom_data']['added_price'] = $_REQUEST['added_price']; // Below this 2 values are not really needed (I think) // (You can uncomment them if needed) ## $cart_item_data['custom_data']['gift_wrap_fee'] = 'YES'; ## $cart_item_data['custom_data']['gift_wrap_price'] = 100; // 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; } // Changing the cart item price based on custom field calculation add_action( 'woocommerce_before_calculate_totals', 'calculate_gift_wrap_fee', 10, 1 ); function calculate_gift_wrap_fee( $cart_object ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Iterating though cart items foreach ( $cart_object->get_cart() as $cart_item ) { // Continue if we get the custom data for the current cart item if( ! empty( $cart_item['custom_data'] ) ){ // Get the custom field "added price" value $added_price = number_format( $cart_item['custom_data']['added_price'], 2 ); // The WC_Product object $wc_product = $cart_item['data']; // Get the price (WooCommerce versions 2.5.x to 3+) $product_price = method_exists( $wc_product, 'get_price' ) ? floatval($wc_product->get_price()) : floatval($wc_product->price); // New price calculation $new_price = $product_price + $added_price; // Set the calculeted price (WooCommerce versions 2.5.x to 3+) method_exists( $wc_product, 'set_price' ) ? $wc_product->set_price( $new_price ) : $wc_product->price = $new_price; } } }
Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Этот код проверен и работает с версиями WooCommerce с 2.5.x до 3+.