Commit d7f8b57c409 for woocommerce
commit d7f8b57c409cae294ccf2660f47fad0d1bff9e18
Author: Ann <annchichi@users.noreply.github.com>
Date: Wed Jul 22 23:25:46 2026 +0800
Fix shipping line names changing on order save (#66849)
* Fix shipping line names changing on order save
* Add changelog entry for shipping line name fix
diff --git a/plugins/woocommerce/changelog/fix-66847-preserve-shipping-line-name b/plugins/woocommerce/changelog/fix-66847-preserve-shipping-line-name
new file mode 100644
index 00000000000..96a14b6072c
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-66847-preserve-shipping-line-name
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Preserve existing order shipping line names that match the default Shipping label.
diff --git a/plugins/woocommerce/includes/admin/wc-admin-functions.php b/plugins/woocommerce/includes/admin/wc-admin-functions.php
index 03cab7ad3f4..b78516d2b00 100644
--- a/plugins/woocommerce/includes/admin/wc-admin-functions.php
+++ b/plugins/woocommerce/includes/admin/wc-admin-functions.php
@@ -430,7 +430,7 @@ function wc_save_order_items( $order_id, $items ) {
if (
! empty( $item_data['shipping_method'] ) &&
- in_array( $item_data['shipping_method_title'], array( '', __( 'Shipping', 'woocommerce' ) ), true )
+ '' === $item_data['shipping_method_title']
) {
if ( null === $shipping_methods ) {
$shipping_methods = WC()->shipping() ? WC()->shipping()->load_shipping_methods() : array();
diff --git a/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-functions-test.php b/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-functions-test.php
index ec1727078d7..43f92b51182 100644
--- a/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-functions-test.php
+++ b/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-functions-test.php
@@ -583,11 +583,11 @@ class WC_Admin_Functions_Test extends \WC_Unit_Test_Case {
}
/**
- * @testdox wc_save_order_items() should use the shipping method title when the posted shipping title is the default label.
+ * @testdox wc_save_order_items() should use the shipping method title when the posted shipping title is empty.
*
* @link https://github.com/woocommerce/woocommerce/issues/36049
*/
- public function test_wc_save_order_items_uses_shipping_method_title_when_posted_shipping_title_is_default_label(): void {
+ public function test_wc_save_order_items_uses_shipping_method_title_when_posted_shipping_title_is_empty(): void {
$order = WC_Helper_Order::create_order();
$shipping_item = new WC_Order_Item_Shipping();
$shipping_item->set_order_id( $order->get_id() );
@@ -596,7 +596,7 @@ class WC_Admin_Functions_Test extends \WC_Unit_Test_Case {
$items = array(
'shipping_method_id' => array( $item_id ),
'shipping_method' => array( $item_id => 'free_shipping' ),
- 'shipping_method_title' => array( $item_id => __( 'Shipping', 'woocommerce' ) ),
+ 'shipping_method_title' => array( $item_id => '' ),
'shipping_cost' => array( $item_id => 0 ),
'shipping_taxes' => array( $item_id => array() ),
);
@@ -608,7 +608,39 @@ class WC_Admin_Functions_Test extends \WC_Unit_Test_Case {
$this->assertSame(
'Free shipping',
$saved_item->get_name(),
- 'Known shipping methods should use their title when the posted title is the default label'
+ 'Known shipping methods should use their title when the posted title is empty'
+ );
+ }
+
+ /**
+ * @testdox wc_save_order_items() should preserve an existing shipping line named Shipping.
+ *
+ * @link https://github.com/woocommerce/woocommerce/issues/66847
+ */
+ public function test_wc_save_order_items_preserves_existing_shipping_line_named_shipping(): void {
+ $order = WC_Helper_Order::create_order();
+ $shipping_item = new WC_Order_Item_Shipping();
+ $shipping_item->set_order_id( $order->get_id() );
+ $shipping_item->set_method_id( 'flat_rate' );
+ $shipping_item->set_method_title( __( 'Shipping', 'woocommerce' ) );
+ $item_id = $shipping_item->save();
+
+ $items = array(
+ 'shipping_method_id' => array( $item_id ),
+ 'shipping_method' => array( $item_id => 'flat_rate' ),
+ 'shipping_method_title' => array( $item_id => __( 'Shipping', 'woocommerce' ) ),
+ 'shipping_cost' => array( $item_id => 0 ),
+ 'shipping_taxes' => array( $item_id => array() ),
+ );
+
+ wc_save_order_items( $order->get_id(), $items );
+
+ $saved_item = new WC_Order_Item_Shipping( $item_id );
+
+ $this->assertSame(
+ __( 'Shipping', 'woocommerce' ),
+ $saved_item->get_name(),
+ 'Existing shipping lines named Shipping should not be replaced with the generic method title'
);
}
}