| @@ -257,12 +257,8 @@ | ||
| 257 | 257 | 'seo_analytics_google_analytics_property_id', |
| 258 | 258 | 'ga_analytics_account_id', |
| 259 | 259 | 'ga_analytics_data_stream_id', |
| 260 | 260 | |
| 261 | - // GA4 Tracking Code Injection (Pro) | |
| 262 | - 'ga4_auto_inject', | |
| 263 | - 'ga4_measurement_id', | |
| 264 | - | |
| 265 | 261 | // Search Console configuration |
| 266 | 262 | 'search_console_property', |
| 267 | 263 | |
| 268 | 264 | // AI features |
| @@ -836,11 +832,15 @@ | ||
| 836 | 832 | } |
| 837 | 833 | break; |
| 838 | 834 | |
| 839 | 835 | case 'ai_provider': |
| 840 | - if (!in_array($value, ['openai', 'claude', 'gemini', 'openrouter'], true)) { | |
| 836 | + // '' is legal: it is Settings::AI_PROVIDER_NONE, the state a | |
| 837 | + // fresh install starts in and the one a user returns to by | |
| 838 | + // deselecting their provider (#572). | |
| 839 | + if (!in_array($value, \ThinkRank\Core\Settings::selectable_ai_providers(), true)) { | |
| 841 | 840 | $validation['valid'] = false; |
| 842 | - $validation['errors'][] = "ai_provider must be 'openai', 'claude', 'gemini', or 'openrouter'"; | |
| 841 | + $validation['errors'][] = "ai_provider must be empty (no provider) or one of: " | |
| 842 | + . implode(', ', \ThinkRank\Core\Settings::SUPPORTED_AI_PROVIDERS); | |
| 843 | 843 | } |
| 844 | 844 | break; |
| 845 | 845 | |
| 846 | 846 | case 'dashboard_widgets': |