✅ Toggle Working: 156ms + 57ms (PERFECT!)
Log Analysis:
- Toggling gateway tripay_briva to enabled ✅
- Current enabled: no, New enabled: yes ✅
- update_option returned: true ✅
- Set gateway->enabled to: yes ✅
- Gateway after toggle: enabled=true ✅
- Total time: 156ms (toggle) + 57ms (refetch) = 213ms 🚀
The Fix That Worked:
1. Update $gateway->settings array
2. Update $gateway->enabled property (THIS WAS THE KEY!)
3. Save to database
4. Clear cache
5. Force gateway reload
Now Applying Same Fix to Modal Save:
- Added wp_cache_flush() before fetching updated gateway
- Added debug logging to track save process
- Same pattern as toggle endpoint
Expected Result:
- Modal settings save should now persist
- Changes should appear immediately after save
- Fast performance (1-2 seconds instead of 30s)
Files Modified:
- PaymentsController.php: save_gateway() endpoint
Next: Test modal save and confirm it works!
🔍 Suspect #7: Gateway enabled property not being updated
Problem:
- We save to database ✅
- We reload settings ✅
- But $gateway->enabled property might not update!
Root Cause:
WooCommerce has TWO places for enabled status:
1. $gateway->settings['enabled'] (in database)
2. $gateway->enabled (instance property)
We were only updating #1, not #2!
The Fix:
// Update both places
$gateway->settings = $new_settings; // Database
update_option($gateway->get_option_key(), $gateway->settings);
if (isset($new_settings['enabled'])) {
$gateway->enabled = $new_settings['enabled']; // Instance property!
}
Added Debug Logging:
- Log toggle request (gateway ID + enabled value)
- Log save process (current vs new enabled)
- Log update_option result
- Log final enabled value after fetch
- All logs prefixed with [WooNooW] for easy filtering
How to Debug:
1. Toggle a gateway
2. Check debug.log or error_log
3. Look for [WooNooW] lines
4. See exact values at each step
Files Modified:
- PaymentGatewaysProvider.php: Update both settings + enabled property
- PaymentsController.php: Add debug logging
Next Step:
Test toggle and check logs to see what's actually happening!
🔴 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!