El reemplazo de precios de WooCommerce no funciona

He configurado un elemento de entrada oculto usando woocommerce_before_add_to_cart_button hook

 function add_gift_wrap_field() { ?>``<?php } add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' ); 

Guardar campos contra el producto:

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

Ahora puedo repetir el $_POST['added_price'] dentro de este hook woocommerce_before_calculate_totals .

El código que escribí se muestra a continuación:

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

¿Qué estoy haciendo mal aquí?

Aquí está la solución completa, limpia, probada y de trabajo basada en la pregunta de su código.

Aquí he incluido su key / value campo personalizado en el objeto de carrito para el artículo de carrito relacionado, en lugar de obtener el valor de publicación en su función calculate_gift_wrap_fee() .

De esta forma, no es posible perder el valor de campo personalizado y el nuevo cálculo de precio es confiable.

He comentado 'gift_wrap_fee' y 'gift_wrap_price' ya que en realidad no se necesitan ahora (pero puedes descomentarlos si quieres).

Aquí está este código:

 // The hidden product custom field add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' ); function add_gift_wrap_field() { ?>  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; } } } 

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

Este código está probado y funciona en las versiones de WooCommerce de 2.5.x a 3+.