Commit 21ce24caed for woocommerce
commit 21ce24caedc179a42e29fdfa1683c85557a1d43f
Author: Abdalsalaam Halawa <abdalsalaamnafez@gmail.com>
Date: Mon Nov 24 19:25:45 2025 +0400
Fix fatal error in needs_shipping() when order contains deleted product (#61628)
* Fix fatal error in needs_shipping() when order contains deleted product
* add changelog
* test_needs_shipping() test deleted product
* Add changefile(s) from automation for the following project(s): woocommerce
* remove manually added changelog
---------
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Sam Najian <dev@najian.info>
diff --git a/plugins/woocommerce/changelog/61628-fix-issue-61627 b/plugins/woocommerce/changelog/61628-fix-issue-61627
new file mode 100644
index 0000000000..ce099dc684
--- /dev/null
+++ b/plugins/woocommerce/changelog/61628-fix-issue-61627
@@ -0,0 +1,4 @@
+Significance: minor
+Type: fix
+
+Fix fatal error in needs_shipping() when order contains permanently deleted product
\ No newline at end of file
diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
index 74b6b6d32c..e22b238c82 100644
--- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
+++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php
@@ -2469,7 +2469,12 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
$needs_shipping = false;
foreach ( $this->get_items() as $item ) {
- if ( is_a( $item, 'WC_Order_Item_Product' ) && $item->get_product()->needs_shipping() ) {
+ if ( ! is_a( $item, 'WC_Order_Item_Product' ) ) {
+ continue;
+ }
+
+ $product = $item->get_product();
+ if ( is_a( $product, 'WC_Product' ) && $product->needs_shipping() ) {
$needs_shipping = true;
break;
}
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 b9cdb67575..2613e5b7d9 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
@@ -908,6 +908,11 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
$object->save();
$this->assertTrue( $object->needs_shipping() );
+
+ $physical_product->delete( true );
+ // Reload the order to ensure fresh data.
+ $object = wc_get_order( $object->get_id() );
+ $this->assertFalse( $object->needs_shipping() );
}
/**