diff --git a/includes/plugins/wc-memberships/class-membership-expiry.php b/includes/plugins/wc-memberships/class-membership-expiry.php index 061d33c0ac..c070aae7c3 100644 --- a/includes/plugins/wc-memberships/class-membership-expiry.php +++ b/includes/plugins/wc-memberships/class-membership-expiry.php @@ -28,13 +28,18 @@ public static function init() { /** * Prevent membership expiration if there are other active subscriptions. * - * @param bool $cancel_membership Whether to cancel the membership when the subscription is cancelled (default true). - * @param \WC_Memberships_Integration_Subscriptions_User_Membership $user_membership The subscription-tied membership. + * @param bool $cancel_membership Whether to cancel the membership when the subscription is cancelled (default true). + * @param \WC_Memberships_User_Membership $user_membership The membership. Only subscription-tied memberships (\WC_Memberships_Integration_Subscriptions_User_Membership) expose get_subscription_id()/set_subscription_id(). */ public static function prevent_membership_expiration( $cancel_membership, $user_membership ) { if ( ! function_exists( 'wcs_get_subscription' ) ) { return $cancel_membership; } + // `wc_memberships_expire_user_membership` fires for every membership, but only the + // Subscriptions integration class exposes get_subscription_id()/set_subscription_id(). + if ( ! method_exists( $user_membership, 'get_subscription_id' ) ) { + return $cancel_membership; + } $membership_product_id = $user_membership->get_product_id(); $cancelling_subscription_id = $user_membership->get_subscription_id(); $active_subscription_ids = WooCommerce_Connection::get_active_subscriptions_for_user( $user_membership->get_user_id() ); diff --git a/tests/unit-tests/plugins/wc-memberships/membership-expiry.php b/tests/unit-tests/plugins/wc-memberships/membership-expiry.php new file mode 100644 index 0000000000..3180f945c2 --- /dev/null +++ b/tests/unit-tests/plugins/wc-memberships/membership-expiry.php @@ -0,0 +1,54 @@ +assertTrue( $result, 'Filter should return the incoming $cancel_membership unchanged when the membership is not subscription-tied.' ); + } +}