WooCommerce Subscriptions 9.2.0 comes with updated settings page UI and behavior, and includes several other changes worth knowing if you build extensions, gateways, or custom integrations for Subscriptions. Here are the ones with the widest impact; the full list of fixes and changes is in the latest version notes on the product page.
Physical Products only can now be prorated
Changing proration settings has historically focused on virtual products only; 9.2.0 now allows for “Prorate Recurring Payment” and “Prorate Subscription Length” to be applied to physical products as well!
woocommerce_subscriptions_apportion_recurring_price accepts two new values, physical-upgrade and physical, and woocommerce_subscriptions_apportion_length accepts physical. These behave the same way as their virtual counterparts: the -upgrade variant prorates upgrades only and leaves downgrades alone, while plain physical prorates in both directions.
The change is additive. Default values are unchanged, and the wcs_switch_should_prorate_recurring_price and wcs_switch_should_prorate_length filters keep their existing signatures.
Rolling back to 9.1.0 or earlier: older versions don’t recognize the new values, so proration defaults “off” without any fatals or data loss.
On the 9.1.0 settings screen, the dropdown has no option matching the stored value, so nothing appears selected. If an admin saves that settings section without picking a new value, the stored physical or physical-upgrade is overwritten with no.

Closing the gap on manual-payment flags
“Turn off automatic payments” could previously force a subscription into a manual renewal state even if the parent setting, “Accept Manual Renewals,” was disabled.
WCS_Manual_Renewal_Manager::is_manual_renewal_required() now requires both settings to be enabled. A one-time upgrade routine re-enables “Accept Manual Renewals” on any store caught in that contradictory state, so existing behavior carries over rather than changing silently.
Line item removal gets a capability check, and links get their own nonces
Removing a line item has always been the subscription owner’s privilege, but the code enforced it loosely. wcs_can_items_be_removed( $subscription, $user_id = 0 ) in wcs-functions.php now checks the edit_shop_subscription_line_items capability, which only the owner holds. The visible effect is small — the recipient of a gifted subscription no longer sees the remove-item control on My Account.
Two things to know if you call or filter it. The capability check runs after the existing wcs_can_items_be_removed filter and is combined with it, so a filter can still narrow the result but can no longer grant removal on its own; the filter now receives the user as a third argument. With no user to check, the function returns false, so calls from cron, WP-CLI, or an unauthenticated REST request now return false where they previously could return true.
The same hardening reaches the links themselves: removal and resubscribe links now mint a nonce for their own operation instead of sharing one keyed only to the subscription ID, so a link issued for one can’t be replayed for the other. Links generated before 9.2.0 no longer verify. A resubscribe link can be reopened from My Account, but the “Undo?” link offered right after a removal can’t be reissued.
Gifting moves from a global switch to a per-product setting
While Enable gifting for subscriptions is still available — Enabled/Disabled for all products default has been removed. Gifting is now set per product via the _subscription_gifting meta key, and a new bulk-edit option turns it on or off across many products at once.
If the storewide default was “enabled for all products,” a background migration writes that value onto existing products that don’t already have one. Stores that had gifting off need no migration since off is the new default for products with no value set.
The migration has no filter, so the per-product meta and the bulk edit are the only ways to adjust gifting on existing products.
Settings REST fields get a new registration path, and one field changes type
The Subscriptions settings tab now registers through woocommerce_get_settings_pages rather than woocommerce_settings_tabs_array. A new Settings_Page class registers the /wc/v3/settings/subscriptions REST fields, replacing the now-deprecated WC_REST_Subscriptions_Settings class.
woocommerce_subscriptions_max_customer_suspensions changes from a select with a fixed option list to a number field. The values it reads and writes are unchanged. The woocommerce_subscriptions_max_customer_suspension_range filter, which adjusted that list, is deprecated and its return value is now ignored.
One wiring detail: Settings_Page hooks its output() callback to woocommerce_settings_subscriptions at priority 1 rather than the usual 10, so it renders before anything else on that action at the default priority. If your code adds to this screen expecting to run after core’s output, that assumption no longer holds.
Loading the All Products plan-selector script on custom pages
The plan-selector script (wcsatt-frontend) used to load on every page, even ones that couldn’t show subscription options. It’s now registered but not enqueued.
If you render the plan-selector markup somewhere Subscriptions doesn’t already handle — a custom template, an AJAX-loaded fragment, a quick-view modal — call WCS_ATT_Display::enqueue_frontend_script() before scripts print. It’s an idempotent wrapper around wp_enqueue_script(), so calling it from several places is fine.
A couple of smaller items:
WCS_ATT_Product::get_instance_id()no longer re-runs full module bootstrap used previously by All Products for WooCommerce Subscriptions (re-registering hooks, re-firing thewcsatt_modulesfilters) on every call – it was doing that on every product lookup.- And a new
woocommerce_subscriptions_paypal_standard_expected_payment_amountsfilter lets you add acceptable amounts for a PayPal Standard renewal when the subscription’s price has changed since the profile was created.
For the complete list of fixes and changes in 9.2.0, see the latest version notes.
Leave a Reply