🔍 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!
✅ StoreSettingsProvider.php:
- get_countries() - All WooCommerce countries
- get_timezones() - All PHP timezones with UTC offsets
- get_currencies() - All WooCommerce currencies with symbols
- get_settings() - Current store settings
- save_settings() - Save store settings
✅ StoreController.php:
- GET /woonoow/v1/store/settings
- POST /woonoow/v1/store/settings
- GET /woonoow/v1/store/countries (200+ countries)
- GET /woonoow/v1/store/timezones (400+ timezones)
- GET /woonoow/v1/store/currencies (100+ currencies)
- Response caching (1 hour for static data)
🔌 Integration:
- Registered in Api/Routes.php
- Permission checks (manage_woocommerce)
- Error handling
Next: Update Store.tsx to use real API