Commit 05e8e0be96 for woocommerce
commit 05e8e0be961ef03e363f941c5896f6feb9fce0d2
Author: Radoslav Georgiev <rageorgiev@gmail.com>
Date: Thu Nov 27 23:35:24 2025 +0200
Only coerce order total into float when necessary (#62131)
* Instead of casting all string values to float when setting order totals, only do it when necessary.
* Fix a lint issue
diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
index e22b238c82..7312a7e9f4 100644
--- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
+++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
@@ -814,7 +814,11 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
return $this->legacy_set_total( $value, $deprecated );
}
- $this->set_prop( 'total', wc_format_decimal( (float) $value, wc_get_price_decimals() ) );
+ if ( ! is_string( $value ) || 0 === strlen( $value ) ) {
+ $value = (float) $value;
+ }
+
+ $this->set_prop( 'total', wc_format_decimal( $value, wc_get_price_decimals() ) );
}
/**
diff --git a/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php b/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php
index 2613e5b7d9..18f9408d06 100644
--- a/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php
+++ b/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php
@@ -16,6 +16,15 @@ use Automattic\WooCommerce\Testing\Tools\CodeHacking\Hacks\FunctionsMockerHack;
* @package WooCommerce\Tests\CRUD
*/
class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
+ /**
+ * Tear down the test class.
+ */
+ public function tearDown(): void {
+ parent::tearDown();
+
+ remove_all_filters( 'wc_get_price_thousand_separator' );
+ remove_all_filters( 'wc_get_price_decimal_separator' );
+ }
/**
* Test: get_type
@@ -209,6 +218,28 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
$this->assertEquals( 0, $object->get_total() );
}
+ /**
+ * Test: get_total_pre_formatted_standard_value
+ */
+ public function test_get_total_pre_formatted_standard_value() {
+ $object = new WC_Order();
+ $object->set_total( '2,000.00' );
+ $this->assertEquals( 2000, $object->get_total() );
+ }
+
+ /**
+ * Test: get_total_pre_formatted_eu_value
+ */
+ public function test_get_total_pre_formatted_eu_value() {
+ // Simulate a price format like 3.567,89.
+ add_filter( 'wc_get_price_thousand_separator', fn() => '.' );
+ add_filter( 'wc_get_price_decimal_separator', fn() => ',' );
+
+ $object = new WC_Order();
+ $object->set_total( '2.000,00' );
+ $this->assertEquals( 2000, $object->get_total() );
+ }
+
/**
* Test: get_total_tax
*/