Forum Replies Created

Viewing 2 replies - 1 through 2 (of 2 total)
  • Thread Starter alexp12

    (@alexp12)

    Solved, this was the root cause:


    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:



      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.

    Woocommerce 11.1.0 also broke my site entirely, had to downgrade to 11.0.1

    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 12 hours, 15 minutes ago by alexp12.
Viewing 2 replies - 1 through 2 (of 2 total)