Title: alexp12's Replies | WordPress.org

---

# alexp12

  [  ](https://wordpress.org/support/users/alexp12/)

 *   [Profile](https://wordpress.org/support/users/alexp12/)
 *   [Topics Started](https://wordpress.org/support/users/alexp12/topics/)
 *   [Replies Created](https://wordpress.org/support/users/alexp12/replies/)
 *   [Reviews Written](https://wordpress.org/support/users/alexp12/reviews/)
 *   [Topics Replied To](https://wordpress.org/support/users/alexp12/replied-to/)
 *   [Engagements](https://wordpress.org/support/users/alexp12/engagements/)
 *   [Favorites](https://wordpress.org/support/users/alexp12/favorites/)

 Search replies:

## Forum Replies Created

Viewing 2 replies - 1 through 2 (of 2 total)

 *   Forum: [Plugins](https://wordpress.org/support/forum/plugins-and-hacks/)
    In
   reply to: [[WooCommerce] 11.1.0 crashed my store](https://wordpress.org/support/topic/11-1-0-crashed-my-store/)
 *  Thread Starter [alexp12](https://wordpress.org/support/users/alexp12/)
 * (@alexp12)
 * [9 hours, 30 minutes ago](https://wordpress.org/support/topic/11-1-0-crashed-my-store/#post-19012012)
 * Solved, this was the root cause:
 *     ```wp-block-code
         The active child theme contained a global gettext filter that changed text on the WooCommerce My Account address endpoint:  add_filter( 'gettext', function ( $translated, $text, $domain ) {      if (          is_admin()          || ! function_exists( 'is_wc_endpoint_url' )          || ! is_wc_endpoint_url( 'edit-address' )      ) {          return $translated;      }      // Translation customization...  }, 20, 3 );  This worked with WooCommerce 11.0.1. Under 11.1.0, calling is_wc_endpoint_url() during early translation initialization produced this recursive path:  Child-theme gettext callback    -> is_wc_endpoint_url()    -> WC_Query::get_query_vars()    -> woocommerce_get_query_vars filter    -> OrderWithdrawalController::add_query_var()    -> FeaturesUtil::feature_is_enabled()    -> FeaturesController::init_feature_definitions()    -> translation function / gettext    -> child-theme gettext callback    -> repeat  WooCommerce 11.1.0’s Order Withdrawal controller adds logic to woocommerce_get_query_vars. Its feature check initializes the WooCommerce feature definitions, whose labels are translated. That invokes the theme’s gettext filter again before the original call has completed.  The recursion continues until PHP exhausts its memory limit.
       ```
   
 * The theme callback was unsafe because it called a query-dependent conditional
   from gettext before the wp action. Adding the lifecycle guard fixes that theme
   behavior.
 *   However, WooCommerce 11.1.0 exposes the issue through a new recursive route
   involving OrderWithdrawalController, woocommerce_get_query_vars, feature initialization,
   and translation. Could WooCommerce consider adding a re-entrancy guard or avoiding
   translated feature initialization from  within the query-variable filter? That
   could prevent similar third-party translation callbacks from causing unbounded
   recursion and full-site HTTP 500 failures.
 * Applied workaround:
 *     ```wp-block-code
         The callback was changed so it does not query WooCommerce endpoints until WordPress has completed its main query:  add_filter( 'gettext', function ( $translated, $text, $domain ) {      if (          is_admin()          || ! did_action( 'wp' )          || ! function_exists( 'is_wc_endpoint_url' )          || ! is_wc_endpoint_url( 'edit-address' )      ) {          return $translated;      }      // Translation customization...  }, 20, 3 );
       ```
   
 *   After applying this guard, WooCommerce 11.1.0 was installed successfully.
 *   Forum: [Reviews](https://wordpress.org/support/forum/reviews/)
    In reply to:
   [[WooCommerce] Every release is a new surprise on how it breaks my website.](https://wordpress.org/support/topic/every-release-is-a-new-surprise-on-how-it-breaks-my-website/)
 *  [alexp12](https://wordpress.org/support/users/alexp12/)
 * (@alexp12)
 * [13 hours, 43 minutes ago](https://wordpress.org/support/topic/every-release-is-a-new-surprise-on-how-it-breaks-my-website/#post-19011840)
 * Woocommerce 11.1.0 also broke my site entirely, had to downgrade to 11.0.1
 *     ```wp-block-code
       WooCommerce 11.1.0 — fatal memory exhaustion on nearly every request  Environment  - WordPress 7.1, PHP 8.4.25, Apache 2.4.58 (Ubuntu) via mod_proxy_fcgi/PHP-FPM, MariaDB  - WooCommerce updated 11.0.1 → 11.1.0 via a background/automatic update  - WP_MEMORY_LIMIT was 256M before the incident  - Redis object cache active (redis-cache 2.8.0 drop-in)  Timeline  - Plugin files rewritten at 2026-09-04 00:07:46 (auto-update to 11.1.0)  - First fatal error 4 seconds later:  PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 528384 bytes)  in wp-includes/class-wp-hook.php on line 340  - From then on, virtually every subsequent front-end and wp-admin request fatal errored (1,800+ occurrences in a few hours), most consistently:  PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 262144 bytes)  in wp-content/plugins/woocommerce/src/Internal/Features/FeaturesController.php on line 294    with related fatals also seen in wp-includes/plugin.php, wp-includes/option.php, wp-content/object-cache.php, and    woocommerce/includes/tracks/class-wc-site-tracking.php.  Not request-specific — reproducible via WP-CLI bootstrap alone  Even a plain wp plugin install ... --force (no HTTP request involved) triggered the same runaway growth and got OOM-killed by the kernel  (confirmed via dmesg: Out of memory: Killed process ... (php) ... anon-rss:3026440kB) simply from bootstrapping WordPress with WooCommerce  11.1.0 active. Using --skip-plugins (which prevents WC from loading during bootstrap) avoided the issue, confirming the leak triggers during  WooCommerce's normal plugin-load path, not a specific endpoint.
       ```
   
    -  This reply was modified 13 hours, 42 minutes ago by [alexp12](https://wordpress.org/support/users/alexp12/).

Viewing 2 replies - 1 through 2 (of 2 total)