Commit edc9b61e8a3 for woocommerce
commit edc9b61e8a31cb03a9bcdac6d249cd720a83d3b1
Author: Taha Paksu <3295+tpaksu@users.noreply.github.com>
Date: Wed Apr 8 19:43:01 2026 +0300
Fix tracking number lookup for custom shipping provider definitions (#64068)
* Fix tracking number lookup for custom shipping provider definitions
Guard against non-string values in the shipping provider list before
calling class_exists(), so custom provider definitions that are not
class name strings no longer break tracking number lookup.
* Remove extra doc comments
* Add changefile(s) from automation for the following project(s): woocommerce
---------
Co-authored-by: woocommercebot <woocommercebot@users.noreply.github.com>
diff --git a/plugins/woocommerce/changelog/64068-fix-fulfillments-custom-provider-tracking-lookup b/plugins/woocommerce/changelog/64068-fix-fulfillments-custom-provider-tracking-lookup
new file mode 100644
index 00000000000..6c6b558822d
--- /dev/null
+++ b/plugins/woocommerce/changelog/64068-fix-fulfillments-custom-provider-tracking-lookup
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Fix tracking number lookup breaking when custom shipping provider definitions contain non-string values.
\ No newline at end of file
diff --git a/plugins/woocommerce/src/Admin/Features/Fulfillments/FulfillmentsManager.php b/plugins/woocommerce/src/Admin/Features/Fulfillments/FulfillmentsManager.php
index 792b3226e1d..ee3caa3dfce 100644
--- a/plugins/woocommerce/src/Admin/Features/Fulfillments/FulfillmentsManager.php
+++ b/plugins/woocommerce/src/Admin/Features/Fulfillments/FulfillmentsManager.php
@@ -507,7 +507,7 @@ class FulfillmentsManager {
$shipping_providers = FulfillmentUtils::get_shipping_providers();
$results = array();
foreach ( $shipping_providers as $provider ) {
- if ( class_exists( $provider ) && is_subclass_of( $provider, AbstractShippingProvider::class ) ) {
+ if ( is_string( $provider ) && class_exists( $provider ) && is_subclass_of( $provider, AbstractShippingProvider::class ) ) {
try {
/**
* Instantiate the shipping provider class.
diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/reports/class-wc-tests-reports-orders-stats.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/reports/class-wc-tests-reports-orders-stats.php
index c3c369506a5..0096dbcbb88 100644
--- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/reports/class-wc-tests-reports-orders-stats.php
+++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/reports/class-wc-tests-reports-orders-stats.php
@@ -6629,6 +6629,9 @@ class WC_Admin_Tests_Reports_Orders_Stats extends WC_Unit_Test_Case {
$fulfillment->set_status( $fulfillment_status );
$fulfillment->save();
+ // Re-fetch the order to pick up meta changes made by hooks during save,
+ // avoiding duplicate _fulfillment_status entries from separate instances.
+ $order = wc_get_order( $order->get_id() );
$order->update_meta_data( '_fulfillment_status', $fulfillment_status );
$order->save();