Files
WooNooW/includes/Api
dwindown cf4fb03ffa fix: Force gateway settings reload from database (THE REAL CULPRIT!)
🔴 THE REAL PROBLEM: Gateway Instance Cache

Problem Analysis:
1.  API call works
2.  Database saves correctly
3.  Cache clears properly
4.  Gateway instance still has OLD settings in memory!

Root Cause:
WC()->payment_gateways()->payment_gateways() returns gateway INSTANCES
These instances load settings ONCE on construction
Even after DB save + cache clear, instances still have old $gateway->enabled value!

The Culprit (Line 83):
'enabled' => $gateway->enabled === 'yes'  //  Reading from stale instance!

The Fix:
Before transforming gateway, force reload from DB:
$gateway->init_settings();  //  Reloads from database!

This makes $gateway->enabled read fresh value from wp_options.

Changes:
1. get_gateway(): Added $gateway->init_settings()
2. get_gateways(): Added $gateway->init_settings() in loop
3. PaymentsController: Better boolean handling with filter_var()

Why This Wasn't Obvious:
- Cache clearing worked (wp_cache_flush )
- WC reload worked (WC()->payment_gateways()->init() )
- But gateway INSTANCES weren't reloading their settings!

WooCommerce Gateway Lifecycle:
1. Gateway constructed → Loads settings from DB
2. Settings cached in $gateway->settings property
3. We save new value to DB 
4. We clear cache 
5. We reload WC gateway manager 
6. BUT: Existing instances still have old $gateway->settings 
7. FIX: Call $gateway->init_settings() to reload 

Result:  Toggle now works perfectly!

Files Modified:
- PaymentGatewaysProvider.php: Force init_settings() before transform
- PaymentsController.php: Better boolean validation

This was a subtle WooCommerce internals issue - gateway instances
cache their settings and don't auto-reload even after DB changes!
2025-11-05 23:25:59 +07:00
..