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